@orchestrator-ui/orchestrator-ui-components 2.8.3 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/.turbo/turbo-build.log +9 -9
  2. package/.turbo/turbo-lint.log +1 -1
  3. package/.turbo/turbo-test.log +11 -11
  4. package/CHANGELOG.md +21 -0
  5. package/dist/index.d.ts +12047 -7966
  6. package/dist/index.js +1625 -1426
  7. package/dist/index.js.map +1 -1
  8. package/package.json +6 -5
  9. package/src/components/WfoDiff/WfoDiff.tsx +1 -1
  10. package/src/components/WfoForms/formFields/AcceptField.tsx +2 -2
  11. package/src/components/WfoForms/formFields/SubscriptionField.tsx +6 -2
  12. package/src/components/WfoForms/formFields/deprecated/ImsNodeIdField.tsx +2 -2
  13. package/src/components/WfoForms/formFields/deprecated/ImsPortIdField.tsx +2 -2
  14. package/src/components/WfoForms/formFields/deprecated/VlanField.tsx +10 -10
  15. package/src/components/WfoPageTemplate/WfoPageHeader/WfoPageHeader.tsx +1 -1
  16. package/src/components/WfoSubscription/WfoCustomerDescriptionsField.tsx +3 -4
  17. package/src/components/WfoSubscription/WfoInSyncField.tsx +3 -1
  18. package/src/components/WfoSubscription/WfoSubscriptionActions/WfoSubscriptionActionExpandableMenuItem.tsx +73 -0
  19. package/src/components/WfoSubscription/{WfoSubscriptionActions.tsx → WfoSubscriptionActions/WfoSubscriptionActions.tsx} +29 -13
  20. package/src/components/WfoSubscription/WfoSubscriptionActions/index.ts +1 -0
  21. package/src/components/WfoSubscription/WfoSubscriptionActions/styles.ts +75 -0
  22. package/src/components/WfoSubscription/WfoSubscriptionProductBlock/WfoSubscriptionProductBlock.tsx +1 -4
  23. package/src/components/WfoSubscription/WfoSubscriptionProductBlock/styles.ts +3 -0
  24. package/src/components/WfoTable/utils/tableUtils.spec.ts +6 -6
  25. package/src/components/confirmationDialog/WfoConfirmationDialog.tsx +3 -1
  26. package/src/configuration/version.ts +1 -1
  27. package/src/messages/en-GB.json +2 -1
  28. package/src/messages/nl-NL.json +4 -2
  29. package/src/pages/processes/WfoProcessDetail.tsx +6 -3
  30. package/src/pages/processes/WfoProcessDetailPage.tsx +18 -2
  31. package/src/pages/processes/WfoStartProcessPage.tsx +12 -1
  32. package/src/rtk/api.ts +3 -0
  33. package/src/rtk/endpoints/index.ts +1 -0
  34. package/src/rtk/endpoints/metadata/workflows.ts +62 -1
  35. package/src/utils/csvDownload.ts +2 -1
  36. package/src/utils/getEnvironmentVariables.ts +13 -14
  37. package/src/utils/resultFlattener.ts +3 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orchestrator-ui/orchestrator-ui-components",
