@itwin/itwinui-react 1.44.0 → 1.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +2 -2
  3. package/cjs/core/Breadcrumbs/Breadcrumbs.d.ts +116 -0
  4. package/cjs/core/Breadcrumbs/Breadcrumbs.js +2 -3
  5. package/cjs/core/ButtonGroup/ButtonGroup.js +1 -1
  6. package/cjs/core/ColorPicker/ColorSwatch.d.ts +1 -1
  7. package/cjs/core/DatePicker/DatePicker.d.ts +24 -4
  8. package/cjs/core/DatePicker/DatePicker.js +116 -19
  9. package/cjs/core/Dialog/Dialog.d.ts +5 -5
  10. package/cjs/core/Dialog/Dialog.js +38 -6
  11. package/cjs/core/Dialog/DialogBackdrop.d.ts +2 -2
  12. package/cjs/core/Dialog/DialogBackdrop.js +2 -2
  13. package/cjs/core/Dialog/DialogContext.d.ts +31 -0
  14. package/cjs/core/Dialog/DialogDragContext.d.ts +8 -0
  15. package/cjs/core/Dialog/DialogDragContext.js +28 -0
  16. package/cjs/core/Dialog/DialogMain.d.ts +2 -2
  17. package/cjs/core/Dialog/DialogMain.js +46 -6
  18. package/cjs/core/Dialog/DialogTitleBar.d.ts +2 -2
  19. package/cjs/core/Dialog/DialogTitleBar.js +12 -2
  20. package/cjs/core/Modal/Modal.js +1 -1
  21. package/cjs/core/Table/Table.d.ts +9 -1
  22. package/cjs/core/Table/Table.js +51 -6
  23. package/cjs/core/Table/TableRowMemoized.d.ts +10 -2
  24. package/cjs/core/Table/TableRowMemoized.js +23 -7
  25. package/cjs/core/Table/actionHandlers/index.d.ts +1 -1
  26. package/cjs/core/Table/actionHandlers/index.js +2 -1
  27. package/cjs/core/Table/actionHandlers/resizeHandler.d.ts +2 -0
  28. package/cjs/core/Table/actionHandlers/selectHandler.d.ts +5 -0
  29. package/cjs/core/Table/actionHandlers/selectHandler.js +35 -2
  30. package/cjs/core/Table/cells/DefaultCell.d.ts +14 -1
  31. package/cjs/core/Table/cells/DefaultCell.js +10 -4
  32. package/cjs/core/index.d.ts +3 -1
  33. package/cjs/core/index.js +6 -3
  34. package/cjs/core/utils/components/MiddleTextTruncation.d.ts +15 -1
  35. package/cjs/core/utils/components/MiddleTextTruncation.js +14 -3
  36. package/cjs/core/utils/components/Resizer.d.ts +31 -0
  37. package/cjs/core/utils/components/Resizer.js +206 -0
  38. package/cjs/core/utils/components/VirtualScroll.js +26 -24
  39. package/cjs/core/utils/components/index.d.ts +1 -0
  40. package/cjs/core/utils/components/index.js +1 -0
  41. package/cjs/core/utils/functions/index.d.ts +1 -0
  42. package/cjs/core/utils/functions/index.js +1 -0
  43. package/cjs/core/utils/functions/styles.d.ts +6 -0
  44. package/cjs/core/utils/functions/styles.js +21 -0
  45. package/cjs/core/utils/hooks/useContainerWidth.d.ts +1 -1
  46. package/cjs/core/utils/hooks/useDragAndDrop.d.ts +14 -0
  47. package/cjs/core/utils/hooks/useDragAndDrop.js +110 -0
  48. package/cjs/core/utils/hooks/useEventListener.d.ts +1 -1
  49. package/cjs/core/utils/hooks/useOverflow.d.ts +1 -1
  50. package/cjs/core/utils/hooks/useResizeObserver.d.ts +1 -1
  51. package/cjs/types/react-table-config.d.ts +2 -1
  52. package/esm/core/Breadcrumbs/Breadcrumbs.d.ts +116 -0
  53. package/esm/core/Breadcrumbs/Breadcrumbs.js +2 -3
  54. package/esm/core/ButtonGroup/ButtonGroup.js +1 -1
  55. package/esm/core/ColorPicker/ColorSwatch.d.ts +1 -1
  56. package/esm/core/DatePicker/DatePicker.d.ts +24 -4
  57. package/esm/core/DatePicker/DatePicker.js +116 -19
  58. package/esm/core/Dialog/Dialog.d.ts +5 -5
  59. package/esm/core/Dialog/Dialog.js +37 -5
  60. package/esm/core/Dialog/DialogBackdrop.d.ts +2 -2
  61. package/esm/core/Dialog/DialogBackdrop.js +2 -2
  62. package/esm/core/Dialog/DialogContext.d.ts +31 -0
  63. package/esm/core/Dialog/DialogDragContext.d.ts +8 -0
  64. package/esm/core/Dialog/DialogDragContext.js +21 -0
  65. package/esm/core/Dialog/DialogMain.d.ts +2 -2
  66. package/esm/core/Dialog/DialogMain.js +47 -7
  67. package/esm/core/Dialog/DialogTitleBar.d.ts +2 -2
  68. package/esm/core/Dialog/DialogTitleBar.js +12 -2
  69. package/esm/core/Modal/Modal.js +1 -1
  70. package/esm/core/Table/Table.d.ts +9 -1
  71. package/esm/core/Table/Table.js +53 -8
  72. package/esm/core/Table/TableRowMemoized.d.ts +10 -2
  73. package/esm/core/Table/TableRowMemoized.js +23 -7
  74. package/esm/core/Table/actionHandlers/index.d.ts +1 -1
  75. package/esm/core/Table/actionHandlers/index.js +1 -1
  76. package/esm/core/Table/actionHandlers/resizeHandler.d.ts +2 -0
  77. package/esm/core/Table/actionHandlers/selectHandler.d.ts +5 -0
  78. package/esm/core/Table/actionHandlers/selectHandler.js +33 -1
  79. package/esm/core/Table/cells/DefaultCell.d.ts +14 -1
  80. package/esm/core/Table/cells/DefaultCell.js +10 -4
  81. package/esm/core/index.d.ts +3 -1
  82. package/esm/core/index.js +2 -1
  83. package/esm/core/utils/components/MiddleTextTruncation.d.ts +15 -1
  84. package/esm/core/utils/components/MiddleTextTruncation.js +14 -3
  85. package/esm/core/utils/components/Resizer.d.ts +31 -0
  86. package/esm/core/utils/components/Resizer.js +199 -0
  87. package/esm/core/utils/components/VirtualScroll.js +26 -24
  88. package/esm/core/utils/components/index.d.ts +1 -0
  89. package/esm/core/utils/components/index.js +1 -0
  90. package/esm/core/utils/functions/index.d.ts +1 -0
  91. package/esm/core/utils/functions/index.js +1 -0
  92. package/esm/core/utils/functions/styles.d.ts +6 -0
  93. package/esm/core/utils/functions/styles.js +17 -0
  94. package/esm/core/utils/hooks/useContainerWidth.d.ts +1 -1
  95. package/esm/core/utils/hooks/useDragAndDrop.d.ts +14 -0
  96. package/esm/core/utils/hooks/useDragAndDrop.js +103 -0
  97. package/esm/core/utils/hooks/useEventListener.d.ts +1 -1
  98. package/esm/core/utils/hooks/useOverflow.d.ts +1 -1
  99. package/esm/core/utils/hooks/useResizeObserver.d.ts +1 -1
  100. package/esm/types/react-table-config.d.ts +2 -1
  101. package/package.json +1 -1
