pixel-react 1.2.0 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (182) hide show
  1. package/lib/components/AppHeader/types.d.ts +11 -2
  2. package/lib/components/Avatar/Avatar.d.ts +5 -0
  3. package/lib/components/Avatar/Avatar.stories.d.ts +10 -0
  4. package/lib/components/Avatar/index.d.ts +1 -0
  5. package/lib/components/Avatar/types.d.ts +26 -0
  6. package/lib/components/ExcelFile/ExcelFile/Excel/ActiveCell.d.ts +2 -2
  7. package/lib/components/ExcelFile/ExcelFile/Excel/ColumnIndicator.d.ts +2 -2
  8. package/lib/components/ExcelFile/ExcelFile/Excel/Copied.d.ts +1 -1
  9. package/lib/components/ExcelFile/ExcelFile/Excel/CornerIndicator.d.ts +2 -2
  10. package/lib/components/ExcelFile/ExcelFile/Excel/DataEditor.d.ts +2 -2
  11. package/lib/components/ExcelFile/ExcelFile/Excel/DataViewer.d.ts +2 -2
  12. package/lib/components/ExcelFile/ExcelFile/Excel/FloatingRect.d.ts +2 -2
  13. package/lib/components/ExcelFile/ExcelFile/Excel/HeaderRow.d.ts +1 -1
  14. package/lib/components/ExcelFile/ExcelFile/Excel/Row.d.ts +1 -1
  15. package/lib/components/ExcelFile/ExcelFile/Excel/RowIndicator.d.ts +2 -2
  16. package/lib/components/ExcelFile/ExcelFile/Excel/Selected.d.ts +1 -1
  17. package/lib/components/ExcelFile/ExcelFile/Excel/Spreadsheet.d.ts +6 -7
  18. package/lib/components/ExcelFile/ExcelFile/Excel/Table.d.ts +1 -1
  19. package/lib/components/ExcelFile/ExcelFile/Excel/actions.d.ts +49 -5
  20. package/lib/components/ExcelFile/ExcelFile/Excel/context.d.ts +3 -3
  21. package/lib/components/ExcelFile/ExcelFile/Excel/engine/engine.d.ts +5 -5
  22. package/lib/components/ExcelFile/ExcelFile/Excel/engine/formula.d.ts +6 -6
  23. package/lib/components/ExcelFile/ExcelFile/Excel/engine/index.d.ts +2 -2
  24. package/lib/components/ExcelFile/ExcelFile/Excel/engine/point-graph.d.ts +2 -2
  25. package/lib/components/ExcelFile/ExcelFile/Excel/engine/point-hash.d.ts +1 -1
  26. package/lib/components/ExcelFile/ExcelFile/Excel/engine/point-set.d.ts +1 -1
  27. package/lib/components/ExcelFile/ExcelFile/Excel/index.d.ts +11 -11
  28. package/lib/components/ExcelFile/ExcelFile/Excel/matrix.d.ts +1 -1
  29. package/lib/components/ExcelFile/ExcelFile/Excel/point-range.d.ts +1 -1
  30. package/lib/components/ExcelFile/ExcelFile/Excel/reducer.d.ts +5 -5
  31. package/lib/components/ExcelFile/ExcelFile/Excel/selection.d.ts +3 -3
  32. package/lib/components/ExcelFile/ExcelFile/Excel/types.d.ts +11 -48
  33. package/lib/components/ExcelFile/ExcelFile/Excel/use-dispatch.d.ts +1 -1
  34. package/lib/components/ExcelFile/ExcelFile/Excel/use-selector.d.ts +1 -1
  35. package/lib/components/ExcelFile/ExcelFile/Excel/util.d.ts +11 -12
  36. package/lib/components/ExcelFile/ExcelFile/ExcelFile.d.ts +16 -0
  37. package/lib/components/ExcelFile/ExcelSheetBar/ExcelSheetBar.d.ts +0 -3
  38. package/lib/components/ExcelFile/ExcelToolBar/ExcelToolBar.d.ts +12 -0
  39. package/lib/components/ExcelFile/Types.d.ts +2 -49
  40. package/lib/components/Form/Form.d.ts +1 -15
  41. package/lib/components/Form/Form.stories.d.ts +6 -5
  42. package/lib/components/Form/Forms.d.ts +8 -0
  43. package/lib/components/Form/index.d.ts +1 -1
  44. package/lib/components/InputWithDropdown/types.d.ts +1 -1
  45. package/lib/components/LabelEditTextField/LabelEditTextField.d.ts +5 -0
  46. package/lib/components/LabelEditTextField/LabelEditTextField.stories.d.ts +11 -0
  47. package/lib/components/LabelEditTextField/index.d.ts +1 -0
  48. package/lib/components/LabelEditTextField/types.d.ts +38 -0
  49. package/lib/components/MenuOption/types.d.ts +7 -7
  50. package/lib/components/ModulesChip/ModuleChip.d.ts +4 -0
  51. package/lib/components/ModulesChip/ModuleChip.stories.d.ts +6 -0
  52. package/lib/components/ModulesChip/index.d.ts +1 -0
  53. package/lib/components/ModulesChip/types.d.ts +14 -0
  54. package/lib/components/MultiSelect/MultiSelectTypes.d.ts +1 -0
  55. package/lib/components/Select/Select.d.ts +1 -1
  56. package/lib/components/Select/components/Dropdown/Dropdown.d.ts +1 -1
  57. package/lib/components/Select/components/Dropdown/dropdownTypes.d.ts +2 -0
  58. package/lib/components/Select/types.d.ts +11 -4
  59. package/lib/components/Toastify/Toastify.d.ts +8 -0
  60. package/lib/components/Toastify/Toastify.stories.d.ts +6 -0
  61. package/lib/components/Toastify/index.d.ts +1 -0
  62. package/lib/components/Toastify/types.d.ts +7 -0
  63. package/lib/components/Tooltip/types.d.ts +6 -0
  64. package/lib/components/Typography/types.d.ts +1 -0
  65. package/lib/index.d.ts +130 -29
  66. package/lib/index.esm.js +26882 -872
  67. package/lib/index.esm.js.map +1 -1
  68. package/lib/index.js +26881 -866
  69. package/lib/index.js.map +1 -1
  70. package/lib/tsconfig.tsbuildinfo +1 -1
  71. package/lib/utils/getSelectOptionValue/getSelectOptionValue.d.ts +8 -0
  72. package/package.json +1 -1
  73. package/src/StyleGuide/ColorPalette/colorPaletteList.ts +10 -0
  74. package/src/assets/Themes/BaseTheme.scss +10 -1
  75. package/src/assets/Themes/DarkTheme.scss +19 -8
  76. package/src/assets/icons/client_profile.svg +4 -0
  77. package/src/assets/icons/fireflink_finder_logo.svg +7 -0
  78. package/src/assets/icons/fireflink_platform.svg +4 -0
  79. package/src/assets/icons/license_expired.svg +20 -0
  80. package/src/components/AppHeader/AppHeader.scss +5 -2
  81. package/src/components/AppHeader/AppHeader.stories.tsx +24 -3
  82. package/src/components/AppHeader/AppHeader.tsx +29 -11
  83. package/src/components/AppHeader/types.ts +11 -3
  84. package/src/components/Avatar/Avatar.scss +24 -0
  85. package/src/components/Avatar/Avatar.stories.tsx +56 -0
  86. package/src/components/Avatar/Avatar.tsx +25 -0
  87. package/src/components/Avatar/index.ts +1 -0
  88. package/src/components/Avatar/types.ts +27 -0
  89. package/src/components/Drawer/Drawer.scss +0 -1
  90. package/src/components/Drawer/Drawer.tsx +1 -1
  91. package/src/components/ExcelFile/ColorBarselector/ColorBarSelector.scss +0 -2
  92. package/src/components/ExcelFile/ContextMenu/ContextMenu.scss +1 -4
  93. package/src/components/ExcelFile/ContextMenu/ContextMenu.tsx +0 -1
  94. package/src/components/ExcelFile/ExcelFile/Excel/ActiveCell.tsx +13 -13
  95. package/src/components/ExcelFile/ExcelFile/Excel/Cell.tsx +13 -12
  96. package/src/components/ExcelFile/ExcelFile/Excel/ColumnIndicator.tsx +40 -32
  97. package/src/components/ExcelFile/ExcelFile/Excel/Copied.tsx +4 -4
  98. package/src/components/ExcelFile/ExcelFile/Excel/CornerIndicator.tsx +10 -10
  99. package/src/components/ExcelFile/ExcelFile/Excel/DataEditor.tsx +5 -5
  100. package/src/components/ExcelFile/ExcelFile/Excel/DataViewer.tsx +10 -10
  101. package/src/components/ExcelFile/ExcelFile/Excel/FloatingRect.tsx +6 -6
  102. package/src/components/ExcelFile/ExcelFile/Excel/HeaderRow.tsx +1 -1
  103. package/src/components/ExcelFile/ExcelFile/Excel/Row.tsx +1 -1
  104. package/src/components/ExcelFile/ExcelFile/Excel/RowIndicator.tsx +34 -27
  105. package/src/components/ExcelFile/ExcelFile/Excel/Selected.tsx +5 -5
  106. package/src/components/ExcelFile/ExcelFile/Excel/{Spreadsheet.css → Spreadsheet.scss} +21 -37
  107. package/src/components/ExcelFile/ExcelFile/Excel/Spreadsheet.tsx +87 -78
  108. package/src/components/ExcelFile/ExcelFile/Excel/Table.tsx +2 -2
  109. package/src/components/ExcelFile/ExcelFile/Excel/actions.ts +121 -31
  110. package/src/components/ExcelFile/ExcelFile/Excel/areModelsEqual.ts +1 -1
  111. package/src/components/ExcelFile/ExcelFile/Excel/context.ts +4 -4
  112. package/src/components/ExcelFile/ExcelFile/Excel/engine/engine.ts +7 -7
  113. package/src/components/ExcelFile/ExcelFile/Excel/engine/formula.ts +11 -11
  114. package/src/components/ExcelFile/ExcelFile/Excel/engine/index.ts +2 -2
  115. package/src/components/ExcelFile/ExcelFile/Excel/engine/point-graph.ts +3 -3
  116. package/src/components/ExcelFile/ExcelFile/Excel/engine/point-hash.ts +2 -2
  117. package/src/components/ExcelFile/ExcelFile/Excel/engine/point-set.ts +2 -2
  118. package/src/components/ExcelFile/ExcelFile/Excel/index.ts +12 -11
  119. package/src/components/ExcelFile/ExcelFile/Excel/matrix.ts +18 -24
  120. package/src/components/ExcelFile/ExcelFile/Excel/point-range.ts +1 -1
  121. package/src/components/ExcelFile/ExcelFile/Excel/reducer.ts +311 -41
  122. package/src/components/ExcelFile/ExcelFile/Excel/selection.ts +5 -5
  123. package/src/components/ExcelFile/ExcelFile/Excel/types.ts +14 -66
  124. package/src/components/ExcelFile/ExcelFile/Excel/typings/fast-formula-parser.d.ts +8 -8
  125. package/src/components/ExcelFile/ExcelFile/Excel/use-dispatch.ts +2 -2
  126. package/src/components/ExcelFile/ExcelFile/Excel/use-selector.ts +3 -3
  127. package/src/components/ExcelFile/ExcelFile/Excel/util.ts +21 -22
  128. package/src/components/ExcelFile/ExcelFile/ExcelFile.scss +0 -3
  129. package/src/components/ExcelFile/ExcelFile/ExcelFile.tsx +45 -403
  130. package/src/components/ExcelFile/ExcelFile.stories.tsx +10 -29
  131. package/src/components/ExcelFile/ExcelSheetBar/ExcelSheetBar.tsx +1 -12
  132. package/src/components/ExcelFile/ExcelToolBar/ExcelToolBar.scss +0 -3
  133. package/src/components/ExcelFile/ExcelToolBar/ExcelToolBar.tsx +147 -127
  134. package/src/components/ExcelFile/Types.ts +3 -70
  135. package/src/components/ExcelFile/index.ts +1 -1
  136. package/src/components/Form/Form.d.ts +3 -0
  137. package/src/components/Form/Form.scss +31 -4
  138. package/src/components/Form/Form.stories.tsx +172 -138
  139. package/src/components/Form/Form.ts +2 -0
  140. package/src/components/Form/Forms.tsx +25 -0
  141. package/src/components/Form/index.ts +1 -1
  142. package/src/components/Icon/Icons.scss +1 -0
  143. package/src/components/Icon/iconList.ts +8 -0
  144. package/src/components/IconButton/IconButton.scss +1 -1
  145. package/src/components/InputWithDropdown/types.ts +1 -1
  146. package/src/components/LabelEditTextField/LabelEditTextField.scss +85 -0
  147. package/src/components/LabelEditTextField/LabelEditTextField.stories.tsx +136 -0
  148. package/src/components/LabelEditTextField/LabelEditTextField.tsx +207 -0
  149. package/src/components/LabelEditTextField/index.ts +1 -0
  150. package/src/components/LabelEditTextField/types.ts +38 -0
  151. package/src/components/MenuOption/types.ts +7 -6
  152. package/src/components/ModulesChip/ModuleChip.scss +20 -0
  153. package/src/components/ModulesChip/ModuleChip.stories.tsx +41 -0
  154. package/src/components/ModulesChip/ModuleChip.tsx +31 -0
  155. package/src/components/ModulesChip/index.ts +1 -0
  156. package/src/components/ModulesChip/types.ts +14 -0
  157. package/src/components/MultiSelect/Dropdown.tsx +6 -1
  158. package/src/components/MultiSelect/MultiSelect.scss +17 -10
  159. package/src/components/MultiSelect/MultiSelect.stories.tsx +16 -4
  160. package/src/components/MultiSelect/MultiSelect.tsx +11 -4
  161. package/src/components/MultiSelect/MultiSelectTypes.ts +4 -3
  162. package/src/components/Select/Select.scss +4 -0
  163. package/src/components/Select/Select.stories.tsx +5 -3
  164. package/src/components/Select/Select.tsx +15 -7
  165. package/src/components/Select/components/Dropdown/Dropdown.tsx +3 -1
  166. package/src/components/Select/components/Dropdown/dropdownTypes.ts +3 -0
  167. package/src/components/Select/types.ts +12 -5
  168. package/src/components/Toastify/Toastify.stories.tsx +52 -0
  169. package/src/components/Toastify/Toastify.tsx +66 -0
  170. package/src/components/Toastify/index.ts +1 -0
  171. package/src/components/Toastify/types.ts +8 -0
  172. package/src/components/Tooltip/Tooltip.tsx +2 -1
  173. package/src/components/Tooltip/types.ts +6 -0
  174. package/src/components/Typography/Typography.scss +12 -4
  175. package/src/components/Typography/Typography.stories.tsx +2 -0
  176. package/src/components/Typography/Typography.tsx +2 -0
  177. package/src/components/Typography/types.ts +1 -0
  178. package/src/index.ts +12 -2
  179. package/src/utils/getSelectOptionValue/getSelectOptionValue.ts +31 -0
  180. package/src/components/ExcelFile/ChangeExcelStyles.tsx +0 -78
  181. package/src/components/ExcelFile/ImportExcelStyles.tsx +0 -86
  182. package/src/components/Form/Form.tsx +0 -57
