diff --git a/client/src/app/Paths.ts b/client/src/app/Paths.ts index b9559ad89d..f40b056445 100644 --- a/client/src/app/Paths.ts +++ b/client/src/app/Paths.ts @@ -41,10 +41,7 @@ export const DevPaths = { dependencies: "/dependencies", tasks: "/tasks", - taskDetails: "/tasks/:taskId", - /*bread - applicationsTabTaskDetails: "/applications/:taskId", - */ + taskDetails: "/tasks/:taskId/:isFApplication", taskDetailsAttachment: "/tasks/:taskId/attachments/:attachmentId", } as const; @@ -112,3 +109,6 @@ export interface TaskDetailsAttachmentRoute { taskId: string; attachmentId: string; } +export interface TaskFromApp { + isFApplication: string; +} diff --git a/client/src/app/components/task-manager/TaskManagerDrawer.tsx b/client/src/app/components/task-manager/TaskManagerDrawer.tsx index 10824bc16e..21bba41fd3 100644 --- a/client/src/app/components/task-manager/TaskManagerDrawer.tsx +++ b/client/src/app/components/task-manager/TaskManagerDrawer.tsx @@ -163,7 +163,8 @@ const TaskItem: React.FC<{ : `${task.id} (${task.addon}) - ${task.applicationName} - ${ task.priority ?? 0 }`; - const taskActionItems = useTaskActions(task._); + + const taskActionItems = useTaskActions(task._, false); return ( { isActiveItemEnabled: true, persistTo: { activeItem: "urlParams", - tabKey: "urlParams", filter: "urlParams", pagination: "sessionStorage", sort: "sessionStorage", diff --git a/client/src/app/pages/applications/components/application-detail-drawer/application-detail-drawer.tsx b/client/src/app/pages/applications/components/application-detail-drawer/application-detail-drawer.tsx index 1e6536820d..271a641ed8 100644 --- a/client/src/app/pages/applications/components/application-detail-drawer/application-detail-drawer.tsx +++ b/client/src/app/pages/applications/components/application-detail-drawer/application-detail-drawer.tsx @@ -65,13 +65,7 @@ import { useFetchArchetypes } from "@app/queries/archetypes"; import { useFetchAssessments } from "@app/queries/assessments"; import { DecoratedApplication } from "../../applications-table/useDecoratedApplications"; import { TaskStates } from "@app/queries/tasks"; -//for tasks table -import { - PageSection, - Toolbar, - ToolbarContent, - ToolbarItem, -} from "@patternfly/react-core"; +import { Toolbar, ToolbarContent, ToolbarItem } from "@patternfly/react-core"; import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table"; import { useTableControlState, @@ -86,9 +80,12 @@ import { } from "@app/hooks/table-controls"; import { useSelectionState } from "@migtools/lib-ui"; import { TablePersistenceKeyPrefix } from "@app/Constants"; -import { useSharedAffectedApplicationFilterCategories } from "../../../issues/helpers"; -//for the icon import { TaskActionColumn } from "../../../../pages/tasks/TaskActionColumn"; +import { + ConditionalTableBody, + TableHeaderContentWithControls, + TableRowContentWithControls, +} from "@app/components/TableControls"; export interface IApplicationDetailDrawerProps extends Pick { @@ -180,9 +177,9 @@ export const ApplicationDetailDrawer: React.FC< {!application ? null : ( {t("terms.Tasks")}} + title={{t("terms.tasks")}} > - + )} @@ -555,21 +552,18 @@ const TabReportsContent: React.FC<{ ); }; -const TabTasksContent: React.FC<{}> = () => { - const { t } = useTranslation(); - //path - +const TabTasksContent: React.FC<{ application: DecoratedApplication }> = ({ + application, +}) => { const isFApplication = true; - const allAffectedApplicationsFilterCategories = - useSharedAffectedApplicationFilterCategories(); - + const { t } = useTranslation(); + const history = useHistory(); const urlParams = new URLSearchParams(window.location.search); const filters = urlParams.get("filters"); const deserializedFilterValues = deserializeFilterUrlParams({ filters }); - const tableControlState = useTableControlState({ - tableName: "tasks-table", + tableName: "tasks-apps-table", persistTo: "urlParams", persistenceKeyPrefix: TablePersistenceKeyPrefix.tasks, columnNames: { @@ -577,63 +571,75 @@ const TabTasksContent: React.FC<{}> = () => { taskKind: "Task Kind", status: "Status", priority: "Priority", - action: "action", }, - initialFilterValues: deserializedFilterValues, isFilterEnabled: true, isSortEnabled: true, isPaginationEnabled: true, - initialItemsPerPage: 10, sortableColumns: ["taskId", "taskKind", "status", "priority"], initialSort: { columnKey: "taskId", direction: "asc" }, + initialFilterValues: deserializedFilterValues, filterCategories: [ - ...allAffectedApplicationsFilterCategories, { - categoryKey: "taskId", - title: t("Task ID"), - type: FilterType.search, - filterGroup: "Task", - placeholderText: t("Filter by Task ID"), - getServerFilterValue: (value) => (value ? [`*${value[0]}*`] : []), + categoryKey: "id", + title: "ID", + type: FilterType.numsearch, + placeholderText: t("actions.filterBy", { + what: "ID...", + }), + getServerFilterValue: (value) => { + console.log("this id:", value); + return value ? value : []; + }, }, { - categoryKey: "taskKind", - title: t("Task Kind"), + categoryKey: "kind", + title: t("terms.kind"), type: FilterType.search, - filterGroup: "Task", - placeholderText: t("Filter by Task Kind"), + placeholderText: t("actions.filterBy", { + what: t("terms.kind") + "...", + }), getServerFilterValue: (value) => (value ? [`*${value[0]}*`] : []), }, { - categoryKey: "status", - title: t("Status"), + categoryKey: "state", + title: t("terms.status"), type: FilterType.search, - filterGroup: "Task", - placeholderText: t("Filter by Status"), + placeholderText: t("actions.filterBy", { + what: t("terms.status") + "...", + }), getServerFilterValue: (value) => (value ? [`*${value[0]}*`] : []), }, ], + initialItemsPerPage: 10, }); const { - result: { data: currentPageItems, total: totalItemCount }, + result: { data: currentPageItems = [], total: totalItemCount }, isFetching, + fetchError, } = useServerTasks( getHubRequestParams({ ...tableControlState, hubSortFieldKeys: { - taskId: "taskId", - taskKind: "taskKind", + taskId: "id", + taskKind: "kind", status: "status", priority: "priority", }, - }) + implicitFilters: [ + { + field: "application.id", + operator: "=", + value: application.id, + }, + ], + }), + 5000 ); - const tableControls = useTableControlProps({ - ...tableControlState, // Includes filterState, sortState and paginationState + ...tableControlState, idProperty: "id", - currentPageItems, + currentPageItems: currentPageItems, totalItemCount, isLoading: isFetching, selectionState: useSelectionState({ @@ -643,88 +649,123 @@ const TabTasksContent: React.FC<{}> = () => { }); const { + numRenderedColumns, propHelpers: { toolbarProps, filterToolbarProps, + paginationToolbarItemProps, paginationProps, tableProps, getThProps, - getTdProps, getTrProps, + getTdProps, }, } = tableControls; - const history = useHistory(); - const clearFilters = () => { const currentPath = history.location.pathname; const newSearch = new URLSearchParams(history.location.search); newSearch.delete("filters"); history.push(`${currentPath}`); }; - return ( <> - - - - - - - - + + + + + + + + + + + +
+ + + - - - - - - - - - - - - - + + + + + - {currentPageItems?.map((task) => ( + {currentPageItems?.map((task, rowIndex) => ( - - - - {/*check if state=status*/} - - + + + + + + ))} -
{t("Task ID")} - {t("Task Kind")} - {t("Status")} - {t("Priority")} -
{task.id}{task.kind}{task.state} - {task.priority} - - {" "} - + {task.id} + + {task.kind} + + {task.state} + + {task.priority || 0} + + +
- - - + +
+ ); }; diff --git a/client/src/app/pages/tasks/TaskActionColumn.tsx b/client/src/app/pages/tasks/TaskActionColumn.tsx index c55d9a737e..7ad4006ded 100644 --- a/client/src/app/pages/tasks/TaskActionColumn.tsx +++ b/client/src/app/pages/tasks/TaskActionColumn.tsx @@ -3,13 +3,8 @@ import React, { FC } from "react"; import { Task } from "@app/api/models"; import { ActionsColumn } from "@patternfly/react-table"; import { useTaskActions } from "./useTaskActions"; -//path -export interface TaskActionColumnProps { - task: Task; - isFApplication: boolean; -} -export const TaskActionColumn: FC = ({ +export const TaskActionColumn: FC<{ task: Task; isFApplication: boolean }> = ({ task, isFApplication, }) => { diff --git a/client/src/app/pages/tasks/TaskDetails.tsx b/client/src/app/pages/tasks/TaskDetails.tsx index 7273c14503..b370853fe3 100644 --- a/client/src/app/pages/tasks/TaskDetails.tsx +++ b/client/src/app/pages/tasks/TaskDetails.tsx @@ -2,41 +2,47 @@ import React from "react"; import { useParams } from "react-router-dom"; import { useTranslation } from "react-i18next"; -import { Paths, TaskDetailsAttachmentRoute } from "@app/Paths"; +import { Paths, TaskDetailsAttachmentRoute, TaskFromApp } from "@app/Paths"; import "@app/components/simple-document-viewer/SimpleDocumentViewer.css"; import { formatPath } from "@app/utils/utils"; import { TaskDetailsBase } from "./TaskDetailsBase"; -//path -import { TaskActionColumnProps } from "./TaskActionColumn"; -//path -import { useFetchApplicationById } from "@app/queries/applications"; -import { AnalysisDetailsAttachmentRoute } from "@app/Paths"; -import { TabKey } from "../applications/components/application-detail-drawer/application-detail-drawer"; +import { getTaskById } from "@app/api/rest"; +import { useState, useEffect } from "react"; -const { applicationId } = useParams(); -const detailsPath = formatPath(Paths.applicationsAnalysisDetails, { - applicationId: applicationId, -}); -const { application } = useFetchApplicationById(applicationId); - -export const TaskDetails = (isFApplication: TaskActionColumnProps) => { +export const TaskDetails = () => { const { t } = useTranslation(); - /*bread*/ - const appName: string = application?.name ?? t("terms.unknown"); - const { taskId, attachmentId } = useParams(); + const { isFApplication } = useParams(); + const result = isFApplication === "true" ? true : false; + const [applicationName, setApplicationName] = useState(); + const [applicationId, setApplicationId] = useState(); + + useEffect(() => { + const currentTask = getTaskById(Number(taskId)); + currentTask + .then((task) => { + setApplicationName(task.application?.name); + setApplicationId(task.application?.id); + }) + .catch((error) => { + console.error("Error fetching task:", error); + }); + }, [taskId]); + const appName: string = applicationName ?? t("terms.unknown"); + console.log(appName); const detailsPath = formatPath(Paths.taskDetails, { taskId }); + return ( { /> ); }; - export default TaskDetails; diff --git a/client/src/app/pages/tasks/tasks-page.tsx b/client/src/app/pages/tasks/tasks-page.tsx index 771c6dad2f..ba47a123e8 100644 --- a/client/src/app/pages/tasks/tasks-page.tsx +++ b/client/src/app/pages/tasks/tasks-page.tsx @@ -71,7 +71,7 @@ export const TasksPage: React.FC = () => { const urlParams = new URLSearchParams(window.location.search); const filters = urlParams.get("filters") ?? ""; - + const isFApplication = false; const deserializedFilterValues = deserializeFilterUrlParams({ filters }); const tableControlState = useTableControlState({ @@ -265,10 +265,6 @@ export const TasksPage: React.FC = () => { : "", }); - //path - - const isFApplication = false; - return ( <> diff --git a/client/src/app/pages/tasks/useTaskActions.tsx b/client/src/app/pages/tasks/useTaskActions.tsx index bdbb839bf5..608c9bfeca 100644 --- a/client/src/app/pages/tasks/useTaskActions.tsx +++ b/client/src/app/pages/tasks/useTaskActions.tsx @@ -10,7 +10,6 @@ import { useTranslation } from "react-i18next"; import { useHistory } from "react-router-dom"; import { formatPath } from "@app/utils/utils"; import { Paths } from "@app/Paths"; -/*breadcrumbs*/ const canCancel = (state: TaskState = "No task") => !["Succeeded", "Failed", "Canceled"].includes(state); @@ -61,8 +60,8 @@ const useAsyncTaskActions = () => { return { cancelTask, togglePreemption }; }; -//? -export const useTaskActions = (task: Task, isFApplication?: boolean) => { + +export const useTaskActions = (task: Task, isFApplication: boolean) => { const { cancelTask, togglePreemption } = useAsyncTaskActions(); const { t } = useTranslation(); const history = useHistory(); @@ -86,21 +85,9 @@ export const useTaskActions = (task: Task, isFApplication?: boolean) => { history.push( formatPath(Paths.taskDetails, { taskId: task.id, + isFApplication: isFApplication, }) ), }, - // { - // title:t("actions.taskDetails"), - // onClick: () => { - // /* we check if drawer open*/ - // history.push( - // formatPath( - // isFApplication ? Paths.applicationsTabTaskDetails : Paths.taskDetails, - // { taskId: task.id } - // ) - // ); - - // }, - // }, ]; };