@codacy/ui-components 0.46.2 → 0.47.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.
@@ -107,14 +107,16 @@ var ModalBody = function ModalBody(_ref3) {
107
107
  props = _objectWithoutProperties(_ref3, ["children"]);
108
108
 
109
109
  var _useScrollContainer = useScrollContainer(),
110
- moreTop = _useScrollContainer.moreTop,
111
- moreBottom = _useScrollContainer.moreBottom,
112
- divProps = _objectWithoutProperties(_useScrollContainer, ["moreTop", "moreBottom"]);
110
+ atTop = _useScrollContainer.atTop,
111
+ atBottom = _useScrollContainer.atBottom,
112
+ scroll = _useScrollContainer.scroll,
113
+ height = _useScrollContainer.height,
114
+ divProps = _objectWithoutProperties(_useScrollContainer, ["atTop", "atBottom", "scroll", "height"]);
113
115
 
114
116
  return /*#__PURE__*/React.createElement(ModalBodyBox, Object.assign({
115
117
  px: defaultModalPadding,
116
- moreTop: moreTop,
117
- moreBottom: moreBottom
118
+ moreTop: !atTop,
119
+ moreBottom: !atBottom
118
120
  }, props, divProps), children);
119
121
  };
120
122
 
@@ -1,6 +1,8 @@
1
1
  import React from 'react';
2
2
  import { ScrollableContentProps } from './ScrollableContent.types';
3
+ import { ScrollState } from './useScrollContainer';
4
+ export declare const ScrollableContentContext: React.Context<ScrollState>;
3
5
  /**
4
- * Description for ScrollableContent
6
+ * ScrollableContent
5
7
  */
6
8
  export declare const ScrollableContent: React.ForwardRefExoticComponent<ScrollableContentProps & React.RefAttributes<HTMLDivElement>>;
@@ -2,8 +2,14 @@ import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutPr
2
2
  import React from 'react';
3
3
  import { ScrollableContentWrapper } from './ScrollableContent.styles';
4
4
  import { useScrollContainer } from './useScrollContainer';
5
+ export var ScrollableContentContext = React.createContext({
6
+ atTop: true,
7
+ atBottom: true,
8
+ scroll: 0,
9
+ height: 0
10
+ });
5
11
  /**
6
- * Description for ScrollableContent
12
+ * ScrollableContent
7
13
  */
8
14
 
