pixel-react 1.1.4 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. package/lib/components/AddResourceButton/type.d.ts +1 -1
  2. package/lib/components/AllProjectsDropdown/AllProjectsDropdown.d.ts +2 -1
  3. package/lib/components/AllProjectsDropdown/AllProjectsDropdown.stories.d.ts +1 -0
  4. package/lib/components/AllProjectsDropdown/types.d.ts +10 -0
  5. package/lib/components/Button/Button.stories.d.ts +1 -0
  6. package/lib/components/Button/types.d.ts +1 -1
  7. package/lib/components/Drawer/Drawer.stories.d.ts +3 -0
  8. package/lib/components/Drawer/Types.d.ts +25 -1
  9. package/lib/components/Icon/Icon.d.ts +1 -1
  10. package/lib/components/MachineInputField/MachineInputField.d.ts +4 -0
  11. package/lib/components/MachineInputField/MachineInputField.stories.d.ts +6 -0
  12. package/lib/components/MachineInputField/index.d.ts +1 -0
  13. package/lib/components/MachineInputField/types.d.ts +11 -0
  14. package/lib/components/MenuOption/MenuOption.d.ts +1 -1
  15. package/lib/components/MenuOption/MenuOption.stories.d.ts +1 -0
  16. package/lib/components/MenuOption/types.d.ts +7 -0
  17. package/lib/components/Modal/types.d.ts +1 -0
  18. package/lib/components/SequentialConnectingBranch/SequentialConnectingBranch.d.ts +4 -0
  19. package/lib/components/SequentialConnectingBranch/SequentialConnectingBranch.stories.d.ts +6 -0
  20. package/lib/components/SequentialConnectingBranch/components/AddBrowserModal/AddBrowserModal.d.ts +4 -0
  21. package/lib/components/SequentialConnectingBranch/components/AddBrowserModal/types.d.ts +3 -0
  22. package/lib/components/SequentialConnectingBranch/components/Branches/Branches.d.ts +4 -0
  23. package/lib/components/SequentialConnectingBranch/components/Branches/types.d.ts +16 -0
  24. package/lib/components/SequentialConnectingBranch/components/ConnectingBranches/ConnectingBranches.d.ts +4 -0
  25. package/lib/components/SequentialConnectingBranch/components/ConnectingBranches/types.d.ts +9 -0
  26. package/lib/components/SequentialConnectingBranch/components/DatasetListModal/DatasetListModal.d.ts +4 -0
  27. package/lib/components/SequentialConnectingBranch/components/DatasetListModal/types.d.ts +3 -0
  28. package/lib/components/SequentialConnectingBranch/index.d.ts +1 -0
  29. package/lib/components/SequentialConnectingBranch/types.d.ts +32 -0
  30. package/lib/components/Tabs/types.d.ts +1 -0
  31. package/lib/index.d.ts +99 -7
  32. package/lib/index.esm.js +789 -174
  33. package/lib/index.esm.js.map +1 -1
  34. package/lib/index.js +790 -173
  35. package/lib/index.js.map +1 -1
  36. package/lib/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +1 -1
  38. package/src/assets/Themes/BaseTheme.scss +18 -2
  39. package/src/assets/Themes/DarkTheme.scss +11 -3
  40. package/src/assets/icons/add_locator.svg +5 -0
  41. package/src/assets/icons/android.svg +9 -0
  42. package/src/assets/icons/browser_stack.svg +9 -0
  43. package/src/assets/icons/chrome.svg +12 -0
  44. package/src/assets/icons/dataset_list.svg +3 -0
  45. package/src/assets/icons/drag_icon.svg +5 -0
  46. package/src/assets/icons/label_plus.svg +3 -0
  47. package/src/assets/icons/mac.svg +9 -0
  48. package/src/assets/icons/manual_locator.svg +8 -0
  49. package/src/assets/icons/windows.svg +6 -0
  50. package/src/assets/styles/_colors.scss +4 -4
  51. package/src/components/AddResourceButton/type.ts +1 -1
  52. package/src/components/AllProjectsDropdown/AllProjectsDropdown.scss +2 -2
  53. package/src/components/AllProjectsDropdown/AllProjectsDropdown.stories.tsx +99 -1
  54. package/src/components/AllProjectsDropdown/AllProjectsDropdown.tsx +30 -56
  55. package/src/components/AllProjectsDropdown/types.ts +10 -0
  56. package/src/components/Button/Button.scss +4 -0
  57. package/src/components/Button/Button.stories.tsx +7 -0
  58. package/src/components/Button/types.ts +2 -2
  59. package/src/components/Drawer/Drawer.scss +22 -11
  60. package/src/components/Drawer/Drawer.stories.tsx +41 -0
  61. package/src/components/Drawer/Drawer.tsx +67 -40
  62. package/src/components/Drawer/Types.ts +25 -1
  63. package/src/components/GridLayout/GridLayout.scss +0 -2
  64. package/src/components/GridLayout/GridLayout.tsx +15 -8
  65. package/src/components/Icon/Icon.tsx +39 -33
  66. package/src/components/Icon/iconList.ts +25 -6
  67. package/src/components/InputWithDropdown/InputWithDropdown.scss +1 -1
  68. package/src/components/InputWithDropdown/InputWithDropdown.tsx +2 -1
  69. package/src/components/MachineInputField/MachineInputField.scss +44 -0
  70. package/src/components/MachineInputField/MachineInputField.stories.tsx +32 -0
  71. package/src/components/MachineInputField/MachineInputField.tsx +71 -0
  72. package/src/components/MachineInputField/index.ts +1 -0
  73. package/src/components/MachineInputField/types.ts +12 -0
  74. package/src/components/MenuOption/MenuOption.scss +14 -0
  75. package/src/components/MenuOption/MenuOption.stories.tsx +21 -0
  76. package/src/components/MenuOption/MenuOption.tsx +5 -3
  77. package/src/components/MenuOption/types.ts +9 -0
  78. package/src/components/MiniModal/MiniModal.tsx +1 -1
  79. package/src/components/Modal/Modal.tsx +2 -0
  80. package/src/components/Modal/modal.scss +2 -2
  81. package/src/components/Modal/types.ts +1 -0
  82. package/src/components/Select/Select.tsx +2 -2
  83. package/src/components/SequentialConnectingBranch/SequentialConnectingBranch.scss +117 -0
  84. package/src/components/SequentialConnectingBranch/SequentialConnectingBranch.stories.tsx +62 -0
  85. package/src/components/SequentialConnectingBranch/SequentialConnectingBranch.tsx +210 -0
  86. package/src/components/SequentialConnectingBranch/components/AddBrowserModal/AddBrowserModal.scss +51 -0
  87. package/src/components/SequentialConnectingBranch/components/AddBrowserModal/AddBrowserModal.tsx +107 -0
  88. package/src/components/SequentialConnectingBranch/components/AddBrowserModal/types.ts +5 -0
  89. package/src/components/SequentialConnectingBranch/components/Branches/Branches.scss +184 -0
  90. package/src/components/SequentialConnectingBranch/components/Branches/Branches.tsx +203 -0
  91. package/src/components/SequentialConnectingBranch/components/Branches/types.ts +18 -0
  92. package/src/components/SequentialConnectingBranch/components/ConnectingBranches/ConnectingBranches.scss +3 -0
  93. package/src/components/SequentialConnectingBranch/components/ConnectingBranches/ConnectingBranches.tsx +66 -0
  94. package/src/components/SequentialConnectingBranch/components/ConnectingBranches/types.ts +10 -0
  95. package/src/components/SequentialConnectingBranch/components/DatasetListModal/DatasetListModal.scss +31 -0
  96. package/src/components/SequentialConnectingBranch/components/DatasetListModal/DatasetListModal.tsx +85 -0
  97. package/src/components/SequentialConnectingBranch/components/DatasetListModal/types.ts +4 -0
  98. package/src/components/SequentialConnectingBranch/index.ts +1 -0
  99. package/src/components/SequentialConnectingBranch/types.ts +42 -0
  100. package/src/components/Tabs/Tabs.stories.tsx +24 -25
  101. package/src/components/Tabs/Tabs.tsx +3 -10
  102. package/src/components/Tabs/types.ts +7 -1
  103. package/src/index.ts +5 -0