3
- "version": "2.8.3",
3
+ "version": "2.9.0",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Library of UI Components used to display the workflow orchestrator frontend",
6
6
  "author": {
@@ -36,6 +36,7 @@
36
36
  "@emotion/css": "^11.11.2",
37
37
  "@emotion/react": "^11.11.4",
38
38
  "@rtk-query/graphql-request-base-query": "^2.3.1",
39
+ "eslint": "^8.57.0",
39
40
  "graphql-request": "^6.1.0",
40
41
  "invariant": "^2.2.4",
41
42
  "lodash": "^4.17.21",
@@ -47,6 +48,7 @@
47
48
  "object-hash": "^3.0.0",
48
49
  "prism-themes": "^1.9.0",
49
50
  "react-diff-view": "^3.2.0",
51
+ "react-redux": "^9.1.2",
50
52
  "react-select": "^5.8.0",
51
53
  "scroll-into-view": "^1.16.2",
52
54
  "unidiff": "^1.0.4",
@@ -65,8 +67,8 @@
65
67
  "@storybook/addon-onboarding": "^8.1.10",
66
68
  "@storybook/blocks": "^8.1.10",
67
69
  "@storybook/nextjs": "^8.1.10",
68
- "@storybook/react": "^8.1.10",
69
- "@testing-library/jest-dom": "^6.1.5",
70
+ "@storybook/react": "^8.3.6",
71
+ "@testing-library/jest-dom": "^6.6.2",
70
72
  "@testing-library/react": "^16.0.1",
71
73
  "@testing-library/user-event": "^14.5.2",
72
74
  "@types/invariant": "^2.2.33",
@@ -85,8 +87,7 @@
85
87
  "peerDependencies": {
86
88
  "next": "^14.0.4",
87
89
  "react": "^18.3.1",
88
- "react-dom": "^18.3.1",
89
- "react-redux": "^8.1.3"
90
+ "react-dom": "^18.3.1"
90
91
  },
91
92
  "type": "module",
92
93
  "main": "./dist/index.js",
@@ -69,7 +69,7 @@ const WfoDiff: FC<WfoDiffProps> = ({ oldText, newText, syntax }) => {
69
69
 
70
70
  try {
71
71
  return tokenize(hunks, options);
72
- } catch (ex) {
72
+ } catch {
73
73
  return undefined;
74
74
  }
75
75
  }, [hunks, syntax]);
