sag_components 2.0.0-beta177 → 2.0.0-beta178

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/dist/index.js CHANGED
@@ -11013,22 +11013,23 @@ const MonthPopupPicker = ({
11013
11013
  };
11014
11014
 
11015
11015
  /* eslint-disable import/no-extraneous-dependencies */
11016
- const MonthPicker = ({
11017
- availableMonths,
11018
- label,
11019
- onChange,
11020
- borderRadius,
11021
- required,
11022
- width,
11023
- height,
11024
- placeholder,
11025
- disabled,
11026
- borderColor,
11027
- borderColorFocus,
11028
- textColor,
11029
- selectedValue,
11030
- startYear
11031
- }) => {
11016
+ const MonthPicker = _ref => {
11017
+ let {
11018
+ availableMonths,
11019
+ label,
11020
+ onChange,
11021
+ borderRadius,
11022
+ required,
11023
+ width,
11024
+ height,
11025
+ placeholder,
11026
+ disabled,
11027
+ borderColor,
11028
+ borderColorFocus,
11029
+ textColor,
11030
+ selectedValue,
11031
+ startYear
11032
+ } = _ref;
11032
11033
  const [isFocused, setIsFocused] = React$1.useState(false);
11033
11034
  const [isOpen, setIsOpen] = React$1.useState(false);
11034
11035
  const [value, setValue] = React$1.useState('');
@@ -24139,21 +24140,22 @@ const DeleteIcon = styled__default["default"].div`
24139
24140
  position: absolute;
24140
24141
  `;
24141
24142
 
24142
- const QuickFilterDropdownSingle = ({
24143
- label,
24144
- hoverColor,
24145
- options,
24146
- selectedValue,
24147
- placeHolder,
24148
- onChange,
24149
- disabled,
24150
- width,
24151
- error,
24152
- errorMessage,
24153
- xIconShow,
24154
- labelColor,
24155
- showLabelOnTop
24156
- }) => {
24143
+ const QuickFilterDropdownSingle = _ref => {
24144
+ let {
24145
+ label,
24146
+ hoverColor,
24147
+ options,
24148
+ selectedValue,
24149
+ placeHolder,
24150
+ onChange,
24151
+ disabled,
24152
+ width,
24153
+ error,
24154
+ errorMessage,
24155
+ xIconShow,
24156
+ labelColor,
24157
+ showLabelOnTop
24158
+ } = _ref;
24157
24159
  const [isFocused, setIsFocused] = React$1.useState(false);
24158
24160
  const [showOptions, setShowOptions] = React$1.useState(false);
24159
24161
  const [inputValue, setInputValue] = React$1.useState("");
@@ -24550,23 +24552,24 @@ const IconContainer$2 = styled__default["default"].div`
24550
24552
  cursor: pointer;
24551
24553
  `;
24552
24554
 
24553
- const QuickFilterDropdownMultiSelection = ({
24554
- label,
24555
- labelEmptyValue,
24556
- options,
24557
- selectedValue,
24558
- placeHolder,
24559
- onChange,
24560
- required,
24561
- disabled,
24562
- width,
24563
- error,
24564
- errorMessage,
24565
- labelColor,
24566
- xIconShow,
24567
- checkBoxColor,
24568
- showLabelOnTop
24569
- }) => {
24555
+ const QuickFilterDropdownMultiSelection = _ref => {
24556
+ let {
24557
+ label,
24558
+ labelEmptyValue,
24559
+ options,
24560
+ selectedValue,
24561
+ placeHolder,
24562
+ onChange,
24563
+ required,
24564
+ disabled,
24565
+ width,
24566
+ error,
24567
+ errorMessage,
24568
+ labelColor,
24569
+ xIconShow,
24570
+ checkBoxColor,
24571
+ showLabelOnTop
24572
+ } = _ref;
24570
24573
  const [isFocused, setIsFocused] = React$1.useState(false);
24571
24574
  const [showOptions, setShowOptions] = React$1.useState(false);
24572
24575
  const [inputValue, setInputValue] = React$1.useState('');
@@ -35882,9 +35885,9 @@ const ToggleSlider = styled__default["default"].span`
35882
35885
  }
35883
35886
  `;
35884
35887
 
35885
- /**
35886
- * ToggleSwitch component for on/off states.
35887
- * Supports small/large sizes and disabled state.
35888
+ /**
35889
+ * ToggleSwitch component for on/off states.
35890
+ * Supports small/large sizes and disabled state.
35888
35891
  */
35889
35892
  function ToggleSwitch(_ref) {
35890
35893
  let {
@@ -37851,7 +37854,9 @@ const TableHeader = ({
37851
37854
  onSelectAll,
37852
37855
  activeFilters = [],
37853
37856
  activeSorts = [],
37854
- expandable = false
37857
+ expandable = false,
37858
+ onHeaderCheckboxClick = () => {},
37859
+ headerCheckboxStates = {}
37855
37860
  }) => {
37856
37861
  const [focusedFilter, setFocusedFilter] = React$1.useState(null);
37857
37862
  const [focusedSort, setFocusedSort] = React$1.useState(null);
@@ -38201,6 +38206,20 @@ const TableHeader = ({
38201
38206
  return isFocused || isActive || hasSelection;
38202
38207
  };
38203
38208
 
38209
+ // Handle header checkbox click
38210
+ const handleHeaderCheckboxClick = (columnKey, event) => {
38211
+ // Don't prevent the default checkbox behavior
38212
+ const newValue = event.target.checked;
38213
+
38214
+ // Fire the callback with column info and new value - let parent handle state
38215
+ if (onHeaderCheckboxClick) {
38216
+ onHeaderCheckboxClick({
38217
+ columnName: columnKey,
38218
+ checked: newValue
38219
+ });
38220
+ }
38221
+ };
38222
+
38204
38223
  // Update showColumnFilter to pass current filterSelections to stateless FilterPop
38205
38224
  const showColumnFilter = column => {
38206
38225
  const {
@@ -38304,7 +38323,24 @@ const TableHeader = ({
38304
38323
  type: "checkbox",
38305
38324
  onChange: e => handleCheckboxChange(column.key, e.target.checked),
38306
38325
  "data-column": column.key
38307
- }), /*#__PURE__*/React__default["default"].createElement(ColumnLabel, null, column.title), (column.filter || column.sort) && /*#__PURE__*/React__default["default"].createElement(ColumnActions, null, column.sort && /*#__PURE__*/React__default["default"].createElement(IconButton, {
38326
+ }), column.fieldType?.toLowerCase() === 'checkbox' && column.showCheckboxInTitle !== false && /*#__PURE__*/React__default["default"].createElement(ColumnCheckbox, {
38327
+ type: "checkbox",
38328
+ checked: headerCheckboxStates[column.key] || false,
38329
+ onChange: e => handleHeaderCheckboxClick(column.key, e),
38330
+ "data-column": column.key,
38331
+ style: {
38332
+ width: '18px',
38333
+ height: '18px',
38334
+ marginLeft: '10px',
38335
+ // Moved 5px more to the right (was 5px)
38336
+ cursor: 'pointer',
38337
+ accentColor: '#066768',
38338
+ // Use the same green color as row checkboxes
38339
+ display: 'flex',
38340
+ alignItems: 'center',
38341
+ justifyContent: 'center'
38342
+ }
38343
+ }), column.fieldType?.toLowerCase() !== 'checkbox' && /*#__PURE__*/React__default["default"].createElement(ColumnLabel, null, column.title), (column.filter || column.sort) && /*#__PURE__*/React__default["default"].createElement(ColumnActions, null, column.sort && /*#__PURE__*/React__default["default"].createElement(IconButton, {
38308
38344
  ref: el => iconRefs.current[`sort-${column.key}`] = el,
38309
38345
  onClick: () => handleSort(column.key),
38310
38346
  onMouseEnter: () => setFocusedSort(column.key),
@@ -39280,8 +39316,19 @@ const DropdownButton$1 = styled__default["default"].button`
39280
39316
  align-items: center;
39281
39317
  justify-content: space-between;
39282
39318
  width: 100%;
39283
- min-width: 120px;
39284
- background-color: ${props => props.$isRowFocused || props.$isRowHovered ? props.$selectedColor : "white"};
39319
+ min-width: 120px;
39320
+ background-color: ${props => {
39321
+ // When row is being hovered (regardless of focus state), use hover color
39322
+ if (props.$isRowHovered) {
39323
+ return props.$selectedColor; // Use selected color for row hover
39324
+ }
39325
+ // Row focused/selected state (only when NOT hovering the row) - should use selected color
39326
+ if (props.$isRowFocused) {
39327
+ return props.$selectedColor; // Use selected color when row is focused/selected
39328
+ }
39329
+ // Default
39330
+ return 'white';
39331
+ }};
39285
39332
  border: none;
39286
39333
  border-radius: 0;
39287
39334
  font-family: "Poppins", sans-serif;
@@ -39314,7 +39361,22 @@ const DropdownIcon = styled__default["default"].div`
39314
39361
  justify-content: center;
39315
39362
  width: 20px;
39316
39363
  height: 20px;
39317
- background-color: ${props => props.$isRowFocused || props.$isRowHovered ? '#B4D1D2' : 'white'};
39364
+ background-color: ${props => {
39365
+ // Highest Priority: dropdown-specific hover takes precedence over everything
39366
+ if (props.$isDropdownHovered) {
39367
+ return '#B4D1D2'; // Green color when specifically hovering this dropdown
39368
+ }
39369
+ // When row is being hovered (regardless of focus state), other dropdowns should use hover color
39370
+ if (props.$isRowHovered) {
39371
+ return '#E6F0F0'; // Light gray when row is hovered but not this specific dropdown
39372
+ }
39373
+ // Row focused/selected state (only when NOT hovering the row) - should use green color
39374
+ if (props.$isRowFocused) {
39375
+ return '#B4D1D2'; // Green color when row is focused/selected but not being hovered
39376
+ }
39377
+ // Default
39378
+ return 'white';
39379
+ }};
39318
39380
  border-radius: 4px;
39319
39381
  margin-left: 8px;
39320
39382
  transition: all 0.2s ease;
@@ -39326,8 +39388,14 @@ const DropdownIcon = styled__default["default"].div`
39326
39388
  const DropdownMenu = styled__default["default"].div`
39327
39389
  position: absolute;
39328
39390
  top: calc(100%);
39329
- left: 0;
39330
- right: 0;
39391
+ ${props => {
39392
+ if (props.$dropdownOptionsAlignment === 'left') {
39393
+ return props.$dropdownOptionsWidth ? `left: 0; width: ${props.$dropdownOptionsWidth};` : 'left: 0; right: 0;';
39394
+ } else {
39395
+ // Default: right alignment
39396
+ return props.$dropdownOptionsWidth ? `right: 0; width: ${props.$dropdownOptionsWidth};` : 'left: 0; right: 0;';
39397
+ }
39398
+ }}
39331
39399
  z-index: 1000;
39332
39400
  background-color: white;
39333
39401
  border: none;
@@ -39396,23 +39464,41 @@ const Dropdown = ({
39396
39464
  maxDropdownHeight,
39397
39465
  isRowFocused = false,
39398
39466
  isRowHovered = false,
39399
- selectedColor
39467
+ selectedColor,
39468
+ dropdownOptionsWidth,
39469
+ dropdownOptionsAlignment = 'right',
39470
+ placeholder = 'Select...'
39400
39471
  }) => {
39401
- return /*#__PURE__*/React__default["default"].createElement(DropdownContainer$1, null, /*#__PURE__*/React__default["default"].createElement(DropdownButton$1, {
39472
+ const [isDropdownHovered, setIsDropdownHovered] = React$1.useState(false);
39473
+
39474
+ // Reset dropdown hover state when dropdown closes
39475
+ React$1.useEffect(() => {
39476
+ if (!isOpen) {
39477
+ setIsDropdownHovered(false);
39478
+ }
39479
+ }, [isOpen]);
39480
+ return /*#__PURE__*/React__default["default"].createElement(DropdownContainer$1, {
39481
+ onMouseEnter: () => setIsDropdownHovered(true),
39482
+ onMouseLeave: () => setIsDropdownHovered(false)
39483
+ }, /*#__PURE__*/React__default["default"].createElement(DropdownButton$1, {
39402
39484
  onClick: onToggle,
39403
39485
  $isOpen: isOpen,
39404
39486
  $isRowFocused: isRowFocused,
39487
+ $isRowHovered: isRowHovered,
39405
39488
  $selectedColor: selectedColor
39406
39489
  }, /*#__PURE__*/React__default["default"].createElement("span", null, displayText), /*#__PURE__*/React__default["default"].createElement(DropdownIcon, {
39407
39490
  $isOpen: isOpen,
39408
39491
  $isRowFocused: isRowFocused,
39409
- $isRowHovered: isRowHovered
39492
+ $isRowHovered: isRowHovered,
39493
+ $isDropdownHovered: isDropdownHovered
39410
39494
  }, /*#__PURE__*/React__default["default"].createElement(MenuItemOpenIcon, {
39411
39495
  width: "10",
39412
39496
  height: "6",
39413
39497
  color: "#212121"
39414
39498
  }))), isOpen && /*#__PURE__*/React__default["default"].createElement(DropdownMenu, {
39415
- $maxDropdownHeight: maxDropdownHeight
39499
+ $maxDropdownHeight: maxDropdownHeight,
39500
+ $dropdownOptionsWidth: dropdownOptionsWidth,
39501
+ $dropdownOptionsAlignment: dropdownOptionsAlignment
39416
39502
  }, options.map((option, index) => /*#__PURE__*/React__default["default"].createElement(DropdownOption, {
39417
39503
  key: index,
39418
39504
  onClick: e => onOptionSelect(option, e),
@@ -39436,7 +39522,10 @@ Dropdown.propTypes = {
39436
39522
  maxDropdownHeight: PropTypes.string,
39437
39523
  isRowFocused: PropTypes.bool,
39438
39524
  isRowHovered: PropTypes.bool,
39439
- selectedColor: PropTypes.string
39525
+ selectedColor: PropTypes.string,
39526
+ dropdownOptionsWidth: PropTypes.string,
39527
+ dropdownOptionsAlignment: PropTypes.oneOf(['left', 'right']),
39528
+ placeholder: PropTypes.string
39440
39529
  };
39441
39530
 
39442
39531
  // TableBody.jsx
@@ -39475,6 +39564,8 @@ const TableBody = ({
39475
39564
  expandedBackgroundColor = '#E6F0F0',
39476
39565
  // New prop with default
39477
39566
  onDropdownSelected = () => {},
39567
+ onCheckboxClick = () => {},
39568
+ onHeaderCheckboxClick = () => {},
39478
39569
  ref = null
39479
39570
  }) => {
39480
39571
  const [hoveredRowIndex, setHoveredRowIndex] = React$1.useState(null);
@@ -39824,10 +39915,13 @@ const TableBody = ({
39824
39915
  const isOpen = openDropdowns[dropdownKey] || false;
39825
39916
  const dropdownOptions = column.dropdownOptions || [];
39826
39917
  const maxDropdownHeight = column.maxDropdownHeight || '200px';
39918
+ const dropdownOptionsWidth = column.dropdownOptionsWidth; // Get from column config
39919
+ const dropdownOptionsAlignment = column.dropdownOptionsAlignment || 'right'; // Get from column config, default to 'right'
39920
+ const placeholder = column.placeholder || 'Select...'; // Get from column config, default to 'Select...'
39827
39921
 
39828
39922
  // Find the current selected option to display its label
39829
39923
  const currentOption = dropdownOptions.find(option => option.value === value);
39830
- const displayText = currentOption ? currentOption.label : value || 'Select...';
39924
+ const displayText = currentOption ? currentOption.label : value || placeholder;
39831
39925
  return /*#__PURE__*/React__default["default"].createElement(Dropdown, {
39832
39926
  isOpen: isOpen,
39833
39927
  options: dropdownOptions,
@@ -39836,10 +39930,37 @@ const TableBody = ({
39836
39930
  onToggle: e => handleDropdownClick(rowIndex, column.key, e),
39837
39931
  onOptionSelect: (option, e) => handleDropdownOptionClick(row, rowIndex, column.key, option, e),
39838
39932
  maxDropdownHeight: maxDropdownHeight,
39933
+ dropdownOptionsWidth: dropdownOptionsWidth,
39934
+ dropdownOptionsAlignment: dropdownOptionsAlignment,
39935
+ placeholder: placeholder,
39839
39936
  isRowFocused: focusedRowIndex === rowIndex,
39840
39937
  isRowHovered: hoveredRowIndex === rowIndex,
39841
39938
  selectedColor: selectedColor
39842
39939
  });
39940
+ case 'checkbox':
39941
+ const isChecked = Boolean(value); // Convert to boolean
39942
+
39943
+ return /*#__PURE__*/React__default["default"].createElement("div", {
39944
+ style: {
39945
+ display: 'flex',
39946
+ alignItems: 'center',
39947
+ justifyContent: 'center',
39948
+ width: '100%',
39949
+ height: '100%'
39950
+ }
39951
+ }, /*#__PURE__*/React__default["default"].createElement("input", {
39952
+ type: "checkbox",
39953
+ checked: isChecked,
39954
+ onChange: e => handleCheckboxClick(row, column.key, e),
39955
+ onClick: e => e.stopPropagation() // Prevent row click on checkbox click
39956
+ ,
39957
+ style: {
39958
+ width: '18px',
39959
+ height: '18px',
39960
+ cursor: 'pointer',
39961
+ accentColor: buttonColor // Use the theme color for checkbox
39962
+ }
39963
+ }));
39843
39964
  default:
39844
39965
  // Treat default as text
39845
39966
  return value.toString();
@@ -39859,6 +39980,28 @@ const TableBody = ({
39859
39980
  }
39860
39981
  };
39861
39982
 
39983
+ // Handle checkbox click
39984
+ const handleCheckboxClick = (row, columnKey, event) => {
39985
+ event.stopPropagation();
39986
+ const currentValue = row[columnKey];
39987
+ const newValue = !currentValue; // Toggle the value
39988
+
39989
+ // Create updated row with new checkbox value
39990
+ const updatedRow = {
39991
+ ...row,
39992
+ [columnKey]: newValue
39993
+ };
39994
+
39995
+ // Fire the onCheckboxClick event with updated row
39996
+ if (onCheckboxClick) {
39997
+ onCheckboxClick({
39998
+ fullRow: updatedRow,
39999
+ columnName: columnKey,
40000
+ checked: newValue
40001
+ });
40002
+ }
40003
+ };
40004
+
39862
40005
  // Handle dropdown click
39863
40006
  const handleDropdownClick = (rowIndex, columnKey, event) => {
39864
40007
  event.stopPropagation();
@@ -39995,6 +40138,8 @@ TableBody.propTypes = {
39995
40138
  onCommentSave: PropTypes.func,
39996
40139
  commentTextLimit: PropTypes.number,
39997
40140
  onDropdownSelected: PropTypes.func,
40141
+ onCheckboxClick: PropTypes.func,
40142
+ onHeaderCheckboxClick: PropTypes.func,
39998
40143
  ref: PropTypes.object
39999
40144
  };
40000
40145
  TableBody.displayName = 'TableBody';
@@ -43354,6 +43499,9 @@ const Table = props => {
43354
43499
  expandedBackgroundColor = '#E6F0F0',
43355
43500
  // New prop
43356
43501
  onDropdownSelected = () => {},
43502
+ onCheckboxClick = () => {},
43503
+ onHeaderCheckboxClick = () => {},
43504
+ headerCheckboxStates = {},
43357
43505
  // Accept ref as a regular prop
43358
43506
  ref = null
43359
43507
  } = props;
@@ -43480,7 +43628,9 @@ const Table = props => {
43480
43628
  onSort: onSort,
43481
43629
  onFilter: onFilter,
43482
43630
  onSelectAll: onSelectAll,
43483
- expandable: expandable
43631
+ expandable: expandable,
43632
+ onHeaderCheckboxClick: onHeaderCheckboxClick,
43633
+ headerCheckboxStates: headerCheckboxStates
43484
43634
  }), columns.length > 0 && data.length > 0 && /*#__PURE__*/React__default["default"].createElement(TableBody, {
43485
43635
  ref: tableBodyRef,
43486
43636
  columns: columns,
@@ -43501,7 +43651,9 @@ const Table = props => {
43501
43651
  expandedContent: expandedContent,
43502
43652
  onExpandRow: onExpandRow,
43503
43653
  expandedBackgroundColor: expandedBackgroundColor,
43504
- onDropdownSelected: onDropdownSelected
43654
+ onDropdownSelected: onDropdownSelected,
43655
+ onCheckboxClick: onCheckboxClick,
43656
+ onHeaderCheckboxClick: onHeaderCheckboxClick
43505
43657
  })), data.length === 0 && /*#__PURE__*/React__default["default"].createElement(NoEventsParent, null, /*#__PURE__*/React__default["default"].createElement(NoEventsWrapper, null, showNoDataInSearch ? getNoDataSearchIcon(noDataSearchIcon) : getNoDataIcon(noDataIcon)), /*#__PURE__*/React__default["default"].createElement(NoEventsMessage, null, showNoDataInSearch ? /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("strong", null, noDataInSearchTitle), /*#__PURE__*/React__default["default"].createElement("br", null), noDataInSearchMessage) : /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("strong", null, noEventsTitle), /*#__PURE__*/React__default["default"].createElement("br", null), noEventsSubtitle)), !showNoDataInSearch && showNoEventsButton && /*#__PURE__*/React__default["default"].createElement(Button$1, {
43506
43658
  height: "45px",
43507
43659
  leftIcon: noEventsButtonIcon,