Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update of workflows UI for triggers, rules and actions #699

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions cypress/component/Attributes/AttributeEditor/mock-data.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@ export const customAttributeEditorMockData: AttributeEditorProps = {
content: [
{
data: {
// code: 'PGgxPk9EUE9WRcSOPC9oMT4KPGRpdj5Qb8SNw610YW1lIGtvxL5rbyBjZXJ0aWZpa8OhdG92IHR1IGplLjwvZGl2PgoKPHVsPgogIDxsaT5TdWJqZWN0OiAke25vdGlmaWNhdGlvbkRhdGEuc3ViamVjdERufTwvbGk+CiAgPGxpPlNlcmlhbCBOdW1iZXI6ICR7bm90aWZpY2F0aW9uRGF0YS5zZXJpYWxOdW1iZXJ9PC9saT4KICA8bGk+SXNzdWVyOiAke25vdGlmaWNhdGlvbkRhdGEuaXNzdWVyRG59PC9saT4KPC91bD4=',
code: '',
language: ProgrammingLanguageEnum.Html,
},
Expand All @@ -133,11 +132,6 @@ export const customAttributeEditorMockData: AttributeEditorProps = {
list: false,
multiSelect: false,
},
// content: [
// {
// data: '1.1',
// },
// ],
},
{
uuid: 'test-uuid-7',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,6 @@ describe('AttributeViewer with Metadata', () => {

it(`should check if source object table is opened in modal`, () => {
cy.get('.fa-caret-down').eq(0).click().wait(clickWait);
// cy.get('.fa-arrow-up').eq(1).click().wait(clickWait);
cy.get('.fa-info').eq(0).click().wait(clickWait);

cy.get('.modal-content').should('be.visible');
Expand Down
5 changes: 0 additions & 5 deletions cypress/component/_pages/users/form/mock-data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -196,9 +196,7 @@ const userFormMockData = {
uuid: 'uuid-1234-text-custom-attribute',
name: 'Text Me',
label: 'Text Me',
// type: 'custom',
type: AttributeType.Custom,
// contentType: 'text',
contentType: AttributeContentType.Text,
content: [
{
Expand All @@ -211,7 +209,6 @@ const userFormMockData = {
name: 'SomeCustom',
label: 'SomeCustom',
type: AttributeType.Custom,
// contentType: 'integer',
contentType: AttributeContentType.Integer,

content: [
Expand All @@ -225,7 +222,6 @@ const userFormMockData = {
name: 'DepartmentAssociation',
label: 'Department',
type: AttributeType.Custom,
// contentType: 'string',
contentType: AttributeContentType.String,
content: [
{
Expand Down Expand Up @@ -299,7 +295,6 @@ const userFormMockData = {
name: 'Test Date',
label: 'Test Date',
type: AttributeType.Custom,
// contentType: 'date',
contentType: AttributeContentType.Date,
content: [
{
Expand Down
11 changes: 0 additions & 11 deletions cypress/support/commands.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,3 @@ Cypress.Commands.add('mount', (component, options = {}, initialRoute = '/') => {

return mount(wrapped, mountOptions);
});

// Cypress.Commands.add("mount", mount);

// Cypress.Commands.add('mountWithRouter', (component, route) => {
// // Mount the component with the Router context
// cy.mount(component, {}, route);
// });

// Cypress.Commands.add('dataCy', (value) => {
// return cy.get(`[data-cy=${value}]`);
// });
14 changes: 11 additions & 3 deletions src/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,15 @@ import {
RAProfileManagementApi,
ResourceManagementApi,
RoleManagementApi,
RulesManagementApi,
SCEPProfileManagementApi,
ScheduledJobsManagementApi,
SettingsApi,
StatisticsDashboardApi,
TokenProfileManagementApi,
UserManagementApi,
WorkflowActionsManagementApi,
WorkflowRulesManagementApi,
WorkflowTriggersManagementApi,
} from 'types/openapi';
import { TokenInstanceControllerApi } from 'types/openapi/apis/TokenInstanceControllerApi';
import {
Expand All @@ -51,7 +53,10 @@ export interface ApiClients {
auth: AuthenticationManagementApi;
users: UserManagementApi;
roles: RoleManagementApi;
rules: RulesManagementApi;
// rules: RulesManagementApi;
actions: WorkflowActionsManagementApi;
rules: WorkflowRulesManagementApi;
triggers: WorkflowTriggersManagementApi;
auditLogs: AuditLogApi;
raProfiles: RAProfileManagementApi;
credentials: CredentialManagementApi;
Expand Down Expand Up @@ -93,7 +98,10 @@ export const backendClient: ApiClients = {
auth: new AuthenticationManagementApi(configuration),
users: new UserManagementApi(configuration),
roles: new RoleManagementApi(configuration),
rules: new RulesManagementApi(configuration),
// rules: new RulesManagementApi(configuration),
actions: new WorkflowActionsManagementApi(configuration),
rules: new WorkflowRulesManagementApi(configuration),
triggers: new WorkflowTriggersManagementApi(configuration),
certificates: new CertificateInventoryApi(configuration),
auditLogs: new AuditLogApi(configuration),
raProfiles: new RAProfileManagementApi(configuration),
Expand Down
30 changes: 17 additions & 13 deletions src/components/AppRouter.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -108,12 +108,15 @@ import NotificationInstanceDetail from './_pages/notifications/notification-inst
import NotificationInstanceForm from './_pages/notifications/notification-instance-form';
import NotificationsSetting from './_pages/notifications/notifications-setting';

import ConditionGroupDetails from './_pages/condition-groups/details';
import ConditionGroupForm from './_pages/condition-groups/form';
import ConditionGroupsList from './_pages/condition-groups/list';
import ConditionDetails from './_pages/conditions/details';
import ConditionForm from './_pages/conditions/form';

import ActionGroupForm from './_pages/action-groups/form';
import ActionGroupsList from './_pages/action-groups/list';
import ExecutionDetails from './_pages/executions/details';
import ExecutionForm from './_pages/executions/form';

import ActionDetails from './_pages/actions/detail';
import ActionForm from './_pages/actions/form';
import ActionsList from './_pages/actions/list';

import TriggerDetails from './_pages/triggers/details';
import TriggerForm from './_pages/triggers/form';
Expand All @@ -123,7 +126,6 @@ import RuleDetails from './_pages/rules/detail';
import RulesForm from './_pages/rules/form';
import RulesList from './_pages/rules/list';

import ActionGroupsDetails from './_pages/action-groups/details';
import SchedulerJobDetail from './_pages/scheduler/detail';
import SchedulerJobsList from './_pages/scheduler/list';
import Layout from './Layout';
Expand Down Expand Up @@ -333,17 +335,19 @@ export default function AppRouter() {
<Route path={`/notificationinstances/add`} element={<NotificationInstanceForm />} />
<Route path={`/notificationinstances/edit/:id`} element={<NotificationInstanceForm />} />

<Route path={`/conditiongroups`} element={<ConditionGroupsList />} />
<Route path={`/conditiongroups/add`} element={<ConditionGroupForm />} />
<Route path={`/conditiongroups/detail/:id`} element={<ConditionGroupDetails />} />
<Route path={`/conditions/add`} element={<ConditionForm />} />
<Route path={`/conditions/detail/:id`} element={<ConditionDetails />} />

<Route path={`/rules/add`} element={<RulesForm />} />
<Route path={`/rules`} element={<RulesList />} />
<Route path={`/rules/:tabIndex?`} element={<RulesList />} />
<Route path={`/rules/detail/:id`} element={<RuleDetails />} />

<Route path={`/actionGroups/add`} element={<ActionGroupForm />} />
<Route path={`/actionGroups`} element={<ActionGroupsList />} />
<Route path={`/actionGroups/detail/:id`} element={<ActionGroupsDetails />} />
<Route path={`/executions/add`} element={<ExecutionForm />} />
<Route path={`/executions/detail/:id`} element={<ExecutionDetails />} />

<Route path={`/actions/add`} element={<ActionForm />} />
<Route path={`/actions/:tabIndex?`} element={<ActionsList />} />
<Route path={`/actions/detail/:id`} element={<ActionDetails />} />

<Route path={`/triggers/add`} element={<TriggerForm />} />
<Route path={`/triggers`} element={<TriggerList />} />
Expand Down
157 changes: 157 additions & 0 deletions src/components/ConditionAndExecutionItemsViewer/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
import { ApiClients } from 'api';
import FilterWidget from 'components/FilterWidget';
import FilterWidgetRuleAction from 'components/FilterWidgetRuleAction';
import { EntityType, actions as filterActions } from 'ducks/filters';
import { actions as rulesActions, selectors as rulesSelectors } from 'ducks/rules';
import { useEffect, useMemo, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { useParams } from 'react-router-dom';
import { Resource } from 'types/openapi';
import { conditionGroupToFilter, filterToConditionItems } from 'utils/rules';
type FormType = 'condtionItems' | 'executionItems';

interface ConditionGroupFormFilterProps {
resource: Resource;
formType: FormType;
}

const ConditionAndExecutionItemsViewer = ({ resource, formType }: ConditionGroupFormFilterProps) => {
const { id } = useParams();
const editMode = useMemo(() => !!id, [id]);

const conditionDetails = useSelector(rulesSelectors.conditionDetails);
const isFetchingConditionDetails = useSelector(rulesSelectors.isFetchingConditionDetails);
const isUpdatingCondition = useSelector(rulesSelectors.isUpdatingCondition);

const executionDetails = useSelector(rulesSelectors.executionDetails);
const isFetchingExecutionDetails = useSelector(rulesSelectors.isFetchingExecutionDetails);
const isUpdatingExecution = useSelector(rulesSelectors.isUpdatingExecution);

const [hasEffectRun, setHasEffectRun] = useState(false);

const dispatch = useDispatch();

useEffect(() => {
dispatch(filterActions.setCurrentFilters({ currentFilters: [], entity: EntityType.CONDITIONS }));
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);

useEffect(() => {
if (!id) return;

if (formType === 'condtionItems' && id !== conditionDetails?.uuid) {
dispatch(rulesActions.getCondition({ conditionUuid: id }));
}

if (formType === 'executionItems' && id !== executionDetails?.uuid) {
dispatch(rulesActions.getExecution({ executionUuid: id }));
}
}, [id, dispatch, formType, conditionDetails?.uuid, executionDetails?.uuid]);

useEffect(() => {
if (!hasEffectRun && editMode && id) {
if (formType == 'condtionItems') {
if (conditionDetails?.uuid !== id) return;
const currentConditions = conditionDetails?.items || [];

const currentFilters = conditionGroupToFilter(currentConditions);
setHasEffectRun(true);
dispatch(filterActions.setCurrentFilters({ currentFilters: currentFilters, entity: EntityType.CONDITIONS }));
}
}
}, [editMode, conditionDetails, hasEffectRun, dispatch, formType, id]);

useEffect(() => {
return () => {
dispatch(filterActions.setCurrentFilters({ currentFilters: [], entity: EntityType.CONDITIONS }));
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);

const renderFilterWidgetForConditionItems = useMemo(() => {
if (formType !== 'condtionItems' || !id || !conditionDetails) return null;
const disableBadgeRemove = conditionDetails.items.length === 1 || isFetchingConditionDetails || isUpdatingCondition;
const isBusy = isFetchingConditionDetails || isUpdatingCondition;
return (
<div>
<FilterWidget
busyBadges={isBusy}
entity={EntityType.CONDITIONS}
title={'Conditions'}
getAvailableFiltersApi={(apiClients: ApiClients) =>
apiClients.resources.listResourceRuleFilterFields({
resource,
})
}
disableBadgeRemove={disableBadgeRemove}
onFilterUpdate={(currentFilters) => {
const currentCondition = filterToConditionItems(currentFilters);
dispatch(
rulesActions.updateCondition({
conditionUuid: id,
condition: {
items: currentCondition,
description: conditionDetails.description || '',
},
}),
);
}}
/>
</div>
);
}, [resource, dispatch, formType, id, conditionDetails, isFetchingConditionDetails, isUpdatingCondition]);

const renderFilterWidgetForExecutionItems = useMemo(() => {
if (formType !== 'executionItems' || !id || !executionDetails) return null;
const disableBadgeRemove = executionDetails.items.length === 1 || isFetchingExecutionDetails || isUpdatingExecution;

const isBusy = isFetchingExecutionDetails || isUpdatingExecution;
return (
<div>
{
<FilterWidgetRuleAction
entity={EntityType.ACTIONS}
title={'Actions'}
busyBadges={isBusy}
disableBadgeRemove={disableBadgeRemove}
getAvailableFiltersApi={(apiClients: ApiClients) =>
apiClients.resources.listResourceRuleFilterFields({
resource,
settable: true,
})
}
ExecutionsList={executionDetails.items}
onActionsUpdate={(currentExecutionItems) => {
dispatch(
rulesActions.updateExecution({
executionUuid: id,
execution: {
items: currentExecutionItems,
description: executionDetails.description,
},
}),
);
}}
/>
}
</div>
);
}, [resource, dispatch, formType, id, executionDetails, isFetchingExecutionDetails, isUpdatingExecution]);

const renderWidgetConditionViewer = useMemo(() => {
switch (formType) {
case 'condtionItems':
return renderFilterWidgetForConditionItems;

case 'executionItems':
return renderFilterWidgetForExecutionItems;

default:
return null;
}
}, [formType, renderFilterWidgetForConditionItems, renderFilterWidgetForExecutionItems]);

return <div>{renderWidgetConditionViewer}</div>;
};

export default ConditionAndExecutionItemsViewer;
Loading