@orchestrator-ui/orchestrator-ui-components 8.7.3 → 8.8.1

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 (40) hide show
  1. package/.turbo/turbo-build.log +8 -8
  2. package/.turbo/turbo-lint.log +1 -1
  3. package/.turbo/turbo-test.log +16 -14
  4. package/CHANGELOG.md +22 -0
  5. package/dist/index.d.ts +23 -18
  6. package/dist/index.js +389 -267
  7. package/dist/index.js.map +1 -1
  8. package/package.json +1 -1
  9. package/src/components/WfoBadges/WfoWorkflowTargetBadge/WfoWorkflowTargetBadge.tsx +2 -2
  10. package/src/components/WfoContentHeader/WfoContentHeader.tsx +1 -1
  11. package/src/components/WfoInlineNoteEdit/WfoProcessListNoteEdit.spec.tsx +35 -0
  12. package/src/components/WfoInlineNoteEdit/WfoProcessListNoteEdit.tsx +7 -9
  13. package/src/components/WfoProcessList/WfoProcessListDeltaPopover.tsx +1 -1
  14. package/src/components/WfoProcessList/WfoProcessesList.tsx +7 -5
  15. package/src/components/WfoSubscription/WfoProcessesTimeline.tsx +21 -7
  16. package/src/components/WfoSubscription/WfoSubscriptionActions/WfoSubscriptionActions.tsx +25 -9
  17. package/src/components/WfoSubscription/WfoSubscriptionGeneralSections/WfoSubscriptionDetailSection.tsx +1 -1
  18. package/src/components/WfoSubscription/styles.ts +6 -0
  19. package/src/components/WfoSubscription/utils/utils.ts +2 -4
  20. package/src/components/WfoTable/WfoStructuredSearchTable/WfoExpandingSearchRow.tsx +0 -1
  21. package/src/components/WfoTable/WfoStructuredSearchTable/WfoStructuredSearchTable.tsx +40 -1
  22. package/src/components/WfoTable/WfoStructuredSearchTable/styles.ts +8 -9
  23. package/src/components/WfoTable/WfoTable/WfoTable.tsx +5 -1
  24. package/src/components/WfoTable/WfoTable/WfoTableDataRows.tsx +11 -2
  25. package/src/components/WfoTable/WfoTable/WfoTableExpandedRowReveal.spec.tsx +120 -0
  26. package/src/components/WfoTable/WfoTable/styles.ts +6 -0
  27. package/src/components/WfoTable/utils/tableConfigPersistence.ts +1 -0
  28. package/src/components/WfoTimeline/styles.ts +1 -1
  29. package/src/components/WfoWorkflowUserGuide/WfoPageWithUserGuide.tsx +8 -2
  30. package/src/components/WfoWorkflowUserGuide/WfoWorkflowGuideExpandablePanel.tsx +39 -30
  31. package/src/components/WfoWorkflowUserGuide/styles.ts +55 -7
  32. package/src/configuration/constants.ts +1 -1
  33. package/src/configuration/version.ts +1 -1
  34. package/src/hooks/useStoredTableConfig.ts +1 -0
  35. package/src/messages/en-GB.json +3 -1
  36. package/src/messages/nl-NL.json +4 -2
  37. package/src/pages/WfoSearchPocPage.tsx +1 -1
  38. package/src/pages/tasks/WfoTasksListPage.tsx +1 -0
  39. package/src/types/types.ts +11 -11
  40. package/src/utils/getDefaultTableConfig.ts +2 -0