@@ -11,7 +11,7 @@ var __assign = (this && this.__assign) || function () {
11
11
  return __assign.apply(this, arguments);
12
12
  };
13
13
  Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.onSingleSelectHandler = exports.onSelectHandler = void 0;
14
+ exports.onShiftSelectHandler = exports.onSingleSelectHandler = exports.onSelectHandler = void 0;
15
15
  /**
16
16
  * Handles selection when clicked on a checkbox.
17
17
  */
@@ -61,12 +61,45 @@ var onSingleSelectHandler = function (state, action, instance, onSelect, isRowDi
61
61
  };
62
62
  handleRow_1(instance.rowsById[action.id]);
63
63
  }
64
- var newState = __assign(__assign({}, state), { selectedRowIds: selectedRowIds });
64
+ var newState = __assign(__assign({}, state), { lastSelectedRowId: action.id, selectedRowIds: selectedRowIds });
65
65
  // Passing to `onSelectHandler` to handle filtered sub-rows
66
66
  (0, exports.onSelectHandler)(newState, instance, onSelect, isRowDisabled);
67
67
  return newState;
68
68
  };
69
69
  exports.onSingleSelectHandler = onSingleSelectHandler;
70
+ /**
71
+ * Handles selection when clicked on a row while shift key is pressed.
72
+ */
73
+ var onShiftSelectHandler = function (state, action, instance, onSelect, isRowDisabled) {
74
+ if (instance == null) {
75
+ return state;
76
+ }
77
+ var startIndex = Math.max(0, instance.flatRows.findIndex(function (row) { return row.id === state.lastSelectedRowId; }));
78
+ var endIndex = Math.max(0, instance.flatRows.findIndex(function (row) { return row.id === action.id; }));
79
+ if (startIndex > endIndex) {
80
+ var temp = startIndex;
81
+ startIndex = endIndex;
82
+ endIndex = temp;
83
+ }
84
+ var selectedRowIds = {};
85
+ // 1. Select all rows between start and end
86
+ instance.flatRows
87
+ .slice(startIndex, endIndex + 1)
88
+ .forEach(function (r) { return (selectedRowIds[r.id] = true); });
89
+ // 2. Select all children of the last row (endIndex)
90
+ // Since lastRow's children come after endIndex + 1 (not selected in step 1)
91
+ var handleRow = function (row) {
92
+ selectedRowIds[row.id] = true;
93
+ row.subRows.forEach(function (r) { return handleRow(r); });
94
+ };
95
+ handleRow(instance.flatRows[endIndex]);
96
+ var newState = __assign(__assign({}, state), { selectedRowIds: selectedRowIds });
97
+ // 3.1 Deselect all selected disabled rows and their children
98
+ // 3.2 Convert all partially selected rows marked with tick mark to horizontal line
99
+ (0, exports.onSelectHandler)(newState, instance, onSelect, isRowDisabled);
100
+ return newState;
101
+ };
102
+ exports.onShiftSelectHandler = onShiftSelectHandler;
70
103
  var getSelectedData = function (selectedRowIds, instance) {
71
104
  var selectedData = [];
72
105
  var setSelectedData = function (row) {
@@ -1,6 +1,19 @@
1
1
  import React from 'react';
2
2
  import { CellRendererProps } from 'react-table';
3
- export declare type DefaultCellProps<T extends Record<string, unknown>> = CellRendererProps<T> & React.ComponentPropsWithoutRef<'div'>;
3
+ export declare type DefaultCellProps<T extends Record<string, unknown>> = {
4
+ /**
5
+ * Custom icon to be displayed at the beginning of the cell.
6
+ */
7
+ startIcon?: JSX.Element;
8
+ /**
9
+ * Custom icon to be displayed at the end of the cell.
10
+ */
11
+ endIcon?: JSX.Element;
12
+ /**
13
+ * Status of the cell.
14
+ */
15
+ status?: 'positive' | 'negative' | 'warning';
16
+ } & CellRendererProps<T> & React.ComponentPropsWithoutRef<'div'>;
4
17
  /**
5
18
  * Default cell.
6
19
  * It should be passed to `cellRenderer`.
@@ -44,12 +44,18 @@ var classnames_1 = __importDefault(require("classnames"));
44
44
  * }
45
45
  */
46
46
  var DefaultCell = function (props) {
47
+ var _a;
47
48
  // Omitting `cellProps`
48
49
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
49
- var _a = props.cellElementProps, cellElementClassName = _a.className, cellElementStyle = _a.style, cellElementProps = __rest(_a, ["className", "style"]), children = props.children, cellProps = props.cellProps, isDisabled = props.isDisabled, className = props.className, style = props.style, rest = __rest(props, ["cellElementProps", "children", "cellProps", "isDisabled", "className", "style"]);
50
- return (react_1.default.createElement("div", __assign({}, cellElementProps, rest, { className: (0, classnames_1.default)(cellElementClassName, className, {
51
- 'iui-disabled': isDisabled === null || isDisabled === void 0 ? void 0 : isDisabled(cellProps.row.original),
52
- }), style: __assign(__assign({}, cellElementStyle), style) }), children));
50
+ var _b = props.cellElementProps, cellElementClassName = _b.className, cellElementStyle = _b.style, cellElementProps = __rest(_b, ["className", "style"]), children = props.children, startIcon = props.startIcon, endIcon = props.endIcon, cellProps = props.cellProps, isDisabled = props.isDisabled, className = props.className, style = props.style, status = props.status, rest = __rest(props, ["cellElementProps", "children", "startIcon", "endIcon", "cellProps", "isDisabled", "className", "style", "status"]);
51
+ return (react_1.default.createElement("div", __assign({}, cellElementProps, rest, { className: (0, classnames_1.default)(cellElementClassName, className, (_a = {
52
+ 'iui-disabled': isDisabled === null || isDisabled === void 0 ? void 0 : isDisabled(cellProps.row.original)
53
+ },
54
+ _a["iui-".concat(status)] = !!status,
55
+ _a)), style: __assign(__assign({}, cellElementStyle), style) }),
56
+ startIcon && react_1.default.createElement("div", { className: 'iui-cell-start-icon' }, startIcon),
57
+ children,
58
+ endIcon && react_1.default.createElement("div", { className: 'iui-cell-end-icon' }, endIcon)));
53
59
  };
54
60
  exports.DefaultCell = DefaultCell;
55
61
  exports.default = exports.DefaultCell;
@@ -20,6 +20,8 @@ export { ComboBox } from './ComboBox';
20
20
  export type { ComboBoxProps } from './ComboBox';
21
21
  export { DatePicker, generateLocalizedStrings } from './DatePicker';
22
22
  export type { DatePickerProps } from './DatePicker';
23
+ export { Dialog } from './Dialog';
24
+ export type { DialogProps, DialogButtonBarProps, DialogContentProps, DialogMainProps, DialogTitleBarProps, } from './Dialog';
23
25
  export { DropdownMenu } from './DropdownMenu';
24
26
  export type { DropdownMenuProps } from './DropdownMenu';
25
27
  export { ErrorPage } from './ErrorPage';
@@ -72,7 +74,7 @@ export { StatusMessage } from './StatusMessage';
72
74
  export type { StatusMessageProps } from './StatusMessage';
73
75
  export { Surface } from './Surface';
74
76
  export type { SurfaceProps } from './Surface';
75
- export { Table, tableFilters, FilterButtonBar, DefaultCell, EditableCell, TablePaginator, ActionColumn, ExpanderColumn, SelectionColumn, } from './Table';
77
+ export { Table, tableFilters, BaseFilter, FilterButtonBar, DefaultCell, EditableCell, TablePaginator, ActionColumn, ExpanderColumn, SelectionColumn, } from './Table';
76
78
  export type { TableProps, TableFilterProps, TableFilterValue, DateRangeFilterOptions, FilterButtonBarProps, DefaultCellProps, EditableCellProps, TablePaginatorProps, TablePaginatorRendererProps, } from './Table';
77
79
  export { Tag, TagContainer } from './Tag';
78
80
  export type { TagProps, TagContainerProps } from './Tag';
package/cjs/core/index.js CHANGED
@@ -3,9 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.MenuDivider = exports.MenuItem = exports.Menu = exports.LabeledTextarea = exports.LabeledSelect = exports.InputGroup = exports.LabeledInput = exports.Label = exports.Input = exports.InformationPanelContent = exports.InformationPanelBody = exports.InformationPanelHeader = exports.InformationPanelWrapper = exports.InformationPanel = exports.HorizontalTab = exports.HorizontalTabs = exports.Tab = exports.VerticalTabs = exports.HeaderLogo = exports.HeaderButton = exports.HeaderBreadcrumbs = exports.Header = exports.defaultFooterElements = exports.Footer = exports.FileUploadTemplate = exports.FileUpload = exports.Fieldset = exports.ExpandableBlock = exports.ErrorPage = exports.DropdownMenu = exports.generateLocalizedStrings = exports.DatePicker = exports.ComboBox = exports.ColorPalette = exports.ColorInputPanel = exports.ColorBuilder = exports.ColorSwatch = exports.ColorPicker = exports.Checkbox = exports.Carousel = exports.ButtonGroup = exports.SplitButton = exports.IdeasButton = exports.IconButton = exports.DropdownButton = exports.Button = exports.Breadcrumbs = exports.Badge = exports.Backdrop = exports.Alert = void 0;
7
- exports.Kbd = exports.Code = exports.Blockquote = exports.Title = exports.Subheading = exports.Small = exports.Leading = exports.Headline = exports.Body = exports.Anchor = exports.TreeNodeExpander = exports.TreeNode = exports.Tree = exports.Tooltip = exports.ToggleSwitch = exports.ThemeProvider = exports.toaster = exports.TimePicker = exports.Tile = exports.Textarea = exports.TagContainer = exports.Tag = exports.SelectionColumn = exports.ExpanderColumn = exports.ActionColumn = exports.TablePaginator = exports.EditableCell = exports.DefaultCell = exports.FilterButtonBar = exports.tableFilters = exports.Table = exports.Surface = exports.StatusMessage = exports.Slider = exports.SkipToContentLink = exports.SidenavSubmenuHeader = exports.SidenavSubmenu = exports.SidenavButton = exports.SideNavigation = exports.Select = exports.RadioTileGroup = exports.RadioTile = exports.Radio = exports.ProgressRadial = exports.ProgressLinear = exports.ModalContent = exports.ModalButtonBar = exports.Modal = exports.MenuItemSkeleton = exports.MenuExtraContent = void 0;
8
- exports.MiddleTextTruncation = exports.ColorValue = exports.useTheme = exports.getUserColor = exports.Wizard = exports.UserIconGroup = exports.UserIcon = exports.Text = exports.KbdKeys = void 0;
6
+ exports.MenuItem = exports.Menu = exports.LabeledTextarea = exports.LabeledSelect = exports.InputGroup = exports.LabeledInput = exports.Label = exports.Input = exports.InformationPanelContent = exports.InformationPanelBody = exports.InformationPanelHeader = exports.InformationPanelWrapper = exports.InformationPanel = exports.HorizontalTab = exports.HorizontalTabs = exports.Tab = exports.VerticalTabs = exports.HeaderLogo = exports.HeaderButton = exports.HeaderBreadcrumbs = exports.Header = exports.defaultFooterElements = exports.Footer = exports.FileUploadTemplate = exports.FileUpload = exports.Fieldset = exports.ExpandableBlock = exports.ErrorPage = exports.DropdownMenu = exports.Dialog = exports.generateLocalizedStrings = exports.DatePicker = exports.ComboBox = exports.ColorPalette = exports.ColorInputPanel = exports.ColorBuilder = exports.ColorSwatch = exports.ColorPicker = exports.Checkbox = exports.Carousel = exports.ButtonGroup = exports.SplitButton = exports.IdeasButton = exports.IconButton = exports.DropdownButton = exports.Button = exports.Breadcrumbs = exports.Badge = exports.Backdrop = exports.Alert = void 0;
7
+ exports.Blockquote = exports.Title = exports.Subheading = exports.Small = exports.Leading = exports.Headline = exports.Body = exports.Anchor = exports.TreeNodeExpander = exports.TreeNode = exports.Tree = exports.Tooltip = exports.ToggleSwitch = exports.ThemeProvider = exports.toaster = exports.TimePicker = exports.Tile = exports.Textarea = exports.TagContainer = exports.Tag = exports.SelectionColumn = exports.ExpanderColumn = exports.ActionColumn = exports.TablePaginator = exports.EditableCell = exports.DefaultCell = exports.FilterButtonBar = exports.BaseFilter = exports.tableFilters = exports.Table = exports.Surface = exports.StatusMessage = exports.Slider = exports.SkipToContentLink = exports.SidenavSubmenuHeader = exports.SidenavSubmenu = exports.SidenavButton = exports.SideNavigation = exports.Select = exports.RadioTileGroup = exports.RadioTile = exports.Radio = exports.ProgressRadial = exports.ProgressLinear = exports.ModalContent = exports.ModalButtonBar = exports.Modal = exports.MenuItemSkeleton = exports.MenuExtraContent = exports.MenuDivider = void 0;
8
+ exports.MiddleTextTruncation = exports.ColorValue = exports.useTheme = exports.getUserColor = exports.Wizard = exports.UserIconGroup = exports.UserIcon = exports.Text = exports.KbdKeys = exports.Kbd = exports.Code = void 0;
9
9
  /*---------------------------------------------------------------------------------------------
10
10
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
11
11
  * See LICENSE.md in the project root for license terms and full copyright notice.
@@ -41,6 +41,8 @@ Object.defineProperty(exports, "ComboBox", { enumerable: true, get: function ()
41
41
  var DatePicker_1 = require("./DatePicker");
42
42
  Object.defineProperty(exports, "DatePicker", { enumerable: true, get: function () { return DatePicker_1.DatePicker; } });
43
43
  Object.defineProperty(exports, "generateLocalizedStrings", { enumerable: true, get: function () { return DatePicker_1.generateLocalizedStrings; } });
44
+ var Dialog_1 = require("./Dialog");
45
+ Object.defineProperty(exports, "Dialog", { enumerable: true, get: function () { return Dialog_1.Dialog; } });
44
46
  var DropdownMenu_1 = require("./DropdownMenu");
45
47
  Object.defineProperty(exports, "DropdownMenu", { enumerable: true, get: function () { return DropdownMenu_1.DropdownMenu; } });
46
48
  var ErrorPage_1 = require("./ErrorPage");
@@ -119,6 +121,7 @@ Object.defineProperty(exports, "Surface", { enumerable: true, get: function () {
119
121
  var Table_1 = require("./Table");
120
122
  Object.defineProperty(exports, "Table", { enumerable: true, get: function () { return Table_1.Table; } });
121
123
  Object.defineProperty(exports, "tableFilters", { enumerable: true, get: function () { return Table_1.tableFilters; } });
124
+ Object.defineProperty(exports, "BaseFilter", { enumerable: true, get: function () { return Table_1.BaseFilter; } });
122
125
  Object.defineProperty(exports, "FilterButtonBar", { enumerable: true, get: function () { return Table_1.FilterButtonBar; } });
123
126
  Object.defineProperty(exports, "DefaultCell", { enumerable: true, get: function () { return Table_1.DefaultCell; } });
124
127
  Object.defineProperty(exports, "EditableCell", { enumerable: true, get: function () { return Table_1.EditableCell; } });
@@ -1,4 +1,4 @@
1
- /// <reference types="react" />
1
+ import React from 'react';
2
2
  import { CommonProps } from '../props';
3
3
  export declare type MiddleTextTruncationProps = {
4
4
  /**
@@ -10,12 +10,26 @@ export declare type MiddleTextTruncationProps = {
10
10
  * @default 6
11
11
  */
12
12
  endCharsCount?: number;
13
+ /**
14
+ * Custom renderer for the truncated text.
15
+ */
16
+ textRenderer?: (truncatedText: string, originalText: string) => React.ReactNode;
13
17
  } & CommonProps;
14
18
  /**
15
19
  * Truncates text with the ellipsis in the middle,
16
20
  * leaving defined number of chars at the end.
17
21
  * @example
18
22
  * <MiddleTextTruncation text='ThisIsMyVeryLongFileName.dgn' />
23
+ * @example
24
+ * <MiddleTextTruncation text='ThisIsMyVeryLongFileName.dgn' endCharsCount={10} />
25
+ * @example
26
+ * <MiddleTextTruncation
27
+ * text='ThisIsMyVeryLongFileName.dgn'
28
+ * textRenderer={React.useCallback(
29
+ * (truncatedText) => <b>{truncatedText}</b>,
30
+ * []
31
+ * )}
32
+ * />
19
33
  */
20
34
  export declare const MiddleTextTruncation: (props: MiddleTextTruncationProps) => JSX.Element;
21
35
  export default MiddleTextTruncation;
@@ -38,10 +38,21 @@ var ELLIPSIS_CHAR = '…';
38
38
  * leaving defined number of chars at the end.
39
39
  * @example
40
40
  * <MiddleTextTruncation text='ThisIsMyVeryLongFileName.dgn' />
41
+ * @example
42
+ * <MiddleTextTruncation text='ThisIsMyVeryLongFileName.dgn' endCharsCount={10} />
43
+ * @example
44
+ * <MiddleTextTruncation
45
+ * text='ThisIsMyVeryLongFileName.dgn'
46
+ * textRenderer={React.useCallback(
47
+ * (truncatedText) => <b>{truncatedText}</b>,
48
+ * []
49
+ * )}
50
+ * />
41
51
  */
42
52
  var MiddleTextTruncation = function (props) {
43
- var text = props.text, _a = props.endCharsCount, endCharsCount = _a === void 0 ? 6 : _a, style = props.style, rest = __rest(props, ["text", "endCharsCount", "style"]);
44
- var _b = (0, useOverflow_1.useOverflow)(text), ref = _b[0], visibleCount = _b[1];
53
+ var _a;
54
+ var text = props.text, _b = props.endCharsCount, endCharsCount = _b === void 0 ? 6 : _b, textRenderer = props.textRenderer, style = props.style, rest = __rest(props, ["text", "endCharsCount", "textRenderer", "style"]);
55
+ var _c = (0, useOverflow_1.useOverflow)(text), ref = _c[0], visibleCount = _c[1];
45
56
  var truncatedText = react_1.default.useMemo(function () {
46
57
  if (visibleCount < text.length) {
47
58
  return "".concat(text.substring(0, visibleCount - endCharsCount - ELLIPSIS_CHAR.length)).concat(ELLIPSIS_CHAR).concat(text.substring(text.length - endCharsCount));
@@ -50,7 +61,7 @@ var MiddleTextTruncation = function (props) {
50
61
  return text;
51
62
  }
52
63
  }, [endCharsCount, text, visibleCount]);
53
- return (react_1.default.createElement("span", __assign({ style: __assign({ display: 'flex', minWidth: 0, flexGrow: 1, whiteSpace: 'nowrap' }, style), ref: ref }, rest), truncatedText));
64
+ return (react_1.default.createElement("span", __assign({ style: __assign({ display: 'flex', minWidth: 0, flexGrow: 1, whiteSpace: 'nowrap' }, style), ref: ref }, rest), (_a = textRenderer === null || textRenderer === void 0 ? void 0 : textRenderer(truncatedText, text)) !== null && _a !== void 0 ? _a : truncatedText));
54
65
  };
55
66
  exports.MiddleTextTruncation = MiddleTextTruncation;
56
67
  exports.default = exports.MiddleTextTruncation;
@@ -0,0 +1,31 @@
1
+ import React from 'react';
2
+ export declare type ResizerProps = {
3
+ /**
4
+ * Ref of the element that is being resized.
5
+ */
6
+ elementRef: React.RefObject<HTMLElement>;
7
+ /**
8
+ * Ref of the container element in order to avoid resizing past container boundaries.
9
+ * If not passed, viewport will be used.
10
+ */
11
+ containerRef?: React.RefObject<HTMLElement>;
12
+ /**
13
+ * Callback that is being called on resize end.
14
+ * Useful to preserve state if element is being closed.
15
+ */
16
+ onResizeEnd?: (style: React.CSSProperties) => void;
17
+ };
18
+ /**
19
+ * Component that allows to resize parent element.
20
+ * Parent must have `position: relative`.
21
+ * @private
22
+ * @example
23
+ * const ref = React.useRef<HTMLDivElement>(null);
24
+ * return (
25
+ * <div ref={ref} style={{ position: 'relative' }}>
26
+ * <Resizer elementRef={ref} />
27
+ * </div>
28
+ * );
29
+ */
30
+ export declare const Resizer: (props: ResizerProps) => JSX.Element;
31
+ export default Resizer;
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Resizer = void 0;
7
+ /*---------------------------------------------------------------------------------------------
8
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
9
+ * See LICENSE.md in the project root for license terms and full copyright notice.
10
+ *--------------------------------------------------------------------------------------------*/
11
+ var react_1 = __importDefault(require("react"));
12
+ var functions_1 = require("../functions");
13
+ /**
14
+ * Component that allows to resize parent element.
15
+ * Parent must have `position: relative`.
16
+ * @private
17
+ * @example
18
+ * const ref = React.useRef<HTMLDivElement>(null);
19
+ * return (
20
+ * <div ref={ref} style={{ position: 'relative' }}>
21
+ * <Resizer elementRef={ref} />
22
+ * </div>
23
+ * );
24
+ */
25
+ var Resizer = function (props) {
26
+ var elementRef = props.elementRef, containerRef = props.containerRef, onResizeEnd = props.onResizeEnd;
27
+ var onResizePointerDown = function (event) {
28
+ if (!elementRef.current || event.button !== 0) {
29
+ return;
30
+ }
31
+ var initialPointerX = event.clientX;
32
+ var initialPointerY = event.clientY;
33
+ var _a = (0, functions_1.getTranslateValues)(elementRef.current), initialTranslateX = _a[0], initialTranslateY = _a[1];
34
+ var _b = elementRef.current.getBoundingClientRect(), initialWidth = _b.width, initialHeight = _b.height;
35
+ var width = "".concat(initialWidth, "px");
36
+ var height = "".concat(initialHeight, "px");
37
+ var translateX = initialTranslateX;
38
+ var translateY = initialTranslateY;
39
+ var minWidth = parseFloat(getComputedStyle(elementRef.current).minWidth);
40
+ var minHeight = parseFloat(getComputedStyle(elementRef.current).minHeight);
41
+ var resizer = event.currentTarget.dataset.iuiResizer;
42
+ var originalUserSelect = elementRef.current.ownerDocument.body.style.userSelect;
43
+ elementRef.current.ownerDocument.body.style.userSelect = 'none';
44
+ var onResizePointerMove = function (event) {
45
+ var _a, _b, _c, _d, _e, _f, _g;
46
+ if (!elementRef.current) {
47
+ return;
48
+ }
49
+ var containerRect = (_a = containerRef === null || containerRef === void 0 ? void 0 : containerRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect();
50
+ var clientX = (0, functions_1.getBoundedValue)(event.clientX, (_b = containerRect === null || containerRect === void 0 ? void 0 : containerRect.left) !== null && _b !== void 0 ? _b : 0, (_d = (_c = containerRect === null || containerRect === void 0 ? void 0 : containerRect.right) !== null && _c !== void 0 ? _c : elementRef.current.ownerDocument.documentElement.clientWidth) !== null && _d !== void 0 ? _d : 0);
51
+ var clientY = (0, functions_1.getBoundedValue)(event.clientY, (_e = containerRect === null || containerRect === void 0 ? void 0 : containerRect.top) !== null && _e !== void 0 ? _e : 0, (_g = (_f = containerRect === null || containerRect === void 0 ? void 0 : containerRect.bottom) !== null && _f !== void 0 ? _f : elementRef.current.ownerDocument.documentElement.clientHeight) !== null && _g !== void 0 ? _g : 0);
52
+ var diffX = initialPointerX - clientX;
53
+ var diffY = initialPointerY - clientY;
54
+ switch (resizer) {
55
+ case 'top-left': {
56
+ var newHeight = initialHeight + diffY;
57
+ if (newHeight >= minHeight) {
58
+ height = elementRef.current.style.height = "".concat(newHeight, "px");
59
+ translateY = initialTranslateY - diffY;
60
+ }
61
+ var newWidth = initialWidth + diffX;
62
+ if (newWidth >= minWidth) {
63
+ width = elementRef.current.style.width = "".concat(newWidth, "px");
64
+ translateX = initialTranslateX - diffX;
65
+ }
66
+ elementRef.current.style.transform = "translate(".concat(translateX, "px, ").concat(translateY, "px)");
67
+ break;
68
+ }
69
+ case 'top': {
70
+ var newHeight = initialHeight + diffY;
71
+ if (newHeight < minHeight) {
72
+ break;
73
+ }
74
+ height = elementRef.current.style.height = "".concat(newHeight, "px");
75
+ translateY = initialTranslateY - diffY;
76
+ elementRef.current.style.transform = "translate(".concat(translateX, "px, ").concat(translateY, "px)");
77
+ break;
78
+ }
79
+ case 'top-right': {
80
+ var newHeight = initialHeight + diffY;
81
+ if (newHeight >= minHeight) {
82
+ height = elementRef.current.style.height = "".concat(newHeight, "px");
83
+ translateY = initialTranslateY - diffY;
84
+ }
85
+ width = elementRef.current.style.width = "".concat(initialWidth - diffX, "px");
86
+ elementRef.current.style.transform = "translate(".concat(translateX, "px, ").concat(translateY, "px)");
87
+ break;
88
+ }
89
+ case 'right': {
90
+ width = elementRef.current.style.width = "".concat(initialWidth - diffX, "px");
91
+ break;
92
+ }
93
+ case 'bottom-right': {
94
+ width = elementRef.current.style.width = "".concat(initialWidth - diffX, "px");
95
+ height = elementRef.current.style.height = "".concat(initialHeight - diffY, "px");
96
+ break;
97
+ }
98
+ case 'bottom': {
99
+ height = elementRef.current.style.height = "".concat(initialHeight - diffY, "px");
100
+ break;
101
+ }
102
+ case 'bottom-left': {
103
+ var newWidth = initialWidth + diffX;
104
+ if (newWidth >= minWidth) {
105
+ width = elementRef.current.style.width = "".concat(newWidth, "px");
106
+ translateX = initialTranslateX - diffX;
107
+ }
108
+ height = elementRef.current.style.height = "".concat(initialHeight - diffY, "px");
109
+ elementRef.current.style.transform = "translate(".concat(translateX, "px, ").concat(translateY, "px)");
110
+ break;
111
+ }
112
+ case 'left': {
113
+ var newWidth = initialWidth + diffX;
114
+ if (newWidth < minWidth) {
115
+ break;
116
+ }
117
+ width = elementRef.current.style.width = "".concat(newWidth, "px");
118
+ translateX = initialTranslateX - diffX;
119
+ elementRef.current.style.transform = "translate(".concat(translateX, "px, ").concat(translateY, "px)");
120
+ break;
121
+ }
122
+ default:
123
+ break;
124
+ }
125
+ };
126
+ elementRef.current.ownerDocument.addEventListener('pointermove', onResizePointerMove);
127
+ elementRef.current.ownerDocument.addEventListener('pointerup', function () {
128
+ document.removeEventListener('pointermove', onResizePointerMove);
129
+ if (elementRef.current) {
130
+ elementRef.current.ownerDocument.body.style.userSelect = originalUserSelect;
131
+ onResizeEnd === null || onResizeEnd === void 0 ? void 0 : onResizeEnd({
132
+ width: width,
133
+ height: height,
134
+ transform: "translate(".concat(translateX, "px, ").concat(translateY, "px)"),
135
+ });
136
+ }
137
+ }, { once: true });
138
+ };
139
+ return (react_1.default.createElement(react_1.default.Fragment, null,
140
+ react_1.default.createElement("div", { "data-iui-resizer": 'top-left', onPointerDown: onResizePointerDown, style: {
141
+ position: 'absolute',
142
+ top: -4,
143
+ left: -4,
144
+ width: 12,
145
+ height: 12,
146
+ cursor: 'nw-resize',
147
+ } }),
148
+ react_1.default.createElement("div", { "data-iui-resizer": 'top', onPointerDown: onResizePointerDown, style: {
149
+ position: 'absolute',
150
+ top: -4,
151
+ left: 8,
152
+ right: 8,
153
+ height: 8,
154
+ cursor: 'n-resize',
155
+ } }),
156
+ react_1.default.createElement("div", { "data-iui-resizer": 'top-right', onPointerDown: onResizePointerDown, style: {
157
+ position: 'absolute',
158
+ top: -4,
159
+ right: -4,
160
+ width: 12,
161
+ height: 12,
162
+ cursor: 'ne-resize',
163
+ } }),
164
+ react_1.default.createElement("div", { "data-iui-resizer": 'right', onPointerDown: onResizePointerDown, style: {
165
+ position: 'absolute',
166
+ top: 8,
167
+ right: -4,
168
+ bottom: 8,
169
+ width: 8,
170
+ cursor: 'e-resize',
171
+ } }),
172
+ react_1.default.createElement("div", { "data-iui-resizer": 'bottom-right', onPointerDown: onResizePointerDown, style: {
173
+ position: 'absolute',
174
+ bottom: -4,
175
+ right: -4,
176
+ width: 12,
177
+ height: 12,
178
+ cursor: 'se-resize',
179
+ } }),
180
+ react_1.default.createElement("div", { "data-iui-resizer": 'bottom', onPointerDown: onResizePointerDown, style: {
181
+ position: 'absolute',
182
+ bottom: -4,
183
+ left: 8,
184
+ right: 8,
185
+ height: 8,
186
+ cursor: 's-resize',
187
+ } }),
188
+ react_1.default.createElement("div", { "data-iui-resizer": 'bottom-left', onPointerDown: onResizePointerDown, style: {
189
+ position: 'absolute',
190
+ bottom: -4,
191
+ left: -4,
192
+ width: 12,
193
+ height: 12,
194
+ cursor: 'sw-resize',
195
+ } }),
196
+ react_1.default.createElement("div", { "data-iui-resizer": 'left', onPointerDown: onResizePointerDown, style: {
197
+ position: 'absolute',
198
+ top: 8,
199
+ left: -4,
200
+ bottom: 8,
201
+ width: 8,
202
+ cursor: 'w-resize',
203
+ } })));
204
+ };
205
+ exports.Resizer = Resizer;
206
+ exports.default = exports.Resizer;
@@ -136,28 +136,6 @@ var useVirtualization = function (props) {
136
136
  // Used to mark when scroll container has height (updated by resize observer)
137
137
  // because before that calculations are not right
138
138
  var _e = react_1.default.useState(false), isMounted = _e[0], setIsMounted = _e[1];
139
- var onResize = react_1.default.useCallback(function (_a) {
140
- var height = _a.height;
141
- // Initial value returned by resize observer is 0
142
- // So wait for the next one
143
- if (height > 0) {
144
- setIsMounted(true);
145
- }
146
- setScrollContainerHeight(height);
147
- }, []);
148
- var _f = (0, useResizeObserver_1.useResizeObserver)(onResize), resizeRef = _f[0], resizeObserver = _f[1];
149
- // Find scrollable parent
150
- // Needed only on init
151
- react_1.default.useLayoutEffect(function () {
152
- var _a;
153
- var scrollableParent = getScrollableParent(parentRef.current, (_a = parentRef.current) === null || _a === void 0 ? void 0 : _a.ownerDocument);
154
- scrollContainer.current = scrollableParent;
155
- resizeRef(scrollableParent);
156
- }, [resizeRef]);
157
- // Stop watching resize, when virtual scroll is unmounted
158
- react_1.default.useLayoutEffect(function () {
159
- return function () { return resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.disconnect(); };
160
- }, [resizeObserver]);
161
139
  var getScrollableContainer = function () {
162
140
  var _a, _b;
163
141
  return (_a = scrollContainer.current) !== null && _a !== void 0 ? _a : (_b = parentRef.current) === null || _b === void 0 ? void 0 : _b.ownerDocument.scrollingElement;
@@ -170,8 +148,7 @@ var useVirtualization = function (props) {
170
148
  }
171
149
  return arr;
172
150
  }, [itemsLength, itemRenderer, bufferSize, startNode, visibleNodeCount]);
173
- // Get child height when children available
174
- react_1.default.useLayoutEffect(function () {
151
+ var updateChildHeight = react_1.default.useCallback(function () {
175
152
  var _a, _b, _c, _d, _e, _f;
176
153
  if (!parentRef.current || !visibleChildren.length) {
177
154
  return;
@@ -186,6 +163,31 @@ var useVirtualization = function (props) {
186
163
  last: Number((_f = (_e = getElementHeightWithMargins(lastChild)) === null || _e === void 0 ? void 0 : _e.toFixed(2)) !== null && _f !== void 0 ? _f : firstChildHeight),
187
164
  };
188
165
  }, [visibleChildren.length]);
166
+ var onResize = react_1.default.useCallback(function (_a) {
167
+ var height = _a.height;
168
+ // Initial value returned by resize observer is 0
169
+ // So wait for the next one
170
+ if (height > 0) {
171
+ setIsMounted(true);
172
+ }
173
+ setScrollContainerHeight(height);
174
+ updateChildHeight();
175
+ }, [updateChildHeight]);
176
+ var _f = (0, useResizeObserver_1.useResizeObserver)(onResize), resizeRef = _f[0], resizeObserver = _f[1];
177
+ // Find scrollable parent
178
+ // Needed only on init
179
+ react_1.default.useLayoutEffect(function () {
180
+ var _a;
181
+ var scrollableParent = getScrollableParent(parentRef.current, (_a = parentRef.current) === null || _a === void 0 ? void 0 : _a.ownerDocument);
182
+ scrollContainer.current = scrollableParent;
183
+ resizeRef(scrollableParent);
184
+ }, [resizeRef]);
185
+ // Stop watching resize, when virtual scroll is unmounted
186
+ react_1.default.useLayoutEffect(function () {
187
+ return function () { return resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.disconnect(); };
188
+ }, [resizeObserver]);
189
+ // Get child height when children available
190
+ react_1.default.useLayoutEffect(function () { return updateChildHeight(); }, [updateChildHeight]);
189
191
  var updateVirtualScroll = react_1.default.useCallback(function () {
190
192
  var scrollableContainer = getScrollableContainer();
191
193
  if (!scrollableContainer) {
@@ -1,4 +1,5 @@
1
1
  export * from './Popover';
2
+ export * from './Resizer';
2
3
  export * from './FocusTrap';
3
4
  export * from './InputContainer';
4
5
  export * from './icons';
@@ -19,6 +19,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
19
19
  * See LICENSE.md in the project root for license terms and full copyright notice.
20
20
  *--------------------------------------------------------------------------------------------*/
21
21
  __exportStar(require("./Popover"), exports);
22
+ __exportStar(require("./Resizer"), exports);
22
23
  __exportStar(require("./FocusTrap"), exports);
23
24
  __exportStar(require("./InputContainer"), exports);
24
25
  __exportStar(require("./icons"), exports);
@@ -2,3 +2,4 @@ export * from './dom';
2
2
  export * from './colors';
3
3
  export * from './numbers';
4
4
  export * from './focusable';
5
+ export * from './styles';
@@ -22,3 +22,4 @@ __exportStar(require("./dom"), exports);
22
22
  __exportStar(require("./colors"), exports);
23
23
  __exportStar(require("./numbers"), exports);
24
24
  __exportStar(require("./focusable"), exports);
25
+ __exportStar(require("./styles"), exports);
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Returns translate values as an array of a given element.
3
+ * @param element HTML element you want to get translate value of
4
+ * @returns Translate values in pixels in a array `[translateX, translateY]`
5
+ */
6
+ export declare const getTranslateValues: (element: HTMLElement | null | undefined) => number[];
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.getTranslateValues = void 0;
8
+ /**
9
+ * Returns translate values as an array of a given element.
10
+ * @param element HTML element you want to get translate value of
11
+ * @returns Translate values in pixels in a array `[translateX, translateY]`
12
+ */
13
+ var getTranslateValues = function (element) {
14
+ if (!element) {
15
+ return [];
16
+ }
17
+ var transformValue = getComputedStyle(element).getPropertyValue('transform');
18
+ var matrix = new DOMMatrix(transformValue);
19
+ return [matrix.m41, matrix.m42];
20
+ };
21
+ exports.getTranslateValues = getTranslateValues;
@@ -13,5 +13,5 @@
13
13
  * ... // do something with width
14
14
  * return <div ref={ref}>...</div>;
15
15
  */
16
- export declare const useContainerWidth: <T extends HTMLElement>(watchResizes?: boolean) => readonly [(instance: HTMLElement | null) => void, number];
16
+ export declare const useContainerWidth: <T extends HTMLElement>(watchResizes?: boolean) => readonly [(instance: HTMLElement | null | undefined) => void, number];
17
17
  export default useContainerWidth;
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ /**
3
+ * Helper hook that handles elements drag logic.
4
+ * @param elementRef Element ref that is draggable.
5
+ * @param containerRect Bounding rectangle of container element that element can't go outside. If not passed window is used as a container.
6
+ * @returns
7
+ * `onPointerDown` - handler that is called when pointer is down and handles all the dragging logic.
8
+ * `transform` - current transform of the element, it is used to preserve drag position when element visibility is being toggled.
9
+ */
10
+ export declare const useDragAndDrop: (elementRef: React.RefObject<HTMLElement>, containerRef?: React.RefObject<HTMLElement>, enabled?: boolean) => {
11
+ onPointerDown: (e: React.PointerEvent<HTMLElement>) => void;
12
+ transform: string;
13
+ };
14
+ export default useDragAndDrop;