@@ -0,0 +1,207 @@
1
+ import React, { useState, useRef, useEffect, FC } from 'react';
2
+ import './LabelEditTextField.scss';
3
+ import { LabelEditTextFieldTypes } from './types';
4
+ import Typography from '../Typography';
5
+ import HighlightText from '../HighlightText';
6
+ import Icon from '../Icon';
7
+
8
+ const getErrorMessage = (
9
+ inputValue: string,
10
+ text: string,
11
+ customError?: string
12
+ ): string => {
13
+ if (inputValue === text) {
14
+ return 'No changes were made.';
15
+ } else if (!inputValue) {
16
+ return 'Text is required';
17
+ } else if (inputValue.length < 3) {
18
+ return 'Please enter at least 3 characters.';
19
+ } else if (customError) {
20
+ return customError;
21
+ }
22
+ return '';
23
+ };
24
+ const LabelEditTextField: FC<LabelEditTextFieldTypes> = ({
25
+ label,
26
+ text,
27
+ highlightText,
28
+ customError,
29
+ confirmIcon,
30
+ cancelIcon,
31
+ variant = 'textField',
32
+ dropdownData = [],
33
+ width = '300px',
34
+ height = '22px',
35
+ confirmAction,
36
+ }) => {
37
+ const [isEditing, setIsEditing] = useState(false);
38
+ const [inputValue, setInputValue] = useState(text);
39
+ const [dropdownValue, setDropdownValue] = useState(
40
+ dropdownData[0]?.value ?? ''
41
+ );
42
+ const [showError, setShowError] = useState('');
43
+ const [isTextFieldModified, setIsTextFieldModified] = useState(false);
44
+ const [isDropdownModified, setIsDropdownModified] = useState(false);
45
+ const containerRef = useRef<HTMLDivElement | null>(null);
46
+ const cancelRef = useRef<HTMLDivElement | null>(null); // New ref for cancel icon
47
+
48
+ const handleDoubleClick = () => {
49
+ setIsEditing(true);
50
+ setShowError('');
51
+ };
52
+
53
+ const handleConfirm = () => {
54
+ const errorMessage = getErrorMessage(inputValue, text, customError);
55
+
56
+ if (errorMessage && isEditing) {
57
+ setShowError(errorMessage);
58
+ } else {
59
+ setIsEditing(false);
60
+ setShowError('');
61
+ if (confirmAction) confirmAction(inputValue, dropdownValue);
62
+ }
63
+ };
64
+
65
+ const handleCancel = () => {
66
+ setInputValue(text);
67
+ setDropdownValue(dropdownData[0]?.value ?? '');
68
+ setIsEditing(false);
69
+ setShowError('');
70
+ setIsTextFieldModified(false);
71
+ setIsDropdownModified(false);
72
+ };
73
+
74
+ const handleTextFieldChange = (e: React.ChangeEvent<HTMLInputElement>) => {
75
+ setInputValue(e.target.value);
76
+ setIsTextFieldModified(true);
77
+ setShowError('');
78
+ };
79
+
80
+ const handleDropdownChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
81
+ setDropdownValue(e.target.value);
82
+ setIsDropdownModified(true);
83
+ setShowError('');
84
+ };
85
+
86
+ const handleBlur = (e: MouseEvent) => {
87
+ if (
88
+ containerRef.current &&
89
+ !containerRef.current.contains(e.target as Node) &&
90
+ cancelRef.current !== e.target // Exclude clicks on cancel icon
91
+ ) {
92
+ const errorMessage = getErrorMessage(inputValue, text, customError);
93
+
94
+ if (errorMessage && isEditing) {
95
+ setShowError(errorMessage);
96
+ } else {
97
+ setIsEditing(false);
98
+ setShowError('');
99
+ }
100
+ }
101
+ };
102
+
103
+ useEffect(() => {
104
+ document.addEventListener('click', handleBlur);
105
+ return () => {
106
+ document.removeEventListener('click', handleBlur);
107
+ };
108
+ }, [inputValue]);
109
+
110
+ return (
111
+ <div
112
+ className="ff-label-edit-text-field"
113
+ ref={containerRef}
114
+ style={{ width }}
115
+ >
116
+ {isEditing ? (
117
+ <div className="ff-label-text-field">
118
+ {variant === 'textFieldWithDropdown' ? (
119
+ <div
120
+ className={`ff-label-text-field-with-dropdown ${
121
+ isEditing ? 'open' : ''
122
+ }`}
123
+ style={{ height }}
124
+ >
125
+ <input
126
+ type="text"
127
+ value={inputValue}
128
+ onChange={handleTextFieldChange}
129
+ className={`ff-text-dropdown-field ${
130
+ isTextFieldModified ? 'modified' : ''
131
+ }`}
132
+ placeholder=" "
133
+ style={{
134
+ width,
135
+ }}
136
+ />
137
+ {label && <label className="ff-label">{label}</label>}
138
+ <select
139
+ value={dropdownValue}
140
+ onChange={handleDropdownChange}
141
+ className={`dropdown ${isDropdownModified ? 'modified' : ''}`}
142
+ >
143
+ {dropdownData.map((item) => (
144
+ <option key={item.id} value={item.value}>
145
+ {item.label}
146
+ </option>
147
+ ))}
148
+ </select>
149
+ </div>
150
+ ) : (
151
+ <div className="ff-label-text-field-without-dropdown">
152
+ <input
153
+ type="text"
154
+ value={inputValue}
155
+ onChange={handleTextFieldChange}
156
+ className={`ff-text-field ${
157
+ isTextFieldModified ? 'modified' : ''
158
+ }`}
159
+ placeholder=" "
160
+ style={{ width, height }}
161
+ />
162
+ <label className="ff-textfield-label">{label}</label>
163
+ </div>
164
+ )}
165
+ <div className="ff-icon-container">
166
+ {confirmIcon && (
167
+ <Icon
168
+ color="var(--label-edit-confirm-icon)"
169
+ height={20}
170
+ width={20}
171
+ name={confirmIcon.name}
172
+ className="confirm-icon"
173
+ onClick={handleConfirm}
174
+ />
175
+ )}
176
+ {cancelIcon && (
177
+ <Icon
178
+ color="var(--label-edit-cancel-icon)"
179
+ height={12}
180
+ width={20}
181
+ name={cancelIcon.name}
182
+ className="cancel-icon"
183
+ onClick={handleCancel}
184
+ ref={cancelRef}
185
+ />
186
+ )}
187
+ </div>
188
+ </div>
189
+ ) : (
190
+ <span
191
+ className="display-text"
192
+ onDoubleClick={handleDoubleClick}
193
+ role="button"
194
+ >
195
+ <HighlightText text={inputValue} highlight={highlightText} />
196
+ </span>
197
+ )}
198
+ {showError && isEditing && (
199
+ <Typography as="p" fontSize={8} className="error-text">
200
+ {showError}
201
+ </Typography>
202
+ )}
203
+ </div>
204
+ );
205
+ };
206
+
207
+ export default LabelEditTextField;
@@ -0,0 +1 @@
1
+ export { default } from './LabelEditTextField';
@@ -0,0 +1,38 @@
1
+ export interface IconProps {
2
+ /** Name of the icon to be displayed. */
3
+ name: string;
4
+ /** Optional click handler function for the icon. */
5
+ onClick?: () => void;
6
+ }
7
+ export interface DropdownOption {
8
+ /** Unique identifier for the dropdown option. */
9
+ id: number;
10
+ /** Value associated with the dropdown option. */
11
+ value: string;
12
+ /** Label displayed for the dropdown option. */
13
+ label: string;
14
+ }
15
+ export interface LabelEditTextFieldTypes {
16
+ /** Label text displayed above the input field. */
17
+ label?: string;
18
+ /** Initial text displayed in the input field. */
19
+ text: string;
20
+ /** Text to be highlighted within the displayed text, if provided. */
21
+ highlightText?: string;
22
+ /** Custom error message to be displayed, if applicable. */
23
+ customError?: string;
24
+ /** Confirm icon properties including icon name and click handler. */
25
+ confirmIcon?: IconProps;
26
+ /** Cancel icon properties including icon name and click handler. */
27
+ cancelIcon?: IconProps;
28
+ /** Type of input field - standard text field or text field with a dropdown. */
29
+ variant?: 'textFieldWithDropdown' | 'textField';
30
+ /** Array of dropdown options used if the dropdown variant is selected. */
31
+ dropdownData?: DropdownOption[];
32
+ /** Width of the input field component. */
33
+ width?: string;
34
+ /** Height of the input field component. */
35
+ height?: string;
36
+ /** Function called when confirming input changes, with input and dropdown values as arguments. */
37
+ confirmAction?: (inputValue: string, dropdownValue: string) => void;
38
+ }
@@ -105,17 +105,18 @@ interface MenuOptionProps {
105
105
  */
106
106
  dropdownPlacement?: string | 'top' | 'left' | 'right' | 'down';
107
107
 
108
- /**
109
- * Callback function triggered when the icon is clicked.
110
- * @type {function}
108
+ /**
109
+ * The variant of the menu option, either 'dark' or 'light'.
110
+ * @type {'dark' | 'light'}
111
+ * @default 'light'
111
112
  * @optional
112
113
  */
113
114
 
114
115
  variant?: 'dark' | 'light';
116
+
115
117
  /**
116
- * The variant of the menu option, either 'dark' or 'light'.
117
- * @type {'dark' | 'light'}
118
- * @default 'light'
118
+ * Callback function triggered when the icon is clicked.
119
+ * @type {function}
119
120
  * @optional
120
121
  */
121
122
 
@@ -0,0 +1,20 @@
1
+ @use '../../assets/styles/fonts';
2
+ @use '../../assets/styles/mixins';
3
+
4
+ .ff-expandable-chip-menu {
5
+ width: 75px;
6
+ height: 32px;
7
+ border: 0.5px solid;
8
+ border-radius: 16px;
9
+ color: var(--brand-color);
10
+ cursor: pointer;
11
+ @include mixins.center-content();
12
+ .ff-label-chip {
13
+ &--active {
14
+ color: var(--ff-header-text-color);
15
+ }
16
+ }
17
+ &--active {
18
+ background: var(--brand-color);
19
+ }
20
+ }
@@ -0,0 +1,41 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import ModuleChip from './ModuleChip';
3
+ import { useState } from 'react';
4
+
5
+ const meta: Meta<typeof ModuleChip> = {
6
+ title: 'Components/ModuleChip',
7
+ component: ModuleChip,
8
+ parameters: {
9
+ layout: 'center',
10
+ },
11
+ argTypes: {
12
+ isActive: Boolean,
13
+ },
14
+ tags: ['autodocs'],
15
+ };
16
+
17
+ type Story = StoryObj<typeof ModuleChip>;
18
+
19
+ const defaultArgs = {
20
+ label: 'Modules',
21
+ isActive: false,
22
+ };
23
+
24
+ export const Controlled: Story = {
25
+ render: () => {
26
+ const [selectedMenu, setSelectedMenu] = useState<boolean>(true);
27
+ const handleChipClick = () => {
28
+ setSelectedMenu(!selectedMenu);
29
+ };
30
+
31
+ return (
32
+ <ModuleChip
33
+ {...defaultArgs}
34
+ isActive={selectedMenu}
35
+ onClick={handleChipClick}
36
+ />
37
+ );
38
+ },
39
+ };
40
+
41
+ export default meta;
@@ -0,0 +1,31 @@
1
+ import './ModuleChip.scss';
2
+ import classNames from 'classnames';
3
+ import { ModuleChipProps } from './types';
4
+ import Typography from '../Typography';
5
+
6
+ const ModuleChip: React.FC<ModuleChipProps> = ({
7
+ label = '',
8
+ isActive = true,
9
+ onClick = () => {},
10
+ }) => {
11
+ return (
12
+ <div
13
+ className={classNames('ff-expandable-chip-menu', {
14
+ 'ff-expandable-chip-menu--active': isActive,
15
+ })}
16
+ onClick={onClick}
17
+ >
18
+ <div
19
+ className={classNames(`ff-label-chip `, {
20
+ 'ff-label-chip--active': isActive,
21
+ })}
22
+ >
23
+ <Typography fontSize={'14px'} fontWeight="regular" lineHeight="21px">
24
+ {label}
25
+ </Typography>
26
+ </div>
27
+ </div>
28
+ );
29
+ };
30
+
31
+ export default ModuleChip;
@@ -0,0 +1 @@
1
+ export { default } from './ModuleChip';
@@ -0,0 +1,14 @@
1
+ export interface ModuleChipProps {
2
+ /**
3
+ * mandatory | label for the ModuleChip component
4
+ */
5
+ label: string;
6
+ /**
7
+ * mandatory | isActive for the ModuleChip component
8
+ */
9
+ isActive: boolean;
10
+ /**
11
+ * mandatory | onClick for the ModuleChip component
12
+ */
13
+ onClick: () => void;
14
+ }
@@ -5,6 +5,7 @@ import './Dropdown.scss';
5
5
  import { ThemeContext } from '../ThemeProvider/ThemeProvider';
6
6
  import classNames from 'classnames';
7
7
  import Button from '../Button';
8
+ import Typography from '../Typography';
8
9
 
9
10
  const Dropdown = forwardRef<HTMLDivElement, DropdownProps>(
10
11
  (
@@ -82,7 +83,11 @@ const Dropdown = forwardRef<HTMLDivElement, DropdownProps>(
82
83
  onClick={() => handleOptionChange(info, !info.isChecked)}
83
84
  >
84
85
  <input type="checkbox" checked={info.isChecked} readOnly />
85
- <span className="dropdown-option-label">{info.label}</span>
86
+ <Typography
87
+ as="span"
88
+ className="dropdown-option-label"
89
+ children={info.label}
90
+ />
86
91
  </div>
87
92
  ))
88
93
  )}
