@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.
- package/.turbo/turbo-build.log +8 -8
- package/.turbo/turbo-lint.log +1 -1
- package/.turbo/turbo-test.log +16 -14
- package/CHANGELOG.md +22 -0
- package/dist/index.d.ts +23 -18
- package/dist/index.js +389 -267
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/WfoBadges/WfoWorkflowTargetBadge/WfoWorkflowTargetBadge.tsx +2 -2
- package/src/components/WfoContentHeader/WfoContentHeader.tsx +1 -1
- package/src/components/WfoInlineNoteEdit/WfoProcessListNoteEdit.spec.tsx +35 -0
- package/src/components/WfoInlineNoteEdit/WfoProcessListNoteEdit.tsx +7 -9
- package/src/components/WfoProcessList/WfoProcessListDeltaPopover.tsx +1 -1
- package/src/components/WfoProcessList/WfoProcessesList.tsx +7 -5
- package/src/components/WfoSubscription/WfoProcessesTimeline.tsx +21 -7
- package/src/components/WfoSubscription/WfoSubscriptionActions/WfoSubscriptionActions.tsx +25 -9
- package/src/components/WfoSubscription/WfoSubscriptionGeneralSections/WfoSubscriptionDetailSection.tsx +1 -1
- package/src/components/WfoSubscription/styles.ts +6 -0
- package/src/components/WfoSubscription/utils/utils.ts +2 -4
- package/src/components/WfoTable/WfoStructuredSearchTable/WfoExpandingSearchRow.tsx +0 -1
- package/src/components/WfoTable/WfoStructuredSearchTable/WfoStructuredSearchTable.tsx +40 -1
- package/src/components/WfoTable/WfoStructuredSearchTable/styles.ts +8 -9
- package/src/components/WfoTable/WfoTable/WfoTable.tsx +5 -1
- package/src/components/WfoTable/WfoTable/WfoTableDataRows.tsx +11 -2
- package/src/components/WfoTable/WfoTable/WfoTableExpandedRowReveal.spec.tsx +120 -0
- package/src/components/WfoTable/WfoTable/styles.ts +6 -0
- package/src/components/WfoTable/utils/tableConfigPersistence.ts +1 -0
- package/src/components/WfoTimeline/styles.ts +1 -1
- package/src/components/WfoWorkflowUserGuide/WfoPageWithUserGuide.tsx +8 -2
- package/src/components/WfoWorkflowUserGuide/WfoWorkflowGuideExpandablePanel.tsx +39 -30
- package/src/components/WfoWorkflowUserGuide/styles.ts +55 -7
- package/src/configuration/constants.ts +1 -1
- package/src/configuration/version.ts +1 -1
- package/src/hooks/useStoredTableConfig.ts +1 -0
- package/src/messages/en-GB.json +3 -1
- package/src/messages/nl-NL.json +4 -2
- package/src/pages/WfoSearchPocPage.tsx +1 -1
- package/src/pages/tasks/WfoTasksListPage.tsx +1 -0
- package/src/types/types.ts +11 -11
- 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:
|
|
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
|
|
32
|
+
<EuiFlexGroup
|
|
33
|
+
gutterSize="s"
|
|
34
|
+
direction={isBigScreen ? 'row' : 'column'}
|
|
35
|
+
alignItems={isBigScreen ? 'flexStart' : 'stretch'}
|
|
36
|
+
>
|
|
33
37
|
{!isBigScreen && workflowGuideExpandablePanel}
|
|
34
|
-
<EuiFlexItem grow={true}
|
|
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={[
|
|
68
|
+
css={[
|
|
69
|
+
toggleStripPanelStyle,
|
|
70
|
+
sticky && stickyPanelFillStyle,
|
|
71
|
+
noLeadingBorder && (isBigScreen ? noLeftBorderStyle : noBottomBorderStyle),
|
|
72
|
+
]}
|
|
61
73
|
>
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
87
|
-
<
|
|
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
|
-
|
|
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
|
|
25
|
-
transition: '
|
|
57
|
+
border: `2px solid ${theme.colors.backgroundLightPrimary}`,
|
|
58
|
+
transition: 'border-color 100ms ease-in-out',
|
|
26
59
|
'&:hover': {
|
|
27
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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.
|
|
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 {
|
package/src/messages/en-GB.json
CHANGED
|
@@ -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": {
|
package/src/messages/nl-NL.json
CHANGED
|
@@ -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
|
|
523
|
-
"startWithOldestLabel": "Start met oudste
|
|
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}
|
package/src/types/types.ts
CHANGED
|
@@ -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 = '
|
|
138
|
-
MODIFY = '
|
|
139
|
-
TERMINATE = '
|
|
140
|
-
SYSTEM = '
|
|
141
|
-
VALIDATE = '
|
|
142
|
-
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
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
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
|
|