@@ -0,0 +1,120 @@
1
+ /**
2
+ * The expanded ("match details") row under each data row hides itself with display: none and
3
+ * is revealed by sibling selectors that WfoTable puts on the data row: always when
4
+ * showExpandedRows is set, and on hover/focus otherwise. These tests pin the whole mechanism
5
+ * down at the DOM level: the detail row must be the data row's next sibling, the reveal rules
6
+ * must be emitted, and their selectors must actually match the detail row.
7
+ */
8
+ import React from 'react';
9
+
10
+ import { css } from '@emotion/react';
11
+ import '@testing-library/jest-dom';
12
+ import { render, screen } from '@testing-library/react';
13
+
14
+ import { ColumnType, WfoTable, WfoTableColumnConfig } from './WfoTable';
15
+
16
+ jest.mock('next-intl', () => ({
17
+ useTranslations: () => (key: string) => key,
18
+ }));
19
+
20
+ type Item = { id: string; name: string };
21
+
22
+ const data: Item[] = [
23
+ { id: 'row-1', name: 'First row' },
24
+ { id: 'row-2', name: 'Second row' },
25
+ ];
26
+
27
+ const columnConfig: WfoTableColumnConfig<Item> = {
28
+ name: {
29
+ columnType: ColumnType.DATA,
30
+ label: 'Name',
31
+ },
32
+ };
33
+
34
+ // Mimics WfoExpandingSearchRow: a <tr> that hides itself
35
+ const hideStyle = css({ display: 'none' });
36
+ const DetailRow = ({ text }: { text: string }) => (
37
+ <tr css={hideStyle}>
38
+ <td>{text}</td>
39
+ </tr>
40
+ );
41
+
42
+ const rowExpandingConfiguration = {
43
+ uniqueRowId: 'id' as keyof WfoTableColumnConfig<Item>,
44
+ uniqueRowIdToExpandedRowMap: {
45
+ 'row-1': <DetailRow text="detail-1" />,
46
+ 'row-2': <DetailRow text="detail-2" />,
47
+ },
48
+ };
49
+
50
+ // Emotion may insert rules through the CSSOM, leaving <style> tags without text content, so
51
+ // read the rules from document.styleSheets. Returns [selectorText, display] pairs, with the
52
+ // selector whitespace stripped since the CSSOM normalizes it.
53
+ const getDisplayRules = () =>
54
+ Array.from(document.styleSheets)
55
+ .flatMap((sheet) => Array.from(sheet.cssRules))
56
+ .filter((rule): rule is CSSStyleRule => 'selectorText' in rule)
57
+ .map((rule): [string, string] => [rule.selectorText.replace(/\s+/g, ''), rule.style.display])
58
+ .filter(([, display]) => Boolean(display));
59
+
60
+ const getRowPair = () => {
61
+ const dataRow = screen.getByText('First row').closest('tr');
62
+ const detailRow = dataRow?.nextElementSibling;
63
+ return { dataRow, detailRow };
64
+ };
65
+
66
+ // The reveal selectors resolve '&' to the emotion class composed on the data row
67
+ const getDataRowEmotionClass = (dataRow: HTMLTableRowElement) => {
68
+ const emotionClass = Array.from(dataRow.classList).find((className) => className.startsWith('css-'));
69
+ expect(emotionClass).toBeDefined();
70
+ return emotionClass;
71
+ };
72
+
73
+ describe('WfoTable expanded row reveal', () => {
74
+ it('renders the detail row as next sibling of its data row, hidden by its own style', () => {
75
+ render(
76
+ <WfoTable<Item> data={data} columnConfig={columnConfig} rowExpandingConfiguration={rowExpandingConfiguration} />,
77
+ );
78
+
79
+ const { dataRow, detailRow } = getRowPair();
80
+ expect(dataRow).toBeInTheDocument();
81
+ expect(detailRow).toHaveTextContent('detail-1');
82
+
83
+ const detailRowClass = Array.from(detailRow!.classList).find((className) => className.startsWith('css-'));
84
+ expect(getDisplayRules()).toContainEqual([`.${detailRowClass}`, 'none']);
85
+ });
86
+
87
+ it('reveals every detail row through the sibling selector when showExpandedRows is set', () => {
88
+ render(
89
+ <WfoTable<Item>
90
+ data={data}
91
+ columnConfig={columnConfig}
92
+ rowExpandingConfiguration={rowExpandingConfiguration}
93
+ showExpandedRows
94
+ />,
95
+ );
96
+
97
+ const { dataRow, detailRow } = getRowPair();
98
+ const emotionClass = getDataRowEmotionClass(dataRow!);
99
+
100
+ expect(getDisplayRules()).toContainEqual([`.${emotionClass}+tr`, 'table-row']);
101
+ expect(detailRow!.matches(`.${emotionClass} + tr`)).toBe(true);
102
+ });
103
+
104
+ it('reveals a detail row on hover/focus of the data row or of the detail row itself when showExpandedRows is not set', () => {
105
+ render(
106
+ <WfoTable<Item> data={data} columnConfig={columnConfig} rowExpandingConfiguration={rowExpandingConfiguration} />,
107
+ );
108
+
109
+ const { dataRow, detailRow } = getRowPair();
110
+ const emotionClass = getDataRowEmotionClass(dataRow!);
111
+ const displayRules = getDisplayRules();
112
+
113
+ expect(displayRules).toContainEqual([`.${emotionClass}:hover+tr,.${emotionClass}:focus-within+tr`, 'table-row']);
114
+ // The rule that keeps the row open while hovering the revealed row itself (flicker fix)
115
+ expect(displayRules).toContainEqual([`.${emotionClass}+tr:hover,.${emotionClass}+tr:focus-within`, 'table-row']);
116
+
117
+ // :hover cannot be simulated in jsdom; verify the selectors structurally instead
118
+ expect(detailRow!.matches(`.${emotionClass} + tr`)).toBe(true);
119
+ });
120
+ });
@@ -160,8 +160,13 @@ export const getWfoTableStyles = ({ theme, isDarkModeActive }: WfoThemeHelpers)
160
160
  '.eui-xScroll': { display: 'flex', justifyContent: 'flex-start' },