@@ -0,0 +1,203 @@
1
+ import classNames from 'classnames';
2
+ import { checkEmpty } from '../../../../utils/checkEmpty/checkEmpty';
3
+ import { BranchesProps } from './types';
4
+ import { Fragment } from 'react/jsx-runtime';
5
+ import { ffid } from '../../../../utils/ffID/ffid';
6
+ import { ExecutionContext } from '../../types';
7
+ import MachineInputField from '../../../MachineInputField';
8
+ import Icon from '../../../Icon';
9
+ import Typography from '../../../Typography';
10
+ import Button from '../../../Button';
11
+ import './Branches.scss';
12
+
13
+ const Branches = ({
14
+ machineInstances,
15
+ rowIndex,
16
+ machineColumnCount,
17
+ machineColumnWidth,
18
+ nextRowMachineInstance,
19
+ previousRowMachineInstance,
20
+ onAddBrowser,
21
+ onDeleteBrowser,
22
+ onAddRunBrowser,
23
+ }: BranchesProps) => {
24
+ const evenRow = rowIndex % 2 === 0;
25
+ const lastMachineInstance = checkEmpty(
26
+ machineInstances[machineColumnCount - 1]
27
+ );
28
+
29
+ const getBorderStyle = (
30
+ currentBranch: ExecutionContext | {} | undefined,
31
+ nextBranch: ExecutionContext | {} | undefined
32
+ ) => {
33
+ if (
34
+ currentBranch &&
35
+ nextBranch &&
36
+ 'id' in currentBranch &&
37
+ 'id' in nextBranch
38
+ ) {
39
+ return currentBranch.id === nextBranch.id ? 'dotted' : 'solid';
40
+ }
41
+ return 'solid';
42
+ };
43
+
44
+ const showMiddleArrow = (index: number) =>
45
+ machineInstances.length - 1 !== index && machineColumnCount > 1;
46
+
47
+ const getGridTemplateColumnStyle = () => {
48
+ if (machineColumnCount === 1) {
49
+ return `24px ${machineColumnWidth}px 24px`;
50
+ }
51
+ return `24px ${machineColumnWidth}px repeat(${
52
+ machineColumnCount - 1
53
+ }, 40px ${machineColumnWidth}px) 24px`;
54
+ };
55
+
56
+ return (
57
+ <div
58
+ className={classNames({
59
+ 'ff-connecting-branch-grid': evenRow,
60
+ 'ff-connecting-branch-grid-reverse': !evenRow,
61
+ })}
62
+ style={{
63
+ gridTemplateColumns: getGridTemplateColumnStyle(),
64
+ }}
65
+ >
66
+ <div className="ff-connecting-branch-start-wrapper">
67
+ <div
68
+ className={classNames({
69
+ 'ff-connecting-branch-arrow': evenRow,
70
+ 'ff-connecting-branch-arrow-reverse': !evenRow,
71
+ })}
72
+ ></div>
73
+ <div
74
+ className={classNames({
75
+ 'ff-connecting-branch-container': evenRow,
76
+ 'ff-connecting-branch-container-reverse': !evenRow,
77
+ })}
78
+ style={{
79
+ border: `1px ${getBorderStyle(
80
+ machineInstances[0],
81
+ previousRowMachineInstance
82
+ )} var(--ff-connecting-branch-color)`,
83
+ borderTop: 'none',
84
+ borderLeft: `${!evenRow && 'none'}`,
85
+ borderRight: `${evenRow && 'none'}`,
86
+ }}
87
+ ></div>
88
+ </div>
89
+ {machineInstances?.map((machineInstance, index) => {
90
+ const {
91
+ executionEnv = 'Local',
92
+ browserName = 'Local',
93
+ browserVersion = '1',
94
+ runCount = 0,
95
+ id = '',
96
+ } = machineInstance as ExecutionContext;
97
+ return (
98
+ <Fragment key={ffid()}>
99
+ {!checkEmpty(machineInstance) ? (
100
+ <div>
101
+ <div className="ff-connecting-branch-input-point-wrapper">
102
+ <div
103
+ className={classNames({
104
+ 'ff-connecting-branch-point': evenRow,
105
+ 'ff-connecting-branch-point-reverse': !evenRow,
106
+ })}
107
+ ></div>
108
+ <MachineInputField
109
+ width="180px"
110
+ runCount={runCount}
111
+ key={ffid()}
112
+ options={[
113
+ { label: executionEnv, type: executionEnv },
114
+ { label: browserVersion, type: browserName },
115
+ ]}
116
+ contentReverse={!evenRow}
117
+ />
118
+ </div>
119
+ <div
120
+ className={classNames({
121
+ 'ff-connecting-branch-datalist': evenRow,
122
+ 'ff-connecting-branch-datalist-reverse': !evenRow,
123
+ })}
124
+ >
125
+ <Icon name="datalist_icon" className="ff-connecting-icon" />
126
+ <Typography
127
+ className="ff-connecting-text"
128
+ color="var(--ff-connecting-branch-color)"
129
+ >
130
+ Dataset List
131
+ </Typography>
132
+ <Icon
133
+ name="plus_icon"
134
+ className="ff-connecting-icon"
135
+ onClick={() => onAddRunBrowser(id)}
136
+ color="var(--ff-connecting-branch-color)"
137
+ />
138
+ <Typography
139
+ className="ff-connecting-text"
140
+ color="var(--ff-connecting-branch-color)"
141
+ >
142
+ Run
143
+ </Typography>
144
+ <Icon
145
+ name="delete"
146
+ className="ff-connecting-delete-icon"
147
+ onClick={() => onDeleteBrowser(id, runCount)}
148
+ color="var(--ff-connecting-branch-delete-color)"
149
+ />
150
+ </div>
151
+ </div>
152
+ ) : (
153
+ <div className="ff-connecting-branch-browser-button">
154
+ <Button
155
+ variant="tertiary"
156
+ label="Browser / Devices"
157
+ onClick={onAddBrowser}
158
+ />
159
+ </div>
160
+ )}
161
+ {showMiddleArrow(index) && (
162
+ <div
163
+ className="ff-connecting-branch-middle-arrow"
164
+ style={{
165
+ borderTop: `1px ${getBorderStyle(
166
+ machineInstance,
167
+ machineInstances[index + 1]
168
+ )} var(--ff-connecting-branch-color)`,
169
+ }}
170
+ >
171
+ <div
172
+ className={classNames({
173
+ 'ff-connecting-branch-arrow': evenRow,
174
+ 'ff-connecting-branch-arrow-reverse': !evenRow,
175
+ })}
176
+ ></div>
177
+ </div>
178
+ )}
179
+ </Fragment>
180
+ );
181
+ })}
182
+ {!lastMachineInstance && (
183
+ <div
184
+ className={classNames({
185
+ 'ff-connecting-branch-end-arrow': evenRow,
186
+ 'ff-connecting-branch-end-arrow-reverse': !evenRow,
187
+ })}
188
+ style={{
189
+ border: `1px ${getBorderStyle(
190
+ machineInstances[machineColumnCount - 1],
191
+ nextRowMachineInstance
192
+ )} var(--ff-connecting-branch-color)`,
193
+ borderBottom: 'none',
194
+ borderLeft: `${evenRow && 'none'}`,
195
+ borderRight: `${!evenRow && 'none'}`,
196
+ }}
197
+ ></div>
198
+ )}
199
+ </div>
200
+ );
201
+ };
202
+
203
+ export default Branches;
@@ -0,0 +1,18 @@
1
+ import { ExecutionContext } from '../../types';
2
+
3
+ export interface BranchesProps {
4
+ machineInstances: ExecutionContext[] | {}[];
5
+ rowIndex: number;
6
+ machineColumnCount: number;
7
+ machineColumnWidth: number;
8
+ nextRowMachineInstance?: ExecutionContext | {} | undefined;
9
+ previousRowMachineInstance?: ExecutionContext | {} | undefined;
10
+ onAddBrowser: () => void;
11
+ onDeleteBrowser: (id: string, runCount: number) => void;
12
+ onAddRunBrowser: (id: string) => void;
13
+ }
14
+
15
+ export interface branchTypeProps {
16
+ currentBranch: ExecutionContext | undefined | {};
17
+ nextBranch: ExecutionContext | undefined | {};
18
+ }
@@ -0,0 +1,3 @@
1
+ .ff-connecting-branch-grid-wrapper {
2
+ box-sizing: border-box;
3
+ }
@@ -0,0 +1,66 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { ExecutionContext } from '../../types';
3
+ import { ConnectingBranchesProps } from './types';
4
+ import { Fragment } from 'react/jsx-runtime';
5
+ import {ffid} from '../../../../utils/ffID/ffid';
6
+ import Branches from '../Branches/Branches';
7
+ import './ConnectingBranches.scss';
8
+
9
+ const ConnectingBranches = ({
10
+ machineBranchInstances,
11
+ machineColumnCount,
12
+ machineColumnWidth,
13
+ onAddBrowser,
14
+ onDeleteBrowser,
15
+ onAddRunBrowser,
16
+ }: ConnectingBranchesProps) => {
17
+ const [machineInstance, setMachineInstance] = useState<
18
+ ExecutionContext[] | {}[]
19
+ >(machineBranchInstances);
20
+
21
+ useEffect(() => {
22
+ setMachineInstance(machineBranchInstances);
23
+ }, [machineBranchInstances]);
24
+
25
+ const getMachineBranchInstancesChunk = (
26
+ machineBranchInstances: ExecutionContext[] | {}[],
27
+ chunkSize: number
28
+ ) => {
29
+ const machineBranchInstancesChunk = [];
30
+ for (let i = 0; i < machineBranchInstances.length; i += chunkSize) {
31
+ machineBranchInstancesChunk.push(
32
+ machineBranchInstances.slice(i, i + chunkSize)
33
+ );
34
+ }
35
+ return machineBranchInstancesChunk;
36
+ };
37
+
38
+ const machineInstancesRow = getMachineBranchInstancesChunk(
39
+ machineInstance,
40
+ machineColumnCount
41
+ );
42
+
43
+ return (
44
+ <div className="ff-connecting-branch-grid-wrapper">
45
+ {machineInstancesRow.map((machineInstances, index) => (
46
+ <Fragment key={ffid()}>
47
+ <Branches
48
+ machineInstances={machineInstances}
49
+ rowIndex={index}
50
+ machineColumnCount={machineColumnCount}
51
+ machineColumnWidth={machineColumnWidth}
52
+ onAddBrowser={onAddBrowser}
53
+ onDeleteBrowser={onDeleteBrowser}
54
+ onAddRunBrowser={onAddRunBrowser}
55
+ nextRowMachineInstance={machineInstancesRow[index + 1]?.[0]}
56
+ previousRowMachineInstance={
57
+ machineInstancesRow[index - 1]?.[machineColumnCount - 1]
58
+ }
59
+ />
60
+ </Fragment>
61
+ ))}
62
+ </div>
63
+ );
64
+ };
65
+
66
+ export default ConnectingBranches;
@@ -0,0 +1,10 @@
1
+ import { ExecutionContext } from '../../types';
2
+
3
+ export interface ConnectingBranchesProps {
4
+ machineBranchInstances: ExecutionContext[] | {}[];
5
+ machineColumnCount: number;
6
+ machineColumnWidth: number;
7
+ onAddBrowser: () => void;
8
+ onDeleteBrowser: (id: string, runCount: number) => void;
9
+ onAddRunBrowser: (id: string) => void;
10
+ }
@@ -0,0 +1,31 @@
1
+ .ff-datalist-modal-header-wrapper,
2
+ .ff-datalist-modal-child-wrapper,
3
+ .ff-datalist-modal-footer-wrapper {
4
+ margin: 0 8px;
5
+ }
6
+
7
+ .ff-datalist-modal-header-wrapper {
8
+ width: 255px;
9
+ border-bottom: 1px solid var(--ff-connecting-branch-modal-border);
10
+ display: flex;
11
+ align-items: center;
12
+ }
13
+
14
+ .ff-datalist-modal-child-wrapper {
15
+ .variable {
16
+ margin: 8px 0;
17
+ }
18
+ }
19
+
20
+ .ff-datalist-modal-footer-wrapper {
21
+ display: flex;
22
+ justify-content: space-between;
23
+ border-top: 1px solid var(--ff-connecting-branch-modal-border);
24
+
25
+ .datalist-button-wrapper {
26
+ display: flex;
27
+ gap: 10px;
28
+ margin-top: 4px;
29
+ justify-content: flex-end;
30
+ }
31
+ }
@@ -0,0 +1,85 @@
1
+ import { forwardRef, RefObject } from 'react';
2
+ import MiniModal from '../../../MiniModal';
3
+ import Typography from '../../../Typography';
4
+ import './DatasetListModal.scss';
5
+ import Select from '../../../Select';
6
+ import Checkbox from '../../../Checkbox';
7
+ import Button from '../../../Button';
8
+ import { DatasetListModalProps } from './types';
9
+
10
+ const DatasetListModal = forwardRef<HTMLButtonElement, DatasetListModalProps>(
11
+ (props, ref) => {
12
+ const selectOptions = [
13
+ { label: 'Project Environment Variable' },
14
+ { label: 'Global Variables' },
15
+ { label: 'Test Data Set' },
16
+ ];
17
+
18
+ const renderSelectOptions = () =>
19
+ selectOptions.map(({ label }, idx) => (
20
+ <Select
21
+ key={idx}
22
+ optionsList={[]}
23
+ onChange={() => {}}
24
+ label={label}
25
+ className="variable"
26
+ />
27
+ ));
28
+
29
+ const renderFooterContent = () => (
30
+ <div className="ff-datalist-modal-footer-wrapper">
31
+ <Checkbox checked={false} label="Set as Default" />
32
+ <div className="datalist-button-wrapper">
33
+ <Button label="Cancel" variant="tertiary" />
34
+ <Button label="Update" variant="primary" />
35
+ </div>
36
+ </div>
37
+ );
38
+
39
+ return (
40
+ <div>
41
+ <MiniModal
42
+ anchorRef={ref as RefObject<HTMLButtonElement>}
43
+ headerProps={
44
+ <div className="ff-datalist-modal-header-wrapper">
45
+ <Typography
46
+ as="span"
47
+ color="var(--ff-connecting-branch-modal-header)"
48
+ fontWeight="semi-bold"
49
+ fontSize={12}
50
+ lineHeight="38px"
51
+ >
52
+ Data Sets
53
+ </Typography>
54
+ </div>
55
+ }
56
+ childContent={
57
+ <div className="ff-datalist-modal-child-wrapper">
58
+ {renderSelectOptions()}
59
+ </div>
60
+ }
61
+ footerContent={renderFooterContent()}
62
+ cancelButtonProps={{
63
+ text: 'Cancel',
64
+
65
+ // TODO: DEMO PURPOSE AND WILL BE REMOVED IN THE FUTURE
66
+ onClick: props?.onUpdateDatasetList,
67
+ }}
68
+ proceedButtonProps={{
69
+ text: 'Proceed',
70
+ // TODO: DEMO PURPOSE AND WILL BE REMOVED IN THE FUTURE
71
+ onClick: props?.onUpdateDatasetList,
72
+ }}
73
+ modalPosition="right"
74
+ isPopOver
75
+ leftTopArrow
76
+ extraRightSpace={{ leftTopArrow: 40 }}
77
+ extraLeftSpace={{ rightAlignModal: 110 }}
78
+ {...props}
79
+ />
80
+ </div>
81
+ );
82
+ }
83
+ );
84
+
85
+ export default DatasetListModal;
@@ -0,0 +1,4 @@
1
+ export interface DatasetListModalProps {
2
+ // TODO: DEMO PURPOSE AND WILL BE REMOVED IN THE FUTURE
3
+ onUpdateDatasetList: () => void;
4
+ }
@@ -0,0 +1 @@
1
+ export { default } from './SequentialConnectingBranch';
@@ -0,0 +1,42 @@
1
+ import { Option } from '../Select/types';
2
+
3
+ export interface SequentialConnectingBranchProps {
4
+ machineInstances?: ExecutionContext[] | {}[];
5
+ machineColumnWidth?: number;
6
+ machineColumnCount?: number;
7
+ machineInstance: ExecutionContext;
8
+ selectedMachine?: string; // TODO: type will change in the future
9
+ onMachineSelectionChange?: (selectedMachine: Option) => void; // TODO: function will change in the future
10
+ machineOptionsList?: Option[];
11
+ }
12
+
13
+ // Type for machine information
14
+ export interface MachineInfo {
15
+ osName: string;
16
+ osVersion: string;
17
+ hostName: string;
18
+ }
19
+
20
+ // Type for device information
21
+ export interface DeviceInfo {
22
+ // Define properties as needed; assuming it can have various structures.
23
+ // For example:
24
+ // deviceName: string;
25
+ // deviceType: string;
26
+ }
27
+
28
+ export interface ExecutionContext {
29
+ id: string;
30
+ clientId: string;
31
+ runCount: number;
32
+ executionEnv?: 'Local'; // Change to specific enum if more environments exist
33
+ browserName?: 'Local' | 'mac' | 'android' | 'Google Chrome';
34
+ browserVersion: string;
35
+ systemUrl: string;
36
+ machineInfo: MachineInfo;
37
+ deviceInfo: DeviceInfo[];
38
+ headless: boolean;
39
+ peVariableSetId: string;
40
+ globalVariableSetId: string;
41
+ testDataSetId: string;
42
+ }
@@ -39,15 +39,15 @@ const TabContentFour = () => (
39
39
  </div>
40
40
  );