@@ -38,16 +38,16 @@
38
38
  cursor: pointer;
39
39
  position: relative;
40
40
  border: 1px solid var(--default-icon-color);
41
- border-radius: 8px;
41
+ border-radius: 4px;
42
42
  background: var(--drawer-footer-bg);
43
43
  min-width: 150px;
44
44
  width: 100%;
45
45
  height: 32px;
46
46
  .ff-multiselect {
47
47
  position: relative;
48
- padding: 6px;
48
+ padding: 3px;
49
49
  border: none;
50
- border-radius: 8px;
50
+ border-radius: 4px;
51
51
  @include flex-center;
52
52
  &__main {
53
53
  display: flex;
@@ -61,6 +61,8 @@
61
61
 
62
62
  .active-default-label {
63
63
  @extend .font-size-8;
64
+ font-size: 8px !important;
65
+ height: 8px;
64
66
  @include label-styles;
65
67
  background-color: var(--multi-select-label-bg);
66
68
  line-height: 12px;
@@ -87,6 +89,9 @@
87
89
  @extend .fontXs;
88
90
  line-height: 14px;
89
91
  color: var(--tooltip-bg-color);
92
+ &.pr-2 {
93
+ padding: 5px 2px;
94
+ }
90
95
  }
91
96
  .ff-multiselect-chip-close-icon {
92
97
  cursor: pointer;
@@ -108,13 +113,15 @@
108
113
  }
109
114
  }
110
115
  }