9
15
  export var ScrollableContent = React.forwardRef(function (_ref, ref) {
@@ -11,13 +17,22 @@ export var ScrollableContent = React.forwardRef(function (_ref, ref) {
11
17
  props = _objectWithoutProperties(_ref, ["children"]);
12
18
 
13
19
  var _useScrollContainer = useScrollContainer(),
14
- moreTop = _useScrollContainer.moreTop,
15
- moreBottom = _useScrollContainer.moreBottom,
16
- divProps = _objectWithoutProperties(_useScrollContainer, ["moreTop", "moreBottom"]);
20
+ atTop = _useScrollContainer.atTop,
21
+ atBottom = _useScrollContainer.atBottom,
22
+ scroll = _useScrollContainer.scroll,
23
+ height = _useScrollContainer.height,
24
+ divProps = _objectWithoutProperties(_useScrollContainer, ["atTop", "atBottom", "scroll", "height"]);
17
25
 
18
- return /*#__PURE__*/React.createElement(ScrollableContentWrapper, Object.assign({}, props, {
19
- moreTop: moreTop,
20
- moreBottom: moreBottom,
26
+ return /*#__PURE__*/React.createElement(ScrollableContentContext.Provider, {
27
+ value: {
28
+ atTop: atTop,
29
+ atBottom: atBottom,
30
+ scroll: scroll,
31
+ height: height
32
+ }
33
+ }, /*#__PURE__*/React.createElement(ScrollableContentWrapper, Object.assign({}, props, {
34
+ moreTop: !atTop,
35
+ moreBottom: !atBottom,
21
36
  ref: ref
22
- }), /*#__PURE__*/React.createElement("div", divProps, children));
37
+ }), /*#__PURE__*/React.createElement("div", divProps, children)));
23
38
  });
@@ -1,7 +1,7 @@
1
1
  import { ContainerComponentProps } from '../types';
2
- import { SpaceProps, LayoutProps } from '../system-props/types';
3
2
  import { Color } from '../theme';
4
- export interface ScrollableContentProps extends ContainerComponentProps, SpaceProps, LayoutProps {
3
+ import { FlexProps } from '../Flexbox';
4
+ export interface ScrollableContentProps extends ContainerComponentProps, FlexProps {
5
5
  background?: Color;
6
6
  fadeHeight?: string;
7
7
  }
@@ -1,7 +1,15 @@
1
1
  import React from 'react';
2
+ export interface ScrollState {
3
+ atTop: boolean;
4
+ atBottom: boolean;
5
+ scroll: number;
6
+ height: number;
7
+ }
2
8
  export declare const useScrollContainer: () => {
9
+ atTop: boolean;
10
+ atBottom: boolean;
11
+ scroll: number;
12
+ height: number;
3
13
  onScroll: (event: React.UIEvent<HTMLDivElement, UIEvent>) => void;
4
14
  ref: React.RefObject<HTMLDivElement>;
5
- moreTop: boolean;
6
- moreBottom: boolean;
7
15
  };
@@ -1,30 +1,38 @@
1
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
1
2
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
- import { useState, useCallback, useEffect, useRef } from 'react';
3
+ import { useState, useCallback, useEffect, useRef, useMemo } from 'react';
3
4
  import { throttle } from 'lodash';
4
5
  export var useScrollContainer = function useScrollContainer() {
5
6
  var ref = useRef(null);
6
7
 
7
- var _useState = useState(false),
8
+ var _useState = useState({
9
+ atTop: true,
10
+ atBottom: true,
11
+ scroll: 0,
12
+ height: 0
13
+ }),
8
14
  _useState2 = _slicedToArray(_useState, 2),
9
- moreTop = _useState2[0],
10
- setMoreTop = _useState2[1];
15
+ state = _useState2[0],
16
+ setState = _useState2[1];
11
17
 
12
- var _useState3 = useState(false),
13
- _useState4 = _slicedToArray(_useState3, 2),
14
- moreBottom = _useState4[0],
15
- setMoreBottom = _useState4[1];
16
-
17
- var throttledHandler = throttle(function (scrollHeight, scrollTop, containerHeight) {
18
- if (scrollHeight > containerHeight) {
19
- if (!moreTop && scrollTop > 0) setMoreTop(true);
20
- if (moreTop && scrollTop <= 0) setMoreTop(false);
21
- if (!moreBottom && scrollTop < scrollHeight - containerHeight) setMoreBottom(true);
22
- if (moreBottom && scrollTop >= scrollHeight - containerHeight) setMoreBottom(false);
23
- } else {
24
- if (moreTop) setMoreTop(false);
25
- if (moreBottom) setMoreBottom(false);
26
- }
27
- }, 100);
18
+ var throttledHandler = useMemo(function () {
19
+ return throttle(function (scrollHeight, scrollTop, containerHeight) {
20
+ setState({
21
+ atTop: scrollHeight <= containerHeight || scrollTop <= 10,
22
+ atBottom: scrollHeight <= containerHeight || scrollTop >= scrollHeight - containerHeight - 10,
23
+ scroll: scrollTop,
24
+ height: containerHeight
25
+ });
26
+ }, 250);
27
+ }, []);
28
+ var resizeObserver = useMemo(function () {
29
+ return new ResizeObserver(function (entries) {
30
+ if (entries.length > 0) {
31
+ var div = entries[0].target;
32
+ throttledHandler(div.scrollHeight, div.scrollTop, div.offsetHeight);
33
+ }
34
+ });
35
+ }, [throttledHandler]);
28
36
  var onScroll = useCallback(function (event) {
29
37
  var e = event.currentTarget;
30
38
  throttledHandler(e.scrollHeight, e.scrollTop, e.offsetHeight);
@@ -35,10 +43,15 @@ export var useScrollContainer = function useScrollContainer() {
35
43
  throttledHandler(div.scrollHeight, div.scrollTop, div.offsetHeight);
36
44
  }
37
45
  }, [throttledHandler]);
38
- return {
46
+ useEffect(function () {
47
+ var containerDiv = ref.current;
48
+ if (containerDiv) resizeObserver.observe(containerDiv);
49
+ return function () {
50
+ if (containerDiv) resizeObserver.unobserve(containerDiv);
51
+ };
52
+ }, [resizeObserver]);
53
+ return _objectSpread({
39
54
  onScroll: onScroll,
40
- ref: ref,
41
- moreTop: moreTop,
42
- moreBottom: moreBottom
43
- };
55
+ ref: ref
56
+ }, state);
44
57
  };
@@ -1,11 +1,20 @@
1
1
  import React from 'react';
2
2
  import { TableProps, TableHeaderProps, TableHeaderCellProps, TableRowsProps, TableRowProps, TableCellProps } from './Table.types';
3
+ export interface TableContextType {
4
+ columnsCount: number;
5
+ setColumnsCount: (n: number) => void;
6
+ }
7
+ export declare const TableContext: React.Context<TableContextType>;
3
8
  export declare const ColumnsGroup: React.FC<TableHeaderProps>;
4
9
  export declare const Table: React.FC<TableProps> & {
5
10
  Header: React.FC<TableHeaderProps>;
6
11
  HeaderCell: React.FC<TableHeaderCellProps>;
7
12
  Rows: React.FC<TableRowsProps>;
8
13
  Row: React.FC<TableRowProps>;
14
+ VirtualRow: React.FC<TableRowProps & {
15
+ index: number;
16
+ height: number;
17
+ }>;
9
18
  Cell: React.FC<TableCellProps>;
10
19
  SelectableHeader: React.FC<import("./NewSelectableTable").SelectableHeaderProps>;
11
20
  SelectableRow: React.FC<import("./NewSelectableTable").SelectableRowProps>;
@@ -1,10 +1,17 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
1
2
  import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
2
- import React from 'react';
3
+ import React, { useContext, useState, useCallback } from 'react';
3
4
  import { TableWrapper, StyledTableHeader, StyledTableHeaderCell, StyledTableBodyCell, StyledTableBody, StyledTableRow, StyledTable } from './Table.styles';
4
5
  import { IconAndText } from '../IconAndText';
5
6
  import { SortDown, SortUp } from '../Icons';
6
7
  import { SelectableHeader, SelectableRow } from './NewSelectableTable';
7
- import { useCallback } from 'react';
8
+ import { ScrollableContentContext } from '../ScrollableContent';
9
+ export var TableContext = React.createContext({
10
+ columnsCount: 0,
11
+ setColumnsCount: function setColumnsCount() {
12
+ return null;
13
+ }
14
+ });
8
15
  /**
9
16
  * Styled table component
10
17
  */
@@ -13,11 +20,23 @@ var TableComponent = function TableComponent(_ref) {
13
20
  var children = _ref.children,
14
21
  props = _objectWithoutProperties(_ref, ["children"]);
15
22
 
16
- return /*#__PURE__*/React.createElement(TableWrapper, props, /*#__PURE__*/React.createElement(StyledTable, null, children));
23
+ var _useState = useState(0),
24
+ _useState2 = _slicedToArray(_useState, 2),
25
+ columnsCount = _useState2[0],
26
+ setColumnsCount = _useState2[1];
27
+
28
+ return /*#__PURE__*/React.createElement(TableContext.Provider, {
29
+ value: {
30
+ columnsCount: columnsCount,
31
+ setColumnsCount: setColumnsCount
32
+ }
33
+ }, /*#__PURE__*/React.createElement(TableWrapper, props, /*#__PURE__*/React.createElement(StyledTable, null, children)));
17
34
  };
18
35
 
19
36
  export var ColumnsGroup = function ColumnsGroup(_ref2) {
20
37
  var children = _ref2.children;
38
+ var tableCtx = useContext(TableContext);
39
+ if (tableCtx) tableCtx.setColumnsCount(React.Children.count(children));
21
40
  return /*#__PURE__*/React.createElement("colgroup", null, React.Children.map(children, function (child) {
22
41
  if (React.isValidElement(child)) {
23
42
  if (child.props.width) {
@@ -85,31 +104,51 @@ var HeaderCell = function HeaderCell(_ref4) {
85
104
  }, props), content);
86
105
  };
87
106
 
88
- var Rows = function Rows(_ref5) {
107
+ var Cell = function Cell(_ref5) {
89
108
  var children = _ref5.children,
90
- props = _objectWithoutProperties(_ref5, ["children"]);
109
+ _ref5$align = _ref5.align,
110
+ align = _ref5$align === void 0 ? 'left' : _ref5$align,
111
+ span = _ref5.span,
112
+ props = _objectWithoutProperties(_ref5, ["children", "align", "span"]);
91
113
 
92
- return /*#__PURE__*/React.createElement(StyledTableBody, props, children);
114
+ var tableCtx = useContext(TableContext);
115
+ return /*#__PURE__*/React.createElement(StyledTableBodyCell, Object.assign({
116
+ colSpan: span === 'auto' ? tableCtx === null || tableCtx === void 0 ? void 0 : tableCtx.columnsCount : span,
117
+ align: align
118
+ }, props), children);
93
119
  };
94
120
 
95
- var Row = function Row(_ref6) {
121
+ var Rows = function Rows(_ref6) {
96
122
  var children = _ref6.children,
97
123
  props = _objectWithoutProperties(_ref6, ["children"]);
98
124
 
99
- return /*#__PURE__*/React.createElement(StyledTableRow, props, children);
125
+ return /*#__PURE__*/React.createElement(StyledTableBody, props, children);
100
126
  };
101
127
 
102
- var Cell = function Cell(_ref7) {
128
+ var Row = function Row(_ref7) {
103
129
  var children = _ref7.children,
104
- _ref7$align = _ref7.align,
105
- align = _ref7$align === void 0 ? 'left' : _ref7$align,
106
- span = _ref7.span,
107
- props = _objectWithoutProperties(_ref7, ["children", "align", "span"]);
130
+ props = _objectWithoutProperties(_ref7, ["children"]);
108
131
 
109
- return /*#__PURE__*/React.createElement(StyledTableBodyCell, Object.assign({
110
- colSpan: span,
111
- align: align
112
- }, props), children);
132
+ return /*#__PURE__*/React.createElement(StyledTableRow, props, children);
133
+ };
134
+
135
+ var VirtualRow = function VirtualRow(_ref8) {
136
+ var children = _ref8.children,
137
+ index = _ref8.index,
138
+ height = _ref8.height,
139
+ props = _objectWithoutProperties(_ref8, ["children", "index", "height"]);
140
+
141
+ var scrollCtx = useContext(ScrollableContentContext);
142
+ var top = (index + 1) *
143
+ /* +1 to acknowledge the header row */
144
+ height;
145
+ var threshold = height / 2;
146
+ var inViewport = top >= scrollCtx.scroll - threshold && top <= scrollCtx.scroll + scrollCtx.height + threshold;
147
+ return /*#__PURE__*/React.createElement(StyledTableRow, Object.assign({}, props, {
148
+ height: height
149
+ }), inViewport ? children : /*#__PURE__*/React.createElement(Cell, {
150
+ span: "auto"
151
+ }));
113
152
  };
114
153
 
115
154
  export var Table = Object.assign(TableComponent, {
@@ -117,6 +156,7 @@ export var Table = Object.assign(TableComponent, {
117
156
  HeaderCell: HeaderCell,
118
157
  Rows: Rows,
119
158
  Row: Row,
159
+ VirtualRow: VirtualRow,
120
160
  Cell: Cell,
121
161
  SelectableHeader: SelectableHeader,
122
162
  SelectableRow: SelectableRow
@@ -30,8 +30,9 @@ export interface TableRowsProps extends ContainerComponentProps {
30
30
  }
31
31
  export interface TableRowProps extends ContainerComponentProps, DetailedHTMLProps<HTMLAttributes<HTMLTableRowElement>, HTMLTableRowElement> {
32
32
  background?: Color;
33
+ height?: number;
33
34
  }
34
35
  export interface TableCellProps extends BaseCellProps {
35
- span?: number;
36
+ span?: number | 'auto';
36
37
  }
37
38
  export {};
@@ -1,2 +1,3 @@
1
1
  export * from './useStatefulRef';
2
2
  export * from './useForwardedRef';
3
+ export * from './useInfiniteScroll';
@@ -1,2 +1,3 @@
1
1
  export * from './useStatefulRef';
2
- export * from './useForwardedRef';
2
+ export * from './useForwardedRef';
3
+ export * from './useInfiniteScroll';
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare function useInfiniteScroll<T extends Element>(ref: React.RefObject<T>, onLoadMore?: () => void, containerRef?: Element | null): void;
@@ -0,0 +1,21 @@
1
+ import { useCallback, useEffect, useRef } from 'react';
2
+ export function useInfiniteScroll(ref, onLoadMore, containerRef) {
3
+ var observer = useRef();
4
+ var handleLoadMore = useCallback(function (entries, _) {
5
+ if (entries[0].isIntersecting && onLoadMore) {
6
+ onLoadMore();
7
+ }
8
+ }, [onLoadMore]);
9
+ useEffect(function () {
10
+ if (ref.current) {
11
+ observer.current = new IntersectionObserver(handleLoadMore, {
12
+ root: containerRef
13
+ });
14
+ observer.current.observe(ref.current);
15
+ }
16
+
17
+ return function () {
18
+ if (observer.current) observer.current.disconnect();
19
+ };
20
+ }, [ref, handleLoadMore, containerRef]);
21
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codacy/ui-components",
3
- "version": "0.46.2",
3
+ "version": "0.47.0",
4
4
  "description": "",
5
5
  "license": "ISC",
6
6
  "author": "",
@@ -33,6 +33,7 @@
33
33
  "@pathofdev/react-tag-input": "github:inesgomas/react-tag-input#9820d2ae045d9398fbd3ba9021f675b127003237",
34
34
  "@popperjs/core": "^2.5.4",
35
35
  "@styled-system/should-forward-prop": "^5.1.5",
36
+ "@types/resize-observer-browser": "^0.1.6",
36
37
  "autosize": "^4.0.2",
37
38
  "emotion-theming": "10.x",
38
39
  "lodash": "^4.17.20",