41
41
 
42
+ const tabsData = [
43
+ { id: 'tab-1', label: 'Tab--1', component: <TabContentOne /> },
44
+ { id: 'tab-2', label: 'Tab--2', component: <TabContentTwo /> },
45
+ { id: 'tab-3', label: 'Tab--3', component: <TabContentThree /> },
46
+ ];
47
+
42
48
  export const DefaultTabs: Story = {
43
49
  render: () => {
44
- const [activeTabIdDefault, setActiveTabIdDefault] = useState<string>('0');
45
-
46
- const tabsData = [
47
- { label: 'Tab--1', component: <TabContentOne /> },
48
- { label: 'Tab--2', component: <TabContentTwo /> },
49
- { label: 'Tab--3', component: <TabContentThree /> },
50
- ];
50
+ const [activeTabIdDefault, setActiveTabIdDefault] = useState<string>('tab-1');
51
51
 
52
52
  return (
53
53
  <Tabs
@@ -60,14 +60,14 @@ export const DefaultTabs: Story = {
60
60
  };
61
61
  export const CapsuleTabs: Story = {
62
62
  render: () => {
63
- const [activeTabIdCapsule, setActiveTabIdCapsule] = useState<string>('0');
63
+ const [activeTabIdCapsule, setActiveTabIdCapsule] = useState<string>('tab-1');
64
64
 
65
65
  const tabsDataForCapsule = [
66
- { label: 'Loremipsum_1', component: <TabContentOne /> },
67
- { label: 'Loremipsum_2', component: <TabContentTwo /> },
68
- { label: 'Loremipsum_3', component: <TabContentThree /> },
69
- { label: 'Loremipsum_4', component: <TabContentFour /> },
70
- { label: 'Loremipsum_5', component: <TabContentFour /> },
66
+ { id: 'tab-1', label: 'Loremipsum_1', component: <TabContentOne /> },
67
+ { id: 'tab-2', label: 'Loremipsum_2', component: <TabContentTwo /> },
68
+ { id: 'tab-3', label: 'Loremipsum_3', component: <TabContentThree /> },
69
+ { id: 'tab-4', label: 'Loremipsum_4', component: <TabContentFour /> },
70
+ { id: 'tab-5', label: 'Loremipsum_5', component: <TabContentFour /> },
71
71
  ];
72
72
 
73
73
  return (
@@ -83,12 +83,17 @@ export const CapsuleTabs: Story = {
83
83
 
84
84
  export const TabsWithDisabledTab: Story = {
85
85
  render: () => {
86
- const [activeTabId, setActiveTabId] = useState<string>('0');
86
+ const [activeTabId, setActiveTabId] = useState<string>('tab-1');
87
87
 
88
88
  const tabsDataWithOneDisableAttribute = [
89
- { label: 'Tab--1', component: <TabContentOne /> },
90
- { label: 'Tab--2', component: <TabContentTwo />, disabled: true },
91
- { label: 'Tab--3', component: <TabContentThree /> },
89
+ { id: 'tab-1', label: 'Tab--1', component: <TabContentOne /> },
90
+ {
91
+ id: 'tab-2',
92
+ label: 'Tab--2',
93
+ component: <TabContentTwo />,
94
+ disabled: true,
95
+ },
96
+ { id: 'tab-3', label: 'Tab--3', component: <TabContentThree /> },
92
97
  ];
93
98
 
94
99
  return (
@@ -103,13 +108,7 @@ export const TabsWithDisabledTab: Story = {
103
108
 
104
109
  export const WithoutBorder: Story = {
105
110
  render: () => {
106
- const [activeTabIdDefault, setActiveTabIdDefault] = useState<string>('0');
107
-
108
- const tabsData = [
109
- { label: 'Tab--1', component: <TabContentOne /> },
110
- { label: 'Tab--2', component: <TabContentTwo /> },
111
- { label: 'Tab--3', component: <TabContentThree /> },
112
- ];
111
+ const [activeTabIdDefault, setActiveTabIdDefault] = useState<string>('tab-1');
113
112
 
114
113
  return (
115
114
  <div style={{ display: 'flex', gap: '10px' }}>
@@ -132,4 +131,4 @@ export const WithoutBorder: Story = {
132
131
  },
133
132
  };
134
133
 
135
- export default meta;
134
+ export default meta;
@@ -11,13 +11,6 @@ const Tabs = ({
11
11
  onTabClick,
12
12
  noBorder = false,
13
13
  }: TabsProps) => {
14
- const tabs = tabsData.map((tab, index) => ({
15
- id: index.toString(),
16
- label: tab.label,
17
- component: tab.component,
18
- disabled: tab.disabled,
19
- }));
20
-
21
14
  return (
22
15
  <div className={`ff-tabs-container`}>
23
16
  <div
@@ -25,7 +18,7 @@ const Tabs = ({
25
18
  'ff-tab-row--no-border': noBorder,
26
19
  })}
27
20
  >
28
- {tabs.map((tab) => (
21
+ {tabsData.map((tab) => (
29
22
  <button
30
23
  key={tab.id}
31
24
  onClick={() => !tab.disabled && onTabClick(tab.id)}
@@ -60,10 +53,10 @@ const Tabs = ({
60
53
  ))}
61
54
  </div>
62
55
  <div className={`ff-tab-content`}>
63
- {tabs.find((tab) => tab.id === activeTabId)?.component}
56
+ {tabsData.find((tab) => tab.id === activeTabId)?.component}
64
57
  </div>
65
58
  </div>
66
59
  );
67
60
  };
68
61
 
69
- export default Tabs;
62
+ export default Tabs;
@@ -21,7 +21,12 @@ export interface TabsProps {
21
21
  /**
22
22
  * An array of tab objects containing label, component, and optional disabled status.
23
23
  */
24
- tabsData: { label: string; component?: JSX.Element; disabled?: boolean }[];
24
+ tabsData: {
25
+ id: string;
26
+ label: string;
27
+ component?: JSX.Element;
28
+ disabled?: boolean;
29
+ }[];
25
30
  /**
26
31
  * Defines the styling variant of the tabs.
27
32
  */
@@ -40,3 +45,4 @@ export interface TabsProps {
40
45
  */
41
46
  noBorder?: boolean;
42
47
  }
48
+
package/src/index.ts CHANGED
@@ -46,6 +46,8 @@ import Paper from './components/Paper';
46
46
  import DashboardDonutChart from './components/Charts/DashboardDonutChart';
47
47
  import Recaptcha from './components/FF_Captcha/Recaptcha';
48
48
  import NLPInput from './components/NLPInput';
49
+ import MachineInputField from './components/MachineInputField';
50
+ import SequentialConnectingBranch from './components/SequentialConnectingBranch';
49
51
 
50
52
  // Utils imports
51
53
  import { checkEmpty } from './utils/checkEmpty/checkEmpty';
@@ -119,6 +121,9 @@ export {
119
121
  Paper,
120
122
  Recaptcha,
121
123
  NLPInput,
124
+ MachineInputField,
125
+ SequentialConnectingBranch,
126
+
122
127
  // utils exports
123
128
  checkEmpty,
124
129
  getExtension,