diff --git a/apps/workflows-dashboard/src/components/organisms/Header/header-navigation-links.ts b/apps/workflows-dashboard/src/components/organisms/Header/header-navigation-links.ts
index cb24f3f46d..2ed6924140 100644
--- a/apps/workflows-dashboard/src/components/organisms/Header/header-navigation-links.ts
+++ b/apps/workflows-dashboard/src/components/organisms/Header/header-navigation-links.ts
@@ -9,4 +9,20 @@ export const headerNavigationLinks: NavigationLink[] = [
path: '/workflows',
label: 'Workflows',
},
+ {
+ path: '/workflow-definitions',
+ label: 'Workflow Definitions',
+ },
+ {
+ path: '/filters',
+ label: 'Filters',
+ },
+ {
+ path: '/ui-definitions',
+ label: 'UI Definitions',
+ },
+ {
+ path: '/alert-definitions',
+ label: 'Alerts Definitions',
+ },
];
diff --git a/apps/workflows-dashboard/src/components/organisms/JsonEditor/JsonEditor.tsx b/apps/workflows-dashboard/src/components/organisms/JsonEditor/JsonEditor.tsx
new file mode 100644
index 0000000000..7380161aaf
--- /dev/null
+++ b/apps/workflows-dashboard/src/components/organisms/JsonEditor/JsonEditor.tsx
@@ -0,0 +1,44 @@
+import JSONEditor from 'jsoneditor';
+import 'jsoneditor/dist/jsoneditor.css';
+import { FunctionComponent, useEffect, useRef } from 'react';
+
+interface IJSONEditorProps {
+ value: object;
+ readOnly?: boolean;
+ onChange?: (value: object) => void;
+}
+
+export const JSONEditorComponent: FunctionComponent
= ({
+ value,
+ readOnly,
+ onChange,
+}) => {
+ const containerRef = useRef(null);
+ const editorRef = useRef(null);
+
+ useEffect(() => {
+ if (!containerRef.current) return;
+ if (editorRef.current) return;
+
+ editorRef.current = new JSONEditor(containerRef.current!, {
+ onChange: () => {
+ editorRef.current && onChange && onChange(editorRef.current.get());
+ },
+ });
+ }, [containerRef, editorRef]);
+
+ useEffect(() => {
+ if (!editorRef.current) return;
+
+ //TODO: Each set of value rerenders editor and loses focus, find workarounds
+ editorRef.current.set(value);
+ }, [editorRef]);
+
+ useEffect(() => {
+ if (!editorRef.current) return;
+
+ editorRef.current.setMode(readOnly ? 'view' : 'code');
+ }, [readOnly]);
+
+ return ;
+};
diff --git a/apps/workflows-dashboard/src/components/organisms/JsonEditor/index.ts b/apps/workflows-dashboard/src/components/organisms/JsonEditor/index.ts
new file mode 100644
index 0000000000..2f9b756ffa
--- /dev/null
+++ b/apps/workflows-dashboard/src/components/organisms/JsonEditor/index.ts
@@ -0,0 +1 @@
+export * from './JsonEditor';
diff --git a/apps/workflows-dashboard/src/components/organisms/XstateVisualizer/XstateVisualizer.tsx b/apps/workflows-dashboard/src/components/organisms/XstateVisualizer/XstateVisualizer.tsx
index e3994f0e32..47365ad0ee 100644
--- a/apps/workflows-dashboard/src/components/organisms/XstateVisualizer/XstateVisualizer.tsx
+++ b/apps/workflows-dashboard/src/components/organisms/XstateVisualizer/XstateVisualizer.tsx
@@ -1,8 +1,8 @@
-import { memo, useLayoutEffect, useMemo, useRef } from 'react';
+import { deserializeStateDefinition } from '@/components/organisms/XstateVisualizer/utils/deserialize-state-definition';
import { inspect } from '@xstate/inspect';
-import { createMachine } from 'xstate';
import { useInterpret, useMachine } from '@xstate/react';
-import { deserializeStateDefinition } from '@/components/organisms/XstateVisualizer/utils/deserialize-state-definition';
+import { memo, useLayoutEffect, useMemo, useRef } from 'react';
+import { createMachine } from 'xstate';
interface Props {
stateDefinition: Record;
diff --git a/apps/workflows-dashboard/src/components/providers/FiltersProvider/FiltersProvider.tsx b/apps/workflows-dashboard/src/components/providers/FiltersProvider/FiltersProvider.tsx
new file mode 100644
index 0000000000..61d8b046b0
--- /dev/null
+++ b/apps/workflows-dashboard/src/components/providers/FiltersProvider/FiltersProvider.tsx
@@ -0,0 +1,36 @@
+import { filtersContext } from '@/components/providers/FiltersProvider/filters-provider.context';
+import { FiltersContext } from '@/components/providers/FiltersProvider/filters-provider.types';
+
+import { useCallback, useMemo } from 'react';
+import { QueryParamConfig, useQueryParams } from 'use-query-params';
+
+const { Provider } = filtersContext;
+
+export interface IFilterProviderProps {
+ children: React.ReactNode | React.ReactNode[];
+ querySchema: Record>;
+ deserializer?: (queryValues: any) => TFilterValues;
+}
+
+export const FiltersProvider = ({ children, querySchema, deserializer }: IFilterProviderProps) => {
+ const [query, setQuery] = useQueryParams(querySchema);
+ const filterValues = useMemo(() => (deserializer ? deserializer(query) : query), [query]);
+
+ const updateFilters = useCallback(
+ (filters: Partial) => {
+ setQuery(filters);
+ },
+ [setQuery],
+ );
+
+ const context = useMemo(() => {
+ const ctx: FiltersContext = {
+ filters: filterValues,
+ updateFilters,
+ };
+
+ return ctx;
+ }, [filterValues, updateFilters]);
+
+ return {children};
+};
diff --git a/apps/workflows-dashboard/src/components/providers/FiltersProvider/filters-provider.context.ts b/apps/workflows-dashboard/src/components/providers/FiltersProvider/filters-provider.context.ts
new file mode 100644
index 0000000000..e24bdbd560
--- /dev/null
+++ b/apps/workflows-dashboard/src/components/providers/FiltersProvider/filters-provider.context.ts
@@ -0,0 +1,4 @@
+import { FiltersContext } from '@/components/providers/FiltersProvider/filters-provider.types';
+import { createContext } from 'react';
+
+export const filtersContext = createContext({} as FiltersContext);
diff --git a/apps/workflows-dashboard/src/components/providers/FiltersProvider/filters-provider.types.ts b/apps/workflows-dashboard/src/components/providers/FiltersProvider/filters-provider.types.ts
new file mode 100644
index 0000000000..ee113baedf
--- /dev/null
+++ b/apps/workflows-dashboard/src/components/providers/FiltersProvider/filters-provider.types.ts
@@ -0,0 +1,6 @@
+export type FiltersUpdater = (filters: Partial) => void;
+
+export interface FiltersContext {
+ filters: TFilterValues;
+ updateFilters: FiltersUpdater;
+}
diff --git a/apps/workflows-dashboard/src/components/providers/FiltersProvider/hocs/withFilters/index.ts b/apps/workflows-dashboard/src/components/providers/FiltersProvider/hocs/withFilters/index.ts
new file mode 100644
index 0000000000..1eecba58dc
--- /dev/null
+++ b/apps/workflows-dashboard/src/components/providers/FiltersProvider/hocs/withFilters/index.ts
@@ -0,0 +1 @@
+export * from './withFilters';
diff --git a/apps/workflows-dashboard/src/components/providers/FiltersProvider/hocs/withFilters/types.ts b/apps/workflows-dashboard/src/components/providers/FiltersProvider/hocs/withFilters/types.ts
new file mode 100644
index 0000000000..1d41d50999
--- /dev/null
+++ b/apps/workflows-dashboard/src/components/providers/FiltersProvider/hocs/withFilters/types.ts
@@ -0,0 +1,6 @@
+import { FiltersUpdater } from '@/components/providers/FiltersProvider/filters-provider.types';
+
+export interface FiltersProps {
+ filters: TFilterValues;
+ updateFilters: FiltersUpdater;
+}
diff --git a/apps/workflows-dashboard/src/components/providers/FiltersProvider/hocs/withFilters/withFilters.tsx b/apps/workflows-dashboard/src/components/providers/FiltersProvider/hocs/withFilters/withFilters.tsx
new file mode 100644
index 0000000000..faf0358d84
--- /dev/null
+++ b/apps/workflows-dashboard/src/components/providers/FiltersProvider/hocs/withFilters/withFilters.tsx
@@ -0,0 +1,36 @@
+import {
+ FiltersProvider,
+ IFilterProviderProps,
+} from '@/components/providers/FiltersProvider/FiltersProvider';
+import { FiltersProps } from '@/components/providers/FiltersProvider/hocs/withFilters/types';
+import { useFilters } from '@/components/providers/FiltersProvider/hooks/useFilters';
+
+type InputComponentProps = Omit;
+
+export interface WithFiltersHocParams
+ extends Pick, 'deserializer' | 'querySchema'> {}
+
+export function withFilters(
+ Component: React.FunctionComponent,
+ params: WithFiltersHocParams,
+): React.FunctionComponent> {
+ function Wrapper(props: InputComponentProps) {
+ return (
+
+
+
+ );
+ }
+
+ function ContextProvider(props: InputComponentProps) {
+ const context = useFilters();
+
+ return ;
+ }
+
+ ContextProvider.displayName = 'withFilters(ContextConsumer)';
+
+ Wrapper.displayName = `withFilters(${Component.displayName})`;
+
+ return Wrapper;
+}
diff --git a/apps/workflows-dashboard/src/components/providers/FiltersProvider/hooks/useFilters/index.ts b/apps/workflows-dashboard/src/components/providers/FiltersProvider/hooks/useFilters/index.ts
new file mode 100644
index 0000000000..d2e6c7a474
--- /dev/null
+++ b/apps/workflows-dashboard/src/components/providers/FiltersProvider/hooks/useFilters/index.ts
@@ -0,0 +1 @@
+export * from './useFilters';
diff --git a/apps/workflows-dashboard/src/components/providers/FiltersProvider/hooks/useFilters/useFilters.ts b/apps/workflows-dashboard/src/components/providers/FiltersProvider/hooks/useFilters/useFilters.ts
new file mode 100644
index 0000000000..e4ee112a05
--- /dev/null
+++ b/apps/workflows-dashboard/src/components/providers/FiltersProvider/hooks/useFilters/useFilters.ts
@@ -0,0 +1,6 @@
+import { filtersContext } from '@/components/providers/FiltersProvider/filters-provider.context';
+import { FiltersContext } from '@/components/providers/FiltersProvider/filters-provider.types';
+import { Context, useContext } from 'react';
+
+export const useFilters = () =>
+ useContext(filtersContext as unknown as Context>);
diff --git a/apps/workflows-dashboard/src/domains/alert-definitions/alert-definitions.api.ts b/apps/workflows-dashboard/src/domains/alert-definitions/alert-definitions.api.ts
new file mode 100644
index 0000000000..45a0d6bce1
--- /dev/null
+++ b/apps/workflows-dashboard/src/domains/alert-definitions/alert-definitions.api.ts
@@ -0,0 +1,8 @@
+import { IAlertDefinition } from '@/domains/alert-definitions/alert-definitions.types';
+import { request } from '@/lib/request';
+
+export const fetchAlertDefinitionsList = async () => {
+ const result = await request.get('/external/alert-definition');
+
+ return result.data;
+};
diff --git a/apps/workflows-dashboard/src/domains/alert-definitions/alert-definitions.types.ts b/apps/workflows-dashboard/src/domains/alert-definitions/alert-definitions.types.ts
new file mode 100644
index 0000000000..c69a2246bf
--- /dev/null
+++ b/apps/workflows-dashboard/src/domains/alert-definitions/alert-definitions.types.ts
@@ -0,0 +1,14 @@
+export interface IAlertDefinition {
+ id: string;
+ name: string;
+ enabled: boolean;
+ description: string;
+ rulesetId: string;
+ ruleId: string;
+ inlineRule: object;
+ config: object;
+ defaultSeverity: number;
+ tags: object;
+ additionalInfo: object;
+ createdAt: string;
+}
diff --git a/apps/workflows-dashboard/src/domains/alert-definitions/index.ts b/apps/workflows-dashboard/src/domains/alert-definitions/index.ts
new file mode 100644
index 0000000000..8c1eb1470b
--- /dev/null
+++ b/apps/workflows-dashboard/src/domains/alert-definitions/index.ts
@@ -0,0 +1,3 @@
+export * from './alert-definitions.api';
+export * from './alert-definitions.types';
+export * from './query-keys';
diff --git a/apps/workflows-dashboard/src/domains/alert-definitions/query-keys.ts b/apps/workflows-dashboard/src/domains/alert-definitions/query-keys.ts
new file mode 100644
index 0000000000..731383b838
--- /dev/null
+++ b/apps/workflows-dashboard/src/domains/alert-definitions/query-keys.ts
@@ -0,0 +1,9 @@
+import { fetchAlertDefinitionsList } from '@/domains/alert-definitions/alert-definitions.api';
+import { createQueryKeys } from '@lukemorales/query-key-factory';
+
+export const alertDefinitionsQueryKeys = createQueryKeys('alertDefinitions', {
+ list: () => ({
+ queryKey: [{}],
+ queryFn: () => fetchAlertDefinitionsList(),
+ }),
+});
diff --git a/apps/workflows-dashboard/src/domains/filters/filters.api.ts b/apps/workflows-dashboard/src/domains/filters/filters.api.ts
new file mode 100644
index 0000000000..a31129269f
--- /dev/null
+++ b/apps/workflows-dashboard/src/domains/filters/filters.api.ts
@@ -0,0 +1,10 @@
+import { GetFiltersListDto, GetFiltersResponse } from '@/domains/filters/filters.types';
+import { request } from '@/lib/request';
+
+export const fetchFiltersList = async (query: GetFiltersListDto) => {
+ const result = await request.get('/external/filters', {
+ params: query,
+ });
+
+ return result.data;
+};
diff --git a/apps/workflows-dashboard/src/domains/filters/filters.types.ts b/apps/workflows-dashboard/src/domains/filters/filters.types.ts
new file mode 100644
index 0000000000..d88c05e5e1
--- /dev/null
+++ b/apps/workflows-dashboard/src/domains/filters/filters.types.ts
@@ -0,0 +1,20 @@
+export interface IFilter {
+ id: string;
+ name: string;
+ entity: string;
+ query: object;
+ createdAt: string;
+}
+
+export interface GetFiltersListDto {
+ page: number;
+ limit: number;
+}
+
+export interface GetFiltersResponse {
+ items: IFilter[];
+ meta: {
+ total: number;
+ pages: number;
+ };
+}
diff --git a/apps/workflows-dashboard/src/domains/filters/index.ts b/apps/workflows-dashboard/src/domains/filters/index.ts
new file mode 100644
index 0000000000..434db6b142
--- /dev/null
+++ b/apps/workflows-dashboard/src/domains/filters/index.ts
@@ -0,0 +1,3 @@
+export * from './filters.api';
+export * from './filters.types';
+export * from './query-keys';
diff --git a/apps/workflows-dashboard/src/domains/filters/query-keys.ts b/apps/workflows-dashboard/src/domains/filters/query-keys.ts
new file mode 100644
index 0000000000..dc34a06fdc
--- /dev/null
+++ b/apps/workflows-dashboard/src/domains/filters/query-keys.ts
@@ -0,0 +1,10 @@
+import { fetchFiltersList } from '@/domains/filters/filters.api';
+import { GetFiltersListDto } from '@/domains/filters/filters.types';
+import { createQueryKeys } from '@lukemorales/query-key-factory';
+
+export const filtersQueryKeys = createQueryKeys('filters', {
+ list: (query: GetFiltersListDto) => ({
+ queryKey: [{ query }],
+ queryFn: () => fetchFiltersList(query),
+ }),
+});
diff --git a/apps/workflows-dashboard/src/domains/ui-definitions/index.ts b/apps/workflows-dashboard/src/domains/ui-definitions/index.ts
new file mode 100644
index 0000000000..d33139feb2
--- /dev/null
+++ b/apps/workflows-dashboard/src/domains/ui-definitions/index.ts
@@ -0,0 +1,3 @@
+export * from './query-keys';
+export * from './ui-definitions.api';
+export * from './ui-definitions.types';
diff --git a/apps/workflows-dashboard/src/domains/ui-definitions/query-keys.ts b/apps/workflows-dashboard/src/domains/ui-definitions/query-keys.ts
new file mode 100644
index 0000000000..36d5726938
--- /dev/null
+++ b/apps/workflows-dashboard/src/domains/ui-definitions/query-keys.ts
@@ -0,0 +1,9 @@
+import { fetchUIDefinitions } from '@/domains/ui-definitions/ui-definitions.api';
+import { createQueryKeys } from '@lukemorales/query-key-factory';
+
+export const uiDefinitionsQueryKeys = createQueryKeys('uiDefinitions', {
+ list: () => ({
+ queryKey: [{}],
+ queryFn: () => fetchUIDefinitions(),
+ }),
+});
diff --git a/apps/workflows-dashboard/src/domains/ui-definitions/ui-definitions.api.ts b/apps/workflows-dashboard/src/domains/ui-definitions/ui-definitions.api.ts
new file mode 100644
index 0000000000..d164f7e6a3
--- /dev/null
+++ b/apps/workflows-dashboard/src/domains/ui-definitions/ui-definitions.api.ts
@@ -0,0 +1,8 @@
+import { IUIDefinition } from '@/domains/ui-definitions/ui-definitions.types';
+import { request } from '@/lib/request';
+
+export const fetchUIDefinitions = async () => {
+ const result = await request.get('/external/ui-definition');
+
+ return result.data;
+};
diff --git a/apps/workflows-dashboard/src/domains/ui-definitions/ui-definitions.types.ts b/apps/workflows-dashboard/src/domains/ui-definitions/ui-definitions.types.ts
new file mode 100644
index 0000000000..5e5edf6f89
--- /dev/null
+++ b/apps/workflows-dashboard/src/domains/ui-definitions/ui-definitions.types.ts
@@ -0,0 +1,9 @@
+export interface IUIDefinition {
+ id: string;
+ workflowDefinitionId: string;
+ uiContext: string;
+ definition: object;
+ uiSchema: object;
+ locales?: object;
+ createdAt: string;
+}
diff --git a/apps/workflows-dashboard/src/domains/workflow-definitions/index.ts b/apps/workflows-dashboard/src/domains/workflow-definitions/index.ts
new file mode 100644
index 0000000000..03caf0dde6
--- /dev/null
+++ b/apps/workflows-dashboard/src/domains/workflow-definitions/index.ts
@@ -0,0 +1,2 @@
+export * from './workflow-definitions';
+export * from './workflow-definitions-metrics';
diff --git a/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions-metrics/index.ts b/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions-metrics/index.ts
new file mode 100644
index 0000000000..02ed09ba0a
--- /dev/null
+++ b/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions-metrics/index.ts
@@ -0,0 +1,3 @@
+export * from './query-keys';
+export * from './workflow-definitions-metrics.api';
+export * from './workflow-definitions-metrics.types';
diff --git a/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions-metrics/query-keys.ts b/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions-metrics/query-keys.ts
new file mode 100644
index 0000000000..f09c7da284
--- /dev/null
+++ b/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions-metrics/query-keys.ts
@@ -0,0 +1,9 @@
+import { fetchWorkflowDefinitionVariantMetrics } from '@/domains/workflow-definitions/workflow-definitions-metrics/workflow-definitions-metrics.api';
+import { createQueryKeys } from '@lukemorales/query-key-factory';
+
+export const workflowDefinitionMetricKeys = createQueryKeys('workflow-definitions-metrics', {
+ workflowDefinitionVariantMetrics: () => ({
+ queryKey: [{}],
+ queryFn: () => fetchWorkflowDefinitionVariantMetrics(),
+ }),
+});
diff --git a/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions-metrics/workflow-definitions-metrics.api.ts b/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions-metrics/workflow-definitions-metrics.api.ts
new file mode 100644
index 0000000000..f3b410fc3b
--- /dev/null
+++ b/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions-metrics/workflow-definitions-metrics.api.ts
@@ -0,0 +1,10 @@
+import { IWorkflowDefinitionByVariantMetric } from '@/domains/workflow-definitions/workflow-definitions-metrics/workflow-definitions-metrics.types';
+import { request } from '@/lib/request';
+
+export const fetchWorkflowDefinitionVariantMetrics = async () => {
+ const result = await request.get(
+ `/metrics/workflow-definition/variants-metric`,
+ );
+
+ return result.data;
+};
diff --git a/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions-metrics/workflow-definitions-metrics.types.ts b/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions-metrics/workflow-definitions-metrics.types.ts
new file mode 100644
index 0000000000..e930e25771
--- /dev/null
+++ b/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions-metrics/workflow-definitions-metrics.types.ts
@@ -0,0 +1,4 @@
+export interface IWorkflowDefinitionByVariantMetric {
+ workflowDefinitionVariant: string;
+ count: number;
+}
diff --git a/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions/index.ts b/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions/index.ts
new file mode 100644
index 0000000000..901023c4ce
--- /dev/null
+++ b/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions/index.ts
@@ -0,0 +1,3 @@
+export * from './query-keys';
+export * from './workflow-definitions.api';
+export * from './workflow-definitions.types';
diff --git a/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions/query-keys.ts b/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions/query-keys.ts
new file mode 100644
index 0000000000..64006cf48a
--- /dev/null
+++ b/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions/query-keys.ts
@@ -0,0 +1,26 @@
+import {
+ fetchUIDefinitionByWorkflowDefinitionId,
+ fetchWorkflowDefinition,
+ fetchWorkflowDefinitionsList,
+} from '@/domains/workflow-definitions/workflow-definitions/workflow-definitions.api';
+import {
+ GetUIDefinitionQuery,
+ GetWorkflowDefinitionDto,
+ GetWorkflowDefinitionsListDto,
+} from '@/domains/workflow-definitions/workflow-definitions/workflow-definitions.types';
+import { createQueryKeys } from '@lukemorales/query-key-factory';
+
+export const workflowDefinitionsQueryKeys = createQueryKeys('workflowDefinitions', {
+ get: (query: GetWorkflowDefinitionDto) => ({
+ queryKey: [{ query }],
+ queryFn: () => fetchWorkflowDefinition(query),
+ }),
+ list: (query: GetWorkflowDefinitionsListDto) => ({
+ queryKey: [{ query }],
+ queryFn: () => fetchWorkflowDefinitionsList(query),
+ }),
+ uiDefinition: (query: GetUIDefinitionQuery) => ({
+ queryKey: [{ query }],
+ queryFn: () => fetchUIDefinitionByWorkflowDefinitionId(query),
+ }),
+});
diff --git a/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions/workflow-definitions.api.ts b/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions/workflow-definitions.api.ts
new file mode 100644
index 0000000000..20db0d75d0
--- /dev/null
+++ b/apps/workflows-dashboard/src/domains/workflow-definitions/workflow-definitions/workflow-definitions.api.ts
@@ -0,0 +1,41 @@
+import {
+ GetUIDefinitionQuery,
+ GetWorkflowDefinitionDto,
+ GetWorkflowDefinitionsListDto,
+ IWorkflowDefinition,
+} from '@/domains/workflow-definitions/workflow-definitions/workflow-definitions.types';
+import { request } from '@/lib/request';
+
+export interface IFetchWorkflowDefinitionsListResponse {
+ items: IWorkflowDefinition[];
+ meta: {
+ total: number;
+ pages: number;
+ };
+}
+
+export const fetchWorkflowDefinitionsList = async (query: GetWorkflowDefinitionsListDto) => {
+ const result = await request.get('/workflow-definition', {
+ params: query,
+ });
+
+ return result.data;
+};
+
+export const fetchWorkflowDefinition = async (
+ query: GetWorkflowDefinitionDto,
+): Promise => {
+ const result = await request.get(
+ `/external/workflows/workflow-definition/${query.workflowDefinitionId}`,
+ );
+
+ return result.data || {};
+};
+
+export const fetchUIDefinitionByWorkflowDefinitionId = async (query: GetUIDefinitionQuery) => {
+ const result = await request.get