161
161
  });
162
162
 
163
+ const showExpandedRowStyle = css({
164
+ '& + tr': { display: 'table-row' },
165
+ });
166
+
163
167
  const toggleExpandedRowOnHoverStyle = css({
164
168
  '&:hover + tr, &:focus-within + tr': { display: 'table-row' },
169
+ '& + tr:hover, & + tr:focus-within': { display: 'table-row' },
165
170
  });
166
171
 
167
172
  return {
@@ -181,6 +186,7 @@ export const getWfoTableStyles = ({ theme, isDarkModeActive }: WfoThemeHelpers)
181
186
  dragAndDropStyle,
182
187
  paginationStyle,
183
188
  setWidth,
189
+ showExpandedRowStyle,
184
190
  toggleExpandedRowOnHoverStyle,
185
191
  };
186
192
  };
@@ -3,6 +3,7 @@ import { TableColumnKeys } from './columns';
3
3
  export type StoredTableConfig<T> = {
4
4
  hiddenColumns: TableColumnKeys<T>;
5
5
  selectedPageSize: number;
6
+ showMatchDetails?: boolean;
6
7
  };
7
8
 
8
9
  export const isValidLocalStorageTableConfig = <T>(object: StoredTableConfig<T>): object is StoredTableConfig<T> =>