@@ -114,8 +114,8 @@ function Accept({
114
114
  state.skip
115
115
  ? 'SKIPPED'
116
116
  : state.allChecked
117
- ? 'ACCEPTED'
118
- : 'INCOMPLETE',
117
+ ? 'ACCEPTED'
118
+ : 'INCOMPLETE',
119
119
  );
120
120
 
121
121
  return { ...state };
@@ -170,7 +170,9 @@ function SubscriptionFieldDefinition({
170
170
  (item) => item.field === 'title',
171
171
  );
172
172
  if (subscriptionTitle) {
173
- return `${subscriptionSubstring} - ${description.trim()} - ${subscriptionTitle.value}`;
173
+ return `${subscriptionSubstring} - ${description.trim()} - ${
174
+ subscriptionTitle.value
175
+ }`;
174
176
  }
175
177
  return `${subscriptionSubstring} ${portMode?.toUpperCase()} ${description.trim()} ${
176
178
  subscription.customer?.fullname
@@ -326,7 +328,9 @@ function SubscriptionFieldDefinition({
326
328
  iconSize="l"
327
329
  disabled={isDisabled}
328
330
  onClick={() => {
329
- !isDisabled ? refetch() : null;
331
+ if (isDisabled) {
332
+ refetch();
333
+ }
330
334
  }}
331
335
  />
332
336
  </EuiFlexGroup>
@@ -80,8 +80,8 @@ function ImsNodeId({
80
80
  isLoading && locationCode
81
81
  ? t('widgets.node_select.nodes_loading')
82
82
  : nodes.length
83
- ? t('widgets.node_select.select_node')
84
- : t('forms.widgets.node_select.no_nodes_placeholder');
83
+ ? t('widgets.node_select.select_node')
84
+ : t('forms.widgets.node_select.no_nodes_placeholder');
85
85
 
86
86
  const imsNodeIdLabelLookup =
87
87
  nodes?.reduce<{ [index: string]: string }>(function (mapping, node) {
@@ -140,8 +140,8 @@ function ImsPortId({
140
140
  const portPlaceholder = loading
141
141
  ? t('widgets.nodePort.loadingPorts')
142
142
  : nodeId
143
- ? t('widgets.nodePort.selectPort')
144
- : t('widgets.nodePort.selectNodeFirst');
143
+ ? t('widgets.nodePort.selectPort')
144
+ : t('widgets.nodePort.selectNodeFirst');
145
145
 
146
146
  const nodeOptions: Option[] =
147
147
  nodeSubscriptionOptions?.map(nodeToOptionCorelink) || [];
@@ -212,20 +212,20 @@ function Vlan({
212
212
  const placeholder = isLoading
213
213
  ? t('widgets.vlan.loadingIms')
214
214
  : subscriptionId
215
- ? t('widgets.vlan.placeholder')
216
- : t('widgets.vlan.placeholderNoServicePort');
215
+ ? t('widgets.vlan.placeholder')
216
+ : t('widgets.vlan.placeholderNoServicePort');
217
217
 
218
218
  const errorMessageExtra = missingInIms
219
219
  ? t('widgets.vlan.missingInIms')
220
220
  : !validFormat
221
- ? t('widgets.vlan.invalidVlan')
222
- : vlansInUse.length
223
- ? vlansInUse.length >= 1 && vlansInUse[0] === 0
224
- ? t('widgets.vlan.untaggedPortInUse')
225
- : t('widgets.vlan.vlansInUseError', {
226
- vlans: vlanRangeFromNumbers(vlansInUse),
227
- })
228
- : undefined;
221
+ ? t('widgets.vlan.invalidVlan')
222
+ : vlansInUse.length
223
+ ? vlansInUse.length >= 1 && vlansInUse[0] === 0
224
+ ? t('widgets.vlan.untaggedPortInUse')
225
+ : t('widgets.vlan.vlansInUseError', {
226
+ vlans: vlanRangeFromNumbers(vlansInUse),
227
+ })
228
+ : undefined;
229
229
 
230
230
  let message = '';
231
231
  if (!isLoading && subscriptionId) {
@@ -53,7 +53,7 @@ export const WfoPageHeader: FC<WfoPageHeaderProps> = ({
53
53
  <EuiHeader css={getHeaderStyle(navigationHeight)}>
54
54
  <EuiHeaderSection>
55
55
  <EuiToolTip
56
- content={'UI version' + ORCHESTRATOR_UI_LIBRARY_VERSION}
56
+ content={'UI version ' + ORCHESTRATOR_UI_LIBRARY_VERSION}
57
57
  >
58
58
  <EuiHeaderSectionItem css={{ paddingTop: theme.size.xs }}>
59
59
  <EuiHeaderLogo iconType={() => <WfoAppLogo />} />
@@ -43,10 +43,9 @@ export const WfoCustomerDescriptionsField: FC<
43
43
  <div>
44
44
  {customerDescriptionsWithName.map(
45
45
  ({ shortcode, fullname, description, customerId }) => (
46
- <div
47
- key={customerId}
48
- title={fullname ?? customerId}
49
- >{`${shortcode ?? customerId}: ${description}`}</div>
46
+ <div key={customerId} title={fullname ?? customerId}>{`${
47
+ shortcode ?? customerId
48
+ }: ${description}`}</div>
50
49
  ),
51
50
  )}
52
51
  </div>
@@ -62,7 +62,9 @@ export const WfoInSyncField = ({
62
62
  };
63
63
 
64
64
  const getProcessLink = () => {
65
- const processUrl = `${lastUncompletedProcess?.isTask ? PATH_TASKS : PATH_WORKFLOWS}/${lastUncompletedProcess?.processId}`;
65
+ const processUrl = `${
66
+ lastUncompletedProcess?.isTask ? PATH_TASKS : PATH_WORKFLOWS
67
+ }/${lastUncompletedProcess?.processId}`;
66
68
 
67
69
  const confirmSetInSync = () => {
68
70
  showConfirmDialog({
@@ -0,0 +1,73 @@
1
+ import React, { FC, useState } from 'react';
2
+
3
+ import { useTranslations } from 'next-intl';
4
+ import Link from 'next/link';
5
+
6
+ import { EuiButtonIcon, EuiText } from '@elastic/eui';
7
+ import { ReactJSXElement } from '@emotion/react/types/jsx-namespace';
8
+
9
+ import { PATH_SUBSCRIPTIONS } from '@/components';
10
+ import { useWithOrchestratorTheme } from '@/hooks';
11
+ import { SubscriptionAction } from '@/types';
12
+
13
+ import { getSubscriptionActionStyles } from './styles';
14
+
15
+ export type WfoSubscriptionActionExpandableMenuItemProps = {
16
+ subscriptionAction: SubscriptionAction;
17
+ onClickLockedRelation: (relation: string) => void;
18
+ children: ReactJSXElement;
19
+ };
20
+
21
+ export const WfoSubscriptionActionExpandableMenuItem: FC<
22
+ WfoSubscriptionActionExpandableMenuItemProps
23
+ > = ({ subscriptionAction, onClickLockedRelation, children }) => {
24
+ const t = useTranslations('subscriptions.detail.actions');
25
+
26
+ const {
27
+ clickableStyle,
28
+ expandableMenuItemStyle,
29
+ expandButtonStyle,
30
+ expandedContentStyle,
31
+ linkStyle,
32
+ } = useWithOrchestratorTheme(getSubscriptionActionStyles);
33
+ const [isExpanded, setIsExpanded] = useState(false);
34
+
35
+ const { locked_relations: lockedRelations } = subscriptionAction;
36
+
37
+ return (
38
+ <div>
39
+ <div
40
+ css={[
41
+ expandableMenuItemStyle,
42
+ lockedRelations && clickableStyle,
43
+ ]}
44
+ onClick={() => setIsExpanded(!isExpanded)}
45
+ >
46
+ <div>{children}</div>
47
+ {lockedRelations && (
48
+ <EuiButtonIcon
49
+ css={expandButtonStyle}
50
+ iconType={isExpanded ? 'arrowDown' : 'arrowRight'}
51
+ onClick={() => setIsExpanded(!isExpanded)}
52
+ />
53
+ )}
54
+ </div>
55
+ {lockedRelations && isExpanded && (
56
+ <div css={expandedContentStyle}>
57
+ <EuiText size="xs">{t('lockedBySubscriptions')}</EuiText>
58
+ {lockedRelations.map((relation) => (
59
+ <EuiText key={relation} size="xs">
60
+ <Link
61
+ css={linkStyle}
62
+ href={`${PATH_SUBSCRIPTIONS}/${relation}`}
63
+ onClick={() => onClickLockedRelation(relation)}
64
+ >
65
+ {relation}
66
+ </Link>
67
+ </EuiText>
68
+ ))}
69
+ </div>
70
+ )}
71
+ </div>
72
+ );
73
+ };
@@ -17,13 +17,20 @@ import { ReactJSXElement } from '@emotion/react/types/jsx-namespace';
17
17
 
18
18
  import { PATH_START_NEW_TASK, PATH_START_NEW_WORKFLOW } from '@/components';
19
19
  import { PolicyResource } from '@/configuration/policy-resources';
20
- import { useCheckEngineStatus, useOrchestratorTheme, usePolicy } from '@/hooks';
20
+ import {
21
+ useCheckEngineStatus,
22
+ useOrchestratorTheme,
23
+ usePolicy,
24
+ useWithOrchestratorTheme,
25
+ } from '@/hooks';
21
26
  import { WfoXCircleFill } from '@/icons';
22
27
  import { useGetSubscriptionActionsQuery } from '@/rtk/endpoints/subscriptionActions';
23
28
  import { SubscriptionAction, WorkflowTarget } from '@/types';
24
29
 
25
- import { WfoTargetTypeIcon } from './WfoTargetTypeIcon';
26
- import { flattenArrayProps } from './utils';
30
+ import { WfoTargetTypeIcon } from '../WfoTargetTypeIcon';
31
+ import { flattenArrayProps } from '../utils';
32
+ import { WfoSubscriptionActionExpandableMenuItem } from './WfoSubscriptionActionExpandableMenuItem';
33
+ import { getSubscriptionActionStyles } from './styles';
27
34
 
28
35
  type MenuItemProps = {
29
36
  key: string;
@@ -52,6 +59,13 @@ export const WfoSubscriptionActions: FC<WfoSubscriptionActionsProps> = ({
52
59
  isLoading,
53
60
  }) => {
54
61
  const { theme } = useOrchestratorTheme();
62
+ const {
63
+ linkMenuItemStyle,
64
+ tooltipMenuItemStyle,
65
+ disabledIconStyle,
66
+ iconStyle,
67
+ secondaryIconStyle,
68
+ } = useWithOrchestratorTheme(getSubscriptionActionStyles);
55
69
 
56
70
  const router = useRouter();
57
71
  const t = useTranslations('subscriptions.detail.actions');
@@ -89,6 +103,7 @@ export const WfoSubscriptionActions: FC<WfoSubscriptionActionsProps> = ({
89
103
 
90
104
  const handleLinkClick = async (e: React.MouseEvent) => {
91
105
  e.preventDefault();
106
+ setPopover(false);
92
107
  if (await isEngineRunningNow()) {
93
108
  router.push(url);
94
109
  }
@@ -96,7 +111,7 @@ export const WfoSubscriptionActions: FC<WfoSubscriptionActionsProps> = ({
96
111
 
97
112
  return (
98
113
  <Link href={url} onClick={handleLinkClick}>
99
- {actionItem}
114
+ <div css={linkMenuItemStyle}>{actionItem}</div>
100
115
  </Link>
101
116
  );
102
117
  };
@@ -134,9 +149,14 @@ export const WfoSubscriptionActions: FC<WfoSubscriptionActionsProps> = ({
134
149
  const tooltipContent = t(action.reason, flattenArrayProps(action));
135
150
 
136
151
  return (
137
- <div>
152
+ <div css={tooltipMenuItemStyle}>
138
153
  <EuiToolTip position="top" content={tooltipContent}>
139
- {actionItem}
154
+ <WfoSubscriptionActionExpandableMenuItem
155
+ subscriptionAction={action}
156
+ onClickLockedRelation={() => setPopover(false)}
157
+ >
158
+ {actionItem}
159
+ </WfoSubscriptionActionExpandableMenuItem>
140
160
  </EuiToolTip>
141
161
  </div>
142
162
  );
@@ -144,13 +164,9 @@ export const WfoSubscriptionActions: FC<WfoSubscriptionActionsProps> = ({
144
164
 
145
165
  const getIcon = () => {
146
166
  return action.reason ? (
147
- <div css={{ display: 'flex', width: theme.base * 2 }}>
167
+ <div css={disabledIconStyle}>
148
168
  <WfoTargetTypeIcon target={target} disabled={true} />
149
- <div
150
- css={{
151
- transform: 'translate(-11px, -8px);',
152
- }}
153
- >
169
+ <div css={secondaryIconStyle}>
154
170
  <WfoXCircleFill
155
171
  width={20}
156
172
  height={20}
@@ -159,7 +175,7 @@ export const WfoSubscriptionActions: FC<WfoSubscriptionActionsProps> = ({
159
175
  </div>
160
176
  </div>
161
177
  ) : (
162
- <div css={{ width: theme.base * 2 }}>
178
+ <div css={iconStyle}>
163
179
  <WfoTargetTypeIcon target={target} />
164
180
  </div>
165
181
  );
@@ -0,0 +1 @@
1
+ export * from './WfoSubscriptionActions';
@@ -0,0 +1,75 @@
1
+ import { css } from '@emotion/react';
2
+
3
+ import { WfoTheme } from '@/hooks';
4
+
5
+ const EXPANDED_CONTENT_LEFT_MARGIN = '52px';
6
+
7
+ export const getSubscriptionActionStyles = ({ theme }: WfoTheme) => {
8
+ const clickableStyle = css({
9
+ '&:hover, & :hover': {
10
+ cursor: 'pointer',
11
+ },
12
+ });
13
+
14
+ const expandableMenuItemStyle = css({
15
+ display: 'flex',
16
+ justifyContent: 'space-between',
17
+ alignItems: 'center',
18
+ });
19
+
20
+ const expandButtonStyle = css({
21
+ marginRight: theme.size.m,
22
+ });
23
+
24
+ const expandedContentStyle = css({
25
+ marginLeft: EXPANDED_CONTENT_LEFT_MARGIN,
26
+ paddingBottom: theme.size.m,
27
+ paddingRight: theme.size.m,
28
+ });
29
+
30
+ const linkStyle = css({
31
+ display: 'block',
32
+ });
33
+
34
+ const linkMenuItemStyle = css({
35
+ '&>:hover': {
36
+ backgroundColor: theme.colors.lightestShade,
37
+ borderRadius: theme.border.radius.medium,
38
+ },
39
+ });
40
+
41
+ const tooltipMenuItemStyle = css([
42
+ linkMenuItemStyle,
43
+ {
44
+ '& > *': {
45
+ display: 'block',
46
+ },
47
+ },
48
+ ]);
49
+
50
+ const disabledIconStyle = css({
51
+ display: 'flex',
52
+ width: theme.base * 2,
53
+ });
54
+
55
+ const iconStyle = css({
56
+ width: theme.base * 2,
57
+ });
58
+
59
+ const secondaryIconStyle = css({
60
+ transform: 'translate(-11px, -8px);',
61
+ });
62
+
63
+ return {
64
+ clickableStyle,
65
+ expandableMenuItemStyle,
66
+ expandButtonStyle,
67
+ expandedContentStyle,
68
+ linkStyle,
69
+ linkMenuItemStyle,
70
+ tooltipMenuItemStyle,
71
+ disabledIconStyle,
72
+ iconStyle,
73
+ secondaryIconStyle,
74
+ };
75
+ };
@@ -1,5 +1,6 @@
1
1
  import React, { useState } from 'react';
2
2
 
3
+ import { isEmpty } from 'lodash';
3
4
  import { useTranslations } from 'next-intl';
4
5
 
5
6
  import {
@@ -61,10 +62,6 @@ export const WfoSubscriptionProductBlock = ({
61
62
  );
62
63
  const showProductBlockValues = !isOutsideCurrentSubscription || showDetails;
63
64
 
64
- const isEmpty = (value: unknown) => {
65
- return value === null || value === undefined || value === '';
66
- };
67
-
68
65
  return (
69
66
  <>
70
67
  <EuiSpacer size={'m'}></EuiSpacer>
@@ -43,6 +43,9 @@ export const getStyles = (wfoTheme: WfoTheme) => {
43
43
  '&:first-child': {
44
44
  borderTop: `solid 1px ${theme.colors.lightShade}`,
45
45
  },
46
+ '&:last-child': {
47
+ borderBottom: 'none',
48
+ },
46
49
  });
47
50
 
48
51
  const leftColumnStyle = css({
@@ -20,9 +20,9 @@ describe('tableUtils', () => {
20
20
  });
21
21
 
22
22
  describe('determineNewSortOrder', () => {
23
- const testData = {
24
- column1: {},
25
- column2: {},
23
+ type TestData = {
24
+ column1: object;
25
+ column2: object;
26
26
  };
27
27
 
28
28
  it('returns SortDirection.Asc when sorting on a new column', () => {
@@ -30,7 +30,7 @@ describe('tableUtils', () => {
30
30
  const currentSortDirection = SortOrder.ASC;
31
31
  const newSortColumnId = 'column2';
32
32
 
33
- const result = determineNewSortOrder<typeof testData>(
33
+ const result = determineNewSortOrder<TestData>(
34
34
  currentSortColumnId,
35
35
  currentSortDirection,
36
36
  newSortColumnId,
@@ -44,7 +44,7 @@ describe('tableUtils', () => {
44
44
  const currentSortDirection = SortOrder.DESC;
45
45
  const newSortColumnId = 'column1';
46
46
 
47
- const result = determineNewSortOrder<typeof testData>(
47
+ const result = determineNewSortOrder<TestData>(
48
48
  currentSortColumnId,
49
49
  currentSortDirection,
50
50
  newSortColumnId,
@@ -58,7 +58,7 @@ describe('tableUtils', () => {
58
58
  const currentSortDirection = SortOrder.DESC;
59
59
  const newSortColumnId = 'column1';
60
60
 
61
- const result = determineNewSortOrder<typeof testData>(
61
+ const result = determineNewSortOrder<TestData>(
62
62
  currentSortColumnId,
63
63
  currentSortDirection,
64
64
  newSortColumnId,
@@ -72,7 +72,9 @@ export default function WfoConfirmationDialog({
72
72
  <EuiModalBody>
73
73
  <div>
74
74
  <section
75
- className={`dialog-content ${isError ? ' error' : ''}`}
75
+ className={`dialog-content ${
76
+ isError ? ' error' : ''
77
+ }`}
76
78
  >
77
79
  <h2>{question}</h2>
78
80
  {subQuestion && <p>{subQuestion}</p>}
@@ -1 +1 @@
1
- export const ORCHESTRATOR_UI_LIBRARY_VERSION = '2.8.3';
1
+ export const ORCHESTRATOR_UI_LIBRARY_VERSION = '2.9.0';
@@ -116,7 +116,7 @@
116
116
  "placeholderNoServicePort": "First select a Service Port...",
117
117
  "invalidVlan": "Invalid VLAN - must be a range of valid [2-4094] VLAN integers, for example '2, 5-6, 1048-1052'",
118
118
  "untaggedPortInUse": "This service port is already in use and cannot be chosen",
119
- "taggedOnly": "VLAN is only relevant for SN7 MSP or SN8 SP in tagged mode, not for link_member or untagged ports.",
119
+ "taggedOnly": "VLAN is only relevant for service ports in tagged mode, not for link_member or untagged ports.",
120
120
  "loadingIms": "Loading VLAN info from IMS"
121
121
  },
122
122
  "subscription": {
@@ -291,6 +291,7 @@
291
291
  "tasks": "Tasks",
292
292
  "terminate": "Terminate workflow",
293
293
  "actions": "Actions",
294
+ "lockedBySubscriptions": "This action is locked by the following subscriptions:",
294
295
  "subscription": {
295
296
  "no_modify_deleted_related_objects": "This subscription can not be modified because it contains references to other systems that are deleted.",
296
297
  "no_modify_in_use_by_subscription": "This subscription can not be {action} as it is used in other subscriptions: {unterminated_in_use_by_subscriptions}",
@@ -38,6 +38,7 @@
38
38
  "noItemsFound": "Geen items gevonden",
39
39
  "search": "Zoeken",
40
40
  "errorMessage": "Er is een fout opgetreden",
41
+ "unknownError": "Onbekende error",
41
42
  "export": "Exporteren",
42
43
  "unauthorizedPage": "Niet geautoriseerd om deze pagina te bekijken",
43
44
  "insyncTrue": "in-sync",
@@ -115,7 +116,7 @@
115
116
  "placeholderNoServicePort": "Selecteer eerst een Service Port...",
116
117
  "invalidVlan": "Invalid VLAN - Voer een range of geldige [2-4094] VLAN integers in, bijvoorbeeld: '2, 5-6, 1048-1052'",
117
118
  "untaggedPortInUse": "Deze service port is al in gebruik en kan niet worden gekozen",
118
- "taggedOnly": "VLAN is alleen relevant SN7, MSP of SN8 SP in tagged mode, niet voor link_member of untagged ports.",
119
+ "taggedOnly": "VLAN is alleen relevant voor service poorten in tagged mode, niet voor link_member of untagged ports.",
119
120
  "loadingIms": "VLAN informatie aan het laden uit IMS..."
120
121
  },
121
122
  "subscription": {
@@ -223,7 +224,7 @@
223
224
  },
224
225
  "steps": {
225
226
  "taskSteps": "Taak stappen",
226
- "steps": "Workflow stappen",
227
+ "workflowSteps": "Workflow stappen",
227
228
  "showDelta": "Toon subscription delta",
228
229
  "hideDelta": "Verberg subscription delta",
229
230
  "showTraceback": "Toon traceback",
@@ -290,6 +291,7 @@
290
291
  "tasks": "Taken",
291
292
  "terminate": "Terminate workflow",
292
293
  "actions": "Acties",
294
+ "lockedBySubscriptions": "Deze actie is geblokkeerd door de volgende subscriptions:",
293
295
  "subscription": {
294
296
  "no_modify_deleted_related_objects": "Deze subscription kan niet worden gewijzigd omdat het verwijzingen bevat naar andere systemen die zijn verwijderd.",
295
297
  "no_modify_in_use_by_subscription": "Deze subscription kan niet worden {gewijzigd} omdat het wordt gebruikt in andere subscriptions: {unterminated_in_use_by_subscriptions}",
@@ -158,8 +158,9 @@ export const WfoProcessDetail = ({
158
158
  },
159
159
  ),
160
160
  onConfirm: () => {
161
- processDetail?.processId &&
161
+ if (processDetail?.processId) {
162
162
  retryProcess({ processId: processDetail.processId });
163
+ }
163
164
  },
164
165
  });
165
166
 
@@ -172,8 +173,9 @@ export const WfoProcessDetail = ({
172
173
  },
173
174
  ),
174
175
  onConfirm: () => {
175
- processDetail?.processId &&
176
+ if (processDetail?.processId) {
176
177
  abortProcess({ processId: processDetail.processId });
178
+ }
177
179
  router.push(processIsTask ? PATH_TASKS : PATH_WORKFLOWS);
178
180
  },
179
181
  });
@@ -184,8 +186,9 @@ export const WfoProcessDetail = ({
184
186
  workflowName: processDetail?.workflowName,
185
187
  }),
186
188
  onConfirm: () => {
187
- processDetail?.processId &&
189
+ if (processDetail?.processId) {
188
190
  deleteProcess({ processId: processDetail.processId });
191
+ }
189
192
  router.push(PATH_TASKS);
190
193
  },
191
194
  });
@@ -7,7 +7,10 @@ import {
7
7
  WfoStepListRef,
8
8
  WfoWorkflowStepList,
9
9
  } from '@/components';
10
- import { useGetProcessDetailQuery } from '@/rtk/endpoints/processDetail';
10
+ import {
11
+ useGetDescriptionForWorkflowNameQuery,
12
+ useGetProcessDetailQuery,
13
+ } from '@/rtk';
11
14
  import { Step } from '@/types';
12
15
  import { getProductNamesFromProcess } from '@/utils';
13
16
 
@@ -35,10 +38,23 @@ export const WfoProcessDetailPage = ({
35
38
  });
36
39
  const processDetail = data?.processes[0];
37
40
 
41
+ const { data: workflowMetadata, isError: isErrorWorkflowDescription } =
42
+ useGetDescriptionForWorkflowNameQuery(
43
+ {
44
+ workflowName: processDetail?.workflowName ?? '',
45
+ },
46
+ {
47
+ skip: processDetail === undefined,
48
+ },
49
+ );
50
+
38
51
  const steps = processDetail?.steps ?? [];
39
52
 
40
53
  const productNames = getProductNamesFromProcess(processDetail);
41
- const pageTitle = processDetail?.workflowName || '';
54
+ const pageTitle =
55
+ workflowMetadata?.description ||
56
+ (isErrorWorkflowDescription && processDetail?.workflowName) ||
57
+ '';
42
58
  const isTask = processDetail?.isTask ?? false;
43
59
  const groupedSteps: GroupedStep[] = convertStepsToGroupedSteps(steps);
44
60
  const timelineItems: TimelineItem[] =