UNPKG

@orchestrator-ui/orchestrator-ui-components

Version:

Library of UI Components used to display the workflow orchestrator frontend

132 lines (121 loc) 4.21 kB
import { ProductDefinition, ProductLifecycleStatus, StartOptionsResult, WorkflowDefinition, WorkflowTarget, } from '@/types'; import { orchestratorApi } from '../api'; const workflowOptionsQuery = ` query StartOptions { workflows(first: 1000000, after: 0, filterBy: [{ field: "target", value: "${WorkflowTarget.CREATE}"}]) { page { name isAllowed products { productType productId name tag status } } } } `; const taskOptionsQuery = ` query StartOptions { workflows(first: 1000000, after: 0, filterBy: [{ field: "isTask", value: "true"}]) { page { name isAllowed description } } } `; type WorkflowOption = { workflowName: WorkflowDefinition['name']; isAllowed: WorkflowDefinition['isAllowed']; productName: ProductDefinition['name']; productId: ProductDefinition['productId']; productType: ProductDefinition['productType']; productTag: ProductDefinition['tag']; }; type WorkflowOptionsResult = StartOptionsResult<{ name: WorkflowDefinition['name']; isAllowed: WorkflowDefinition['isAllowed']; products: { name: ProductDefinition['name']; productId: ProductDefinition['productId']; productType: ProductDefinition['productType']; tag: ProductDefinition['tag']; status: ProductDefinition['status']; }[]; }>; export type StartOptionsResponse<StartOption> = { startOptions: StartOption[]; }; type TaskOption = Pick< WorkflowDefinition, 'name' | 'isAllowed' | 'description' >; type TaskOptionsResult = StartOptionsResult<TaskOption>; const startButtonOptionsApi = orchestratorApi.injectEndpoints({ endpoints: (build) => ({ getWorkflowOptions: build.query< StartOptionsResponse<WorkflowOption>, ProductLifecycleStatus | string >({ query: () => ({ document: workflowOptionsQuery, }), transformResponse: ( response: WorkflowOptionsResult | undefined, _, productStatus, ) => { const statusToMatch = ( productStatus ?? ProductLifecycleStatus.ACTIVE ).toLowerCase(); const startOptions: WorkflowOption[] = []; const workflows = response?.workflows?.page || []; workflows.forEach((workflow) => { const workflowName = workflow.name; workflow.products .filter( (product) => product.status.toLowerCase() === statusToMatch, ) .forEach((product) => { startOptions.push({ workflowName, isAllowed: workflow.isAllowed, productName: product.name, productId: product.productId, productType: product.productType, productTag: product.tag, }); }); }); return { startOptions }; }, }), getTaskOptions: build.query<StartOptionsResponse<TaskOption>, void>({ query: () => ({ document: taskOptionsQuery, }), transformResponse: (response: TaskOptionsResult) => { return { startOptions: response.workflows.page.map((option) => ({ name: option.name, isAllowed: option.isAllowed, description: option.description, })), }; }, }), }), }); export const { useGetWorkflowOptionsQuery, useGetTaskOptionsQuery } = startButtonOptionsApi;