@@ -57,7 +57,7 @@ export const getTimelineStyles = ({ theme }: WfoThemeHelpers) => {
57
57
  paddingLeft: theme.font.baseline * 4,
58
58
  paddingRight: theme.font.baseline * 4,
59
59
  position: 'sticky',
60
- top: timelineOutlineWidthPx,
60
+ top: theme.base / 4,
61
61
  zIndex: 2, // Some EUI components have a zIndex
62
62
  display: 'flex',
63
63
 
@@ -29,9 +29,15 @@ export const WfoPageWithUserGuide = ({ workflowName, children }: WfoFormWithUser
29
29
  );
30
30
 
31
31
  return (
32
- <EuiFlexGroup gutterSize="s" direction={isBigScreen ? 'row' : 'column'}>
32
+ <EuiFlexGroup
33
+ gutterSize="s"
34
+ direction={isBigScreen ? 'row' : 'column'}
35
+ alignItems={isBigScreen ? 'flexStart' : 'stretch'}
36
+ >
33
37
  {!isBigScreen && workflowGuideExpandablePanel}
34
- <EuiFlexItem grow={true}>{children}</EuiFlexItem>
38
+ <EuiFlexItem grow={true} css={{ minWidth: 0 }}>
39
+ {children}
40
+ </EuiFlexItem>
35
41
  {isBigScreen && workflowGuideExpandablePanel}
36
42
  </EuiFlexGroup>
37
43
  );
@@ -29,6 +29,7 @@ interface WfoUserGuideToggleStripProps {
29
29
  ariaLabel: string;
30
30
  isBigScreen: boolean;
31
31
  noLeadingBorder?: boolean;
32
+ sticky?: boolean;
32
33
  children: ReactNode;
33
34
  }
34
35
 
@@ -37,37 +38,51 @@ const WfoWorkflowGuideToggleStrip = ({
37
38
  ariaLabel,
38
39
  isBigScreen,
39
40
  noLeadingBorder,
41
+ sticky,
40
42
  children,
41
43
  }: WfoUserGuideToggleStripProps) => {
42
44
  const {
43
45
  fullHeightStyle,
46
+ stickyStripContainerStyle,
47
+ stripIconStyle,
48
+ stickyPanelFillStyle,
44
49
  toggleStripContainerStyle,
45
50
  toggleStripContainerHorizontalStyle,
51
+ stickyHorizontalStripContainerStyle,
46
52
  toggleStripPanelStyle,
47
53
  noLeftBorderStyle,
48
54
  noBottomBorderStyle,
49
55
  } = useWithOrchestratorTheme(getStyles);
50
56
 
57
+ const containerStyle =
58
+ isBigScreen ?
59
+ sticky ? stickyStripContainerStyle
60
+ : toggleStripContainerStyle
61
+ : sticky ? stickyHorizontalStripContainerStyle
62
+ : toggleStripContainerHorizontalStyle;
63
+
51
64
  return (
52
- <EuiFlexItem
53
- grow={false}
54
- onClick={onToggle}
55
- aria-label={ariaLabel}
56
- css={isBigScreen ? toggleStripContainerStyle : toggleStripContainerHorizontalStyle}
57
- >
65
+ <EuiFlexItem grow={false} onClick={onToggle} aria-label={ariaLabel} css={containerStyle}>
58
66
  <EuiPanel
59
67
  hasShadow={false}
60
- css={[toggleStripPanelStyle, noLeadingBorder && (isBigScreen ? noLeftBorderStyle : noBottomBorderStyle)]}
68
+ css={[
69
+ toggleStripPanelStyle,
70
+ sticky && stickyPanelFillStyle,
71
+ noLeadingBorder && (isBigScreen ? noLeftBorderStyle : noBottomBorderStyle),
72
+ ]}
61
73
  >
62
- <EuiFlexGroup
63
- direction={isBigScreen ? 'column' : 'row'}
64
- alignItems="center"
65
- gutterSize="s"
66
- justifyContent="center"
67
- css={fullHeightStyle}
68
- >
69
- {children}
70
- </EuiFlexGroup>
74
+ {isBigScreen ?
75
+ <div css={stripIconStyle}>{children}</div>
76
+ : <EuiFlexGroup
77
+ direction="row"
78
+ alignItems="center"
79
+ gutterSize="s"
80
+ justifyContent="center"
81
+ css={fullHeightStyle}
82
+ >
83
+ {children}
84
+ </EuiFlexGroup>
85
+ }
71
86
  </EuiPanel>
72
87
  </EuiFlexItem>
73
88
  );
@@ -82,12 +97,13 @@ const WfoWorkflowGuideMarkdown = ({ workflowName, isBigScreen }: { workflowName:
82
97
 
83
98
  return (
84
99
  <div css={isBigScreen ? guideBodyStyle : guideStackedBodyStyle}>
85
- {(isLoading && <EuiLoadingSpinner size="m" />)
86
- || ((isError || !content) && <EuiText color="subdued">{t('noGuideAvailable')}</EuiText>) || (
87
- <EuiPanel paddingSize="m" hasShadow css={isBigScreen ? guidePanelStyle : guideStackedPanelStyle}>
100
+ {(isLoading && <EuiLoadingSpinner size="m" />) || (
101
+ <EuiPanel paddingSize="m" hasShadow css={isBigScreen ? guidePanelStyle : guideStackedPanelStyle}>
102
+ {((isError || !content) && <EuiText color="subdued">{t('noGuideAvailable')}</EuiText>) || (
88
103
  <EuiMarkdownFormat>{content}</EuiMarkdownFormat>
89
- </EuiPanel>
90
- )}
104
+ )}
105
+ </EuiPanel>
106
+ )}
91
107
  </div>
92
108
  );
93
109
  };
@@ -97,14 +113,7 @@ export const WfoWorkflowGuideExpandablePanel = ({ workflowName, isExpanded, onTo
97
113
  const { fullHeightStyle, guideExpandedItemStyle, guideExpandedFillStyle } = useWithOrchestratorTheme(getStyles);
98
114
  const isBigScreen = useIsWithinBreakpoints(['xl', 'xxl']);
99
115
 
100
- const OpenGuideButton = () => (
101
- <EuiFlexItem grow={false}>
102
- <EuiFlexGroup gutterSize="xs" alignItems="center" direction={isBigScreen ? 'column' : 'row'}>
103
- <EuiIcon type={isBigScreen ? 'arrowLeft' : 'arrowDown'} size="xxl" color="primary" />
104
- <EuiIcon type={'info'} size="xxl" color="primary" />
105
- </EuiFlexGroup>
106
- </EuiFlexItem>
107
- );
116
+ const OpenGuideButton = () => <EuiIcon type={'info'} size="xxl" color="primary" />;
108
117
 
109
118
  const CloseGuideButton = () => (
110
119
  <EuiFlexItem grow={false}>
@@ -114,7 +123,7 @@ export const WfoWorkflowGuideExpandablePanel = ({ workflowName, isExpanded, onTo
114
123
 
115
124
  if (!isExpanded) {
116
125
  return (
117
- <WfoWorkflowGuideToggleStrip onToggle={onToggle} ariaLabel={t('show')} isBigScreen={isBigScreen}>
126
+ <WfoWorkflowGuideToggleStrip onToggle={onToggle} ariaLabel={t('show')} isBigScreen={isBigScreen} sticky>
118
127
  <OpenGuideButton />
119
128
  </WfoWorkflowGuideToggleStrip>
120
129
  );
@@ -3,6 +3,11 @@ import { css } from '@emotion/react';
3
3
  import { WfoThemeHelpers } from '@/hooks';
4
4
 
5
5
  export const getStyles = ({ theme }: WfoThemeHelpers) => {
6
+ const navigationHeight = theme.base * 3;
7
+ const timelineStickyHeight = theme.base * 4;
8
+ const stripBottomGap = theme.base;
9
+ const stripMinHeight = theme.base * 40;
10
+
6
11
  const fullHeightStyle = css({
7
12
  height: '100%',
8
13
  });
@@ -12,25 +17,56 @@ export const getStyles = ({ theme }: WfoThemeHelpers) => {
12
17
  cursor: 'pointer',
13
18
  });
14
19
 
20
+ const stickyStripContainerStyle = css({
21
+ width: theme.base * 4,
22
+ cursor: 'pointer',
23
+ alignSelf: 'stretch',
24
+ position: 'sticky',
25
+ top: timelineStickyHeight,
26
+ minHeight: stripMinHeight,
27
+ maxHeight: `calc(100vh - ${navigationHeight + timelineStickyHeight + stripBottomGap}px)`,
28
+ });
29
+
30
+ const stripIconStyle = css({
31
+ display: 'flex',
32
+ justifyContent: 'center',
33
+ });
34
+
35
+ const stickyPanelFillStyle = css({
36
+ flexGrow: 1,
37
+ });
38
+
15
39
  const toggleStripContainerHorizontalStyle = css({
16
40
  width: '100%',
17
41
  height: theme.base * 4,
18
42
  cursor: 'pointer',
19
43
  });
20
44
 
45
+ const stickyHorizontalStripContainerStyle = css({
46
+ width: '100%',
47
+ height: theme.base * 4,
48
+ cursor: 'pointer',
49
+ position: 'sticky',
50
+ top: timelineStickyHeight,
51
+ zIndex: 2,
52
+ });
53
+
21
54
  const toggleStripPanelStyle = css({
22
55
  height: '100%',
23
56
  backgroundColor: theme.colors.backgroundBasePrimary,
24
- border: `2px dashed ${theme.colors.backgroundLightPrimary}`,
25
- transition: 'box-shadow 100ms ease-in-out, border-style 100ms ease-in-out',
57
+ border: `2px solid ${theme.colors.backgroundLightPrimary}`,
58
+ transition: 'border-color 100ms ease-in-out',
26
59
  '&:hover': {
27
- borderStyle: 'solid',
28
- boxShadow: `0 0 0 2px ${theme.colors.backgroundBasePrimary}`,
60
+ borderColor: theme.colors.borderBasePrimary,
29
61
  },
30
62
  });
31
63
 
32
64
  const guideExpandedItemStyle = css({
33
- position: 'relative',
65
+ alignSelf: 'stretch',
66
+ position: 'sticky',
67
+ top: timelineStickyHeight,
68
+ minHeight: stripMinHeight,
69
+ maxHeight: `calc(100vh - ${navigationHeight + timelineStickyHeight + stripBottomGap}px)`,
34
70
  });
35
71
 
36
72
  const guideExpandedFillStyle = css({
@@ -41,8 +77,10 @@ export const getStyles = ({ theme }: WfoThemeHelpers) => {
41
77
  const guidePanelStyle = css({
42
78
  height: '100%',
43
79
  overflowY: 'auto',
44
- border: `2px dashed ${theme.colors.backgroundLightPrimary}`,
80
+ border: `2px solid ${theme.colors.backgroundLightPrimary}`,
45
81
  borderRightWidth: 0,
82
+ borderTopRightRadius: 0,
83
+ borderBottomRightRadius: 0,
46
84
  });
47
85
 
48
86
  const guideBodyStyle = css({
@@ -54,10 +92,14 @@ export const getStyles = ({ theme }: WfoThemeHelpers) => {
54
92
 
55
93
  const noLeftBorderStyle = css({
56
94
  borderLeftWidth: 0,
95
+ borderTopLeftRadius: 0,
96
+ borderBottomLeftRadius: 0,
57
97
  });
58
98
 
59
99
  const noBottomBorderStyle = css({
60
100
  borderBottomWidth: 0,
101
+ borderBottomLeftRadius: 0,
102
+ borderBottomRightRadius: 0,
61
103
  });
62
104
 
63
105
  const guideStackedBodyStyle = css({
@@ -66,14 +108,20 @@ export const getStyles = ({ theme }: WfoThemeHelpers) => {
66
108
  });
67
109
 
68
110
  const guideStackedPanelStyle = css({
69
- border: `2px dashed ${theme.colors.backgroundLightPrimary}`,
111
+ border: `2px solid ${theme.colors.backgroundLightPrimary}`,
70
112
  borderTopWidth: 0,
113
+ borderTopLeftRadius: 0,
114
+ borderTopRightRadius: 0,
71
115
  });
72
116
 
73
117
  return {
74
118
  fullHeightStyle,
75
119
  toggleStripContainerStyle,
120
+ stickyStripContainerStyle,
121
+ stripIconStyle,
122
+ stickyPanelFillStyle,
76
123
  toggleStripContainerHorizontalStyle,
124
+ stickyHorizontalStripContainerStyle,
77
125
  toggleStripPanelStyle,
78
126
  noLeftBorderStyle,
79
127
  noBottomBorderStyle,
@@ -34,7 +34,7 @@ export const METADATA_PRODUCT_ENDPOINT = 'products';
34
34
  export const METADATA_PRODUCT_BLOCK_ENDPOINT = 'product_blocks';
35
35
  export const METADATA_RESOURCE_TYPE_ENDPOINT = 'resource_types';
36
36
  export const METADATA_WORKFLOWS_ENDPOINT = 'workflows';
37
- export const METADATA_SCHEDULES_ENDPOINT = 'schedules';
37
+ export const METADATA_SCHEDULES_ENDPOINT = 'schedules/';
38
38
 
39
39
  //search
40
40
  export const SEARCH_QUERY_RESULTS_ENDPOINT = 'search/queries';
@@ -1 +1 @@
1
- export const ORCHESTRATOR_UI_LIBRARY_VERSION = '8.7.3';
1
+ export const ORCHESTRATOR_UI_LIBRARY_VERSION = '8.8.1';
@@ -23,6 +23,7 @@ export const useStoredTableConfig = <T>(localeStorageKey: string) => {
23
23
  if (storedConfig) {
24
24
  tableConfig.hiddenColumns = storedConfig.hiddenColumns;
25
25
  tableConfig.selectedPageSize = storedConfig.selectedPageSize;
26
+ tableConfig.showMatchDetails = storedConfig.showMatchDetails;
26
27
  }
27
28
  return tableConfig;
28
29
  } catch {
@@ -24,6 +24,7 @@
24
24
  "searchModalText": "<p>Different options are available from free text search covering all data columns, or column specific filtering. Note that: <p></p><ul><li>Hidden columns are included</li> <li>Searching is case-insensitive</li> <li>Ordering of words does not matter (unless it is a Phrase)</li> <li>TSV (text search vector) search only available for subscriptions table</li></ul></p> <p>For example:</p> <li><b>\"l2vpn\"</b> – free text search</li> <li><b>tag:l2vpn</b> – search in a specific column</li><li><b>tag:lp description:test</b> – search in multiple columns</li><li><b>tag:(lp|lr)</b> – multiselect within 1 column</li><li><b>-tag:lp</b> – negated filter</li><li><b>test*</b> – prefix filter</li> <p></p><p><b>Note:</b> Search words containing characters `|-*():\"` may not be valid, as they are part of the search query grammar</p><p>Invalid search strings are for example:</p><ul><li>2a10:e300:fff0::/48</li> <li>\"node123(planned)\"</li> <li>\"node123|planned\"</li></ul>",
25
25
  "searchModalTitle": "Search string options",
26
26
  "showAllColumnsInDetailView": "Show all columns in detail view",
27
+ "showMatchDetails": "Show match details",
27
28
  "tableSettings": "Table settings",
28
29
  "unauthorizedPage": "You are not authorized to see this page",
29
30
  "unknownError": "Unknown error"
@@ -520,7 +521,8 @@
520
521
  "title": "Subscriptions",
521
522
  "workflowsTab": {
522
523
  "startWithNewestLabel": "Start with newest first",
523
- "startWithOldestLabel": "Start with oldest first"
524
+ "startWithOldestLabel": "Start with oldest first",
525
+ "hideValidateTasks": "Hide validation tasks"
524
526
  }
525
527
  },
526
528
  "index": {
@@ -24,6 +24,7 @@
24
24
  "searchModalText": "<p>Er zijn verschillende opties beschikbaar: zoeken in vrije tekst voor alle datakolommen en specifiek per kolom te filteren. Houd er rekening mee dat: </p><p></p><ul><li>Verborgen kolommen zijn inbegrepen</li> <li>Zoeken is niet hoofdlettergevoelig</li> <li>De volgorde van woorden doet er niet toe (tenzij het een quote)</li> <li>TSV (text search vector) zoekactie alleen beschikbaar voor subscription tabel</li></ul><p>Bijvoorbeeld:</p> <li><b>\"l2vpn\"</b> – vrije tekst search</li> <li><b>tag:l2vpn</b> – zoeken in een specifieke kolom</li> <li><b>tag:lp beschrijving: test</b> – zoeken in meerdere kolommen</li><li><b>tag:(lp|lr)</b> – multi select binnen 1 kolom</li> <li><b>-tag:lp</b> – omgekeerd filteren</li> <li><b>test*</b> – prefix filter</li> <p></p><p><b>Opmerking:</b> Zoeken op woorden die tekens `|-*():\"` bevatten, zijn mogelijk niet geldig, omdat ze deel uitmaken van de grammatica van de zoekfunctie</p><p>Ongeldige zoekwoorden zijn bijvoorbeeld:</p><ul><li>2a10:e300:fff0::/48</li> <li>\"node123(gepland)\"</li> <li>\"node123|gepland\"</li></ul>",
25
25
  "searchModalTitle": "Zoekwoorden opties",
26
26
  "showAllColumnsInDetailView": "Toon alle kolommen in detailweergave",
27
+ "showMatchDetails": "Toon overeenkomstdetails",
27
28
  "tableSettings": "Tabel instellingen",
28
29
  "unauthorizedPage": "Niet geautoriseerd om deze pagina te bekijken",
29
30
  "unknownError": "Onbekende fout"
@@ -519,8 +520,9 @@
519
520
  "tag": "Tag",
520
521
  "title": "Subscriptions",
521
522
  "workflowsTab": {
522
- "startWithNewestLabel": "Start met nieuwste eerst",
523
- "startWithOldestLabel": "Start met oudste eerst"
523
+ "startWithNewestLabel": "Start met nieuwste",
524
+ "startWithOldestLabel": "Start met oudste",
525
+ "hideValidateTasks": "Verberg validatie taken"
524
526
  }
525
527
  },
526
528
  "index": {
@@ -88,7 +88,6 @@ const getDataFromResponse = <T extends object>(
88
88
  },
89
89
  {} as Record<string, ReactNode>,
90
90
  ),
91
- shouldOnlyShowOnHover: true,
92
91
  };
93
92
 
94
93
  const items: T[] = responseColumns.map((responseColumn) => {
@@ -508,6 +507,7 @@ export const WfoSearchPocPage = () => {
508
507
  data={subscriptionListItems}
509
508
  rowExpandingConfiguration={rowExpandingConfiguration}
510
509
  defaultHiddenColumns={tableDefaults?.hiddenColumns}
510
+ defaultShowMatchDetails={tableDefaults?.showMatchDetails}
511
511
  filterString={filterString}
512
512
  handleSearch={handleApplyFilter}
513
513
  isLoading={isFetching}
@@ -110,6 +110,7 @@ export const WfoTasksListPage = () => {
110
110
  'productName',
111
111
  'customer',
112
112
  'customerAbbreviation',
113
+ 'note',
113
114
  'subscriptions',
114
115
  'createdBy',
115
116
  'assignee',
@@ -134,12 +134,12 @@ export interface ProductDefinition {
134
134
  export type ProductsSummary = Pick<ProductDefinition, 'name'> & SubscriptionsResult<never>;
135
135
 
136
136
  export enum WorkflowTarget {
137
- CREATE = 'create',
138
- MODIFY = 'modify',
139
- TERMINATE = 'terminate',
140
- SYSTEM = 'system',
141
- VALIDATE = 'validate',
142
- RECONCILE = 'reconcile',
137
+ CREATE = 'CREATE',
138
+ MODIFY = 'MODIFY',
139
+ TERMINATE = 'TERMINATE',
140
+ SYSTEM = 'SYSTEM',
141
+ VALIDATE = 'VALIDATE',
142
+ RECONCILE = 'RECONCILE',
143
143
  }
144
144
 
145
145
  export type Process = {
@@ -624,11 +624,11 @@ export type SubscriptionActions = {
624
624
  reason?: string;
625
625
  locked_relations?: string[];
626
626
  locked_relations_detail?: SubscriptionRelation[];
627
- modify: SubscriptionAction[];
628
- terminate: SubscriptionAction[];
629
- system: SubscriptionAction[];
630
- validate: SubscriptionAction[];
631
- reconcile: SubscriptionAction[];
627
+ [WorkflowTarget.MODIFY]: SubscriptionAction[];
628
+ [WorkflowTarget.TERMINATE]: SubscriptionAction[];
629
+ [WorkflowTarget.SYSTEM]: SubscriptionAction[];
630
+ [WorkflowTarget.VALIDATE]: SubscriptionAction[];
631
+ [WorkflowTarget.RECONCILE]: SubscriptionAction[];
632
632
  };
633
633
 
634
634
  export enum CacheTagType {
@@ -19,10 +19,12 @@ import { ProductBlockDefinition, ProductDefinition, ResourceTypeDefinition, Work
19
19
  function getTableConfig<T>(
20
20
  hiddenColumns: (keyof T)[] = [],
21
21
  selectedPageSize = DEFAULT_PAGE_SIZE,
22
+ showMatchDetails = false,
22
23
  ): StoredTableConfig<T> {
23
24
  return {
24
25
  selectedPageSize,
25
26
  hiddenColumns,
27
+ showMatchDetails,
26
28
  };
27
29
  }
28
30