111
- .ff-multiselect-more-chip{
112
- width: 1.2rem;
113
- @extend .fontSm;
114
- font-weight: 600;
115
- line-height: 16px;
116
- color: var(--brand-color);
117
- }
116
+ }
117
+ .ff-multiselect-more-chip {
118
+ display: flex;
119
+ align-items: center;
120
+ width: 1.2rem;
121
+ @extend .fontSm;
122
+ font-weight: 600;
123
+ line-height: 16px;
124
+ color: var(--brand-color);
118
125
  }
119
126
  }
120
127
  &__toggle {
@@ -55,13 +55,25 @@ export const Default3: Story = {
55
55
  export const EmailGroup: Story = {
56
56
  render: () => {
57
57
  const [options] = useState([
58
- { label: 'Sample1@gmail.com', value: 'sample1@gmail.com' },
58
+ {
59
+ label: 'Sample1@gmail.com',
60
+ value: 'sample1@gmail.com',
61
+ isDisabled: true,
62
+ },
59
63
  { label: 'Sample2@gmail.com', value: 'sample2@gmail.com' },
60
64
  ]);
61
65
  const [selectedOptions, setSelectedOptions] = useState<
62
- { label?: string; value?: string }[]
63
- >([{ label: 'Sample1@gmail.com', value: 'sample1@gmail.com' }]);
64
- const onChange = (options: { label?: string; value?: string }[]) => {
66
+ { label?: string; value?: string; isDisabled?: boolean }[]
67
+ >([
68
+ {
69
+ label: 'Sample1@gmail.com',
70
+ value: 'sample1@gmail.com',
71
+ isDisabled: true,
72
+ },
73
+ ]);
74
+ const onChange = (
75
+ options: { label?: string; value?: string; isDisabled?: boolean }[]
76
+ ) => {
65
77
  setSelectedOptions(options);
66
78
  };
67
79
  return (
@@ -5,6 +5,7 @@ import './MultiSelect.scss';
5
5
  import Dropdown from './Dropdown';
6
6
  import Icon from '../Icon';
7
7
  import { MultiSelectProps, Option } from './MultiSelectTypes';
8
+ import Typography from '../Typography';
8
9
 
9
10
  const ChipElement = ({
10
11
  label,
@@ -22,6 +23,8 @@ const ChipElement = ({
22
23
  className="ff-multiselect-chip-close-icon"
23
24
  onClick={onChipCloseClick}
24
25
  name="close_pill"
26
+ height={13} //as per the latest chnages in icon container we have to give this
27
+ width={13}
25
28
  />
26
29
  </div>
27
30
  );
@@ -46,6 +49,9 @@ const MultiSelect = ({
46
49
  }: MultiSelectProps) => {
47
50
  const [isOpen, setIsOpen] = useState<boolean>(false);
48
51
  const [allOptions, setAllOptions] = useState(options);
52
+ useEffect(() => {
53
+ setAllOptions(options);
54
+ }, [options]);
49
55
 
50
56
  const [searchedKeyword, setSearchedKeyword] = useState('');
51
57
  const [isSelectFocusedOnce, setIsSelectFocusedOnce] =
@@ -236,7 +242,8 @@ const MultiSelect = ({
236
242
  >
237
243
  <div className="ff-multiselect" onClick={handleClick}>
238
244
  <div className="ff-multiselect__main">
239
- <span
245
+ <Typography
246
+ as="span"
240
247
  className={classNames({
241
248
  'active-default-label':
242
249
  isOpen ||
@@ -244,9 +251,9 @@ const MultiSelect = ({
244
251
  (isFieldSkipped && required),
245
252
  'default-label': !isOpen && !selectedOptions?.length,
246
253
  })}
247
- >
248
- {label}
249
- </span>
254
+ children={label}
255
+ />
256
+
250
257
  <div className="ff-multiselect-chip-container">
251
258
  {displayCount ? (
252
259
  <>
@@ -3,10 +3,11 @@ interface Option {
3
3
  value?: string;
4
4
  accessor?: string;
5
5
  isChecked?: boolean;
6
+ isDisabled?: boolean;
6
7
  }
7
8
  interface MultiSelectProps {
8
9
  options: Option[];
9
- type? : 'email' | 'text';
10
+ type?: 'email' | 'text';
10
11
  label: string;
11
12
  selectedOptions?: Option[];
12
13
  disabled?: boolean;
@@ -18,7 +19,7 @@ interface MultiSelectProps {
18
19
  errorMessage?: string;
19
20
  withSelectButton?: boolean;
20
21
  onSelect?: () => void;
21
- displayCount?:boolean;
22
+ displayCount?: boolean;
22
23
  }
23
24
 
24
- export { Option, MultiSelectProps };
25
+ export { Option, MultiSelectProps };
@@ -28,6 +28,10 @@
28
28
 
29
29
  .ff-select-wrapper {
30
30
  position: relative;
31
+
32
+ .ff-select-input {
33
+ cursor: pointer;
34
+ }
31
35
 
32
36
  .ff-select {
33
37
  @extend .fontSm;
@@ -17,10 +17,12 @@ type Story = StoryObj<typeof Select>;
17
17
  export const Primary: Story = {
18
18
  args: {
19
19
  label: 'Select',
20
+ labelAccessor: 'name',
21
+ valueAccessor: 'value',
20
22
  optionsList: [
21
- { label: 'Option 1', value: '1' },
22
- { label: 'Option 2', value: '2' },
23
- { label: 'Option 3', value: '3' },
23
+ { label: 'Option 1', value: '1', name: 'abcd' },
24
+ { label: 'Option 2', value: '2', name: '123' },
25
+ { label: 'Option 3', value: '3', name: '456' },
24
26
  ],
25
27
  },
26
28
  };
@@ -8,6 +8,7 @@ import Icon from '../Icon';
8
8
  import './Select.scss';
9
9
  import usePortalPosition from '../../hooks/usePortalPosition';
10
10
  import Typography from '../Typography';
11
+ import { getValue } from '../../utils/getSelectOptionValue/getSelectOptionValue';
11
12
 
12
13
  const selectReducer = (
13
14
  state: SelectState,
@@ -116,6 +117,8 @@ const Select = ({
116
117
  required = false,
117
118
  optionsRequired = true,
118
119
  selectedOptionColor = 'var(--ff-select-text-color)',
120
+ labelAccessor,
121
+ valueAccessor,
119
122
  }: SelectProps) => {
120
123
  const initialState: SelectState = useMemo(
121
124
  () => ({
@@ -164,7 +167,7 @@ const Select = ({
164
167
  if (actionType === 'SHOW_ERROR' || actionType === 'BLUR_INPUT') {
165
168
  dispatch({
166
169
  type: actionType,
167
- payload: { optionsList, option: selectedOption.value },
170
+ payload: { optionsList, option: getValue(selectedOption) },
168
171
  });
169
172
  } else {
170
173
  dispatch({ type: actionType });
@@ -176,9 +179,10 @@ const Select = ({
176
179
  if (disabled) return;
177
180
  const { value } = e.target;
178
181
  const filteredOptions = optionsList.filter((option) => {
179
- return typeof option.value === 'string'
180
- ? option.value.toLowerCase().includes(value.toLowerCase().trim())
181
- : option.value === Number(value);
182
+ const valueData = getValue(option, valueAccessor);
183
+ return typeof valueData === 'string'
184
+ ? valueData.toLowerCase().includes(value.toLowerCase().trim())
185
+ : valueData === Number(value);
182
186
  });
183
187
  dispatch({ type: 'UPDATE_OPTION_LIST', payload: filteredOptions });
184
188
  dispatch({ type: 'UPDATE_OPTION', payload: value });
@@ -197,7 +201,10 @@ const Select = ({
197
201
  const onSelectOptionSelector = (option: Option) => {
198
202
  if (!disabled) {
199
203
  onSelectBlur();
200
- dispatch({ type: 'UPDATE_OPTION', payload: option.value });
204
+ dispatch({
205
+ type: 'UPDATE_OPTION',
206
+ payload: getValue(option, valueAccessor),
207
+ });
201
208
  if (onChange) {
202
209
  onChange(option);
203
210
  }
@@ -247,8 +254,8 @@ const Select = ({
247
254
  const applyActiveOptionClasses = !isInputFocused && Boolean(option);
248
255
 
249
256
  return (
250
- <div className={classNames(`ff-select-wrapper ${className}`)}>
251
- <div className="ff-select">
257
+ <div className={classNames(`ff-select-wrapper`)}>
258
+ <div className={`ff-select ${className}`}>
252
259
  <input
253
260
  type="text"
254
261
  className={classNames('ff-select-input', {
@@ -361,6 +368,7 @@ const Select = ({
361
368
  options={options}
362
369
  optionZIndex={optionZIndex}
363
370
  inputRef={InputRef}
371
+ labelAccessor={labelAccessor}
364
372
  />,
365
373
  document.body
366
374
  )}