@jetbrains/ring-ui-built 7.0.114 → 8.0.0-beta.2

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 (57) hide show
  1. package/components/_helpers/table.js +2 -2
  2. package/components/_helpers/table2.js +3 -0
  3. package/components/data-list/data-list.d.ts +4 -4
  4. package/components/data-list/data-list.js +2 -2
  5. package/components/data-list/data-list.mock.d.ts +1 -1
  6. package/components/data-list/item.d.ts +1 -1
  7. package/components/data-list/selection.d.ts +1 -1
  8. package/components/data-list/selection.js +1 -1
  9. package/components/date-picker/date-picker.js +25 -13
  10. package/components/date-picker/date-popup.js +1 -1
  11. package/components/date-picker/month.d.ts +0 -2
  12. package/components/date-picker/month.js +16 -17
  13. package/components/date-picker/months.js +42 -33
  14. package/components/date-picker/years.js +60 -52
  15. package/components/global/intersection-observer-context.d.ts +26 -0
  16. package/components/global/intersection-observer-context.js +140 -0
  17. package/components/{table → legacy-table}/cell.js +1 -1
  18. package/components/{table → legacy-table}/header-cell.js +3 -3
  19. package/components/{table → legacy-table}/header.js +1 -1
  20. package/components/{table → legacy-table}/row-with-focus-sensor.js +1 -1
  21. package/components/{table → legacy-table}/row.js +1 -1
  22. package/components/{table → legacy-table}/selection.d.ts +2 -2
  23. package/components/{table → legacy-table}/selection.js +1 -1
  24. package/components/{table → legacy-table}/simple-table.js +1 -1
  25. package/components/{table → legacy-table}/smart-table.js +1 -1
  26. package/components/legacy-table/table.d.ts +109 -0
  27. package/components/legacy-table/table.js +369 -0
  28. package/components/old-browsers-message/white-list.js +2 -2
  29. package/components/style.css +1 -1
  30. package/components/table/default-item-renderer.d.ts +25 -0
  31. package/components/table/default-item-renderer.js +241 -0
  32. package/components/table/table-base.d.ts +24 -0
  33. package/components/table/table-base.js +311 -0
  34. package/components/table/table-component.d.ts +53 -0
  35. package/components/table/table-component.js +316 -0
  36. package/components/table/table-const.d.ts +8 -0
  37. package/components/table/table-const.js +11 -0
  38. package/components/table/table-virtualize.d.ts +32 -0
  39. package/components/table/table-virtualize.js +330 -0
  40. package/components/table/table.d.ts +221 -104
  41. package/components/table/table.js +18 -362
  42. package/package.json +1 -1
  43. /package/components/{table → legacy-table}/cell.d.ts +0 -0
  44. /package/components/{table → legacy-table}/disable-hover-hoc.d.ts +0 -0
  45. /package/components/{table → legacy-table}/disable-hover-hoc.js +0 -0
  46. /package/components/{table → legacy-table}/header-cell.d.ts +0 -0
  47. /package/components/{table → legacy-table}/header.d.ts +0 -0
  48. /package/components/{table → legacy-table}/multitable.d.ts +0 -0
  49. /package/components/{table → legacy-table}/multitable.js +0 -0
  50. /package/components/{table → legacy-table}/row-with-focus-sensor.d.ts +0 -0
  51. /package/components/{table → legacy-table}/row.d.ts +0 -0
  52. /package/components/{table → legacy-table}/selection-adapter.d.ts +0 -0
  53. /package/components/{table → legacy-table}/selection-adapter.js +0 -0
  54. /package/components/{table → legacy-table}/selection-shortcuts-hoc.d.ts +0 -0
  55. /package/components/{table → legacy-table}/selection-shortcuts-hoc.js +0 -0
  56. /package/components/{table → legacy-table}/simple-table.d.ts +0 -0
  57. /package/components/{table → legacy-table}/smart-table.d.ts +0 -0
@@ -0,0 +1,140 @@
1
+ import { c } from 'react-compiler-runtime';
2
+ import { useState, useEffect, createContext, useContext } from 'react';
3
+
4
+ /**
5
+ * Usage:
6
+ *
7
+ * ```tsx
8
+ * <IntersectionObserverContext.Provider value={useIntersectionObserverHandle()}>
9
+ * <YourComponent />
10
+ * </IntersectionObserverContext.Provider>
11
+ *
12
+ * function YourComponent() {
13
+ * // Contains the current isIntersecting value
14
+ * const isIntersecting = useIsIntersecting(elementRef);
15
+ * // Or, to get updates instead:
16
+ * useIsIntersectingListener(elementRef, newIsIntersecting => {
17
+ * // ...
18
+ * })
19
+ * }
20
+ * ```
21
+ */
22
+ const IntersectionObserverContext = /*#__PURE__*/createContext(null);
23
+ function useIntersectionObserverHandle(rootRef, rootMargin, scrollMargin) {
24
+ const $ = c(6);
25
+ if ($[0] !== "499977ecd94e47a8c69d7083d0cd9908aa1ee1ef3ab3ce80135833f3d85e5429") {
26
+ for (let $i = 0; $i < 6; $i += 1) {
27
+ $[$i] = Symbol.for("react.memo_cache_sentinel");
28
+ }
29
+ $[0] = "499977ecd94e47a8c69d7083d0cd9908aa1ee1ef3ab3ce80135833f3d85e5429";
30
+ }
31
+ const [handle, setHandle] = useState(null);
32
+ let t0;
33
+ let t1;
34
+ if ($[1] !== rootMargin || $[2] !== rootRef || $[3] !== scrollMargin) {
35
+ t0 = () => {
36
+ const root = rootRef?.current;
37
+ const elementToOnChange = new Map();
38
+ const observer = new IntersectionObserver(entries => {
39
+ for (const entry of entries) {
40
+ const onChange = elementToOnChange.get(entry.target);
41
+ onChange?.(entry.isIntersecting);
42
+ }
43
+ }, {
44
+ root,
45
+ rootMargin: rootMargin != null ? `${rootMargin}px` : undefined,
46
+ scrollMargin: scrollMargin != null ? `${scrollMargin}px` : undefined
47
+ });
48
+ setHandle({
49
+ observe(element, onChange_0) {
50
+ elementToOnChange.set(element, onChange_0);
51
+ observer.observe(element);
52
+ return () => {
53
+ elementToOnChange.delete(element);
54
+ observer.unobserve(element);
55
+ };
56
+ }
57
+ });
58
+ return () => {
59
+ observer.disconnect();
60
+ setHandle(null);
61
+ };
62
+ };
63
+ t1 = [rootRef, rootMargin, scrollMargin];
64
+ $[1] = rootMargin;
65
+ $[2] = rootRef;
66
+ $[3] = scrollMargin;
67
+ $[4] = t0;
68
+ $[5] = t1;
69
+ } else {
70
+ t0 = $[4];
71
+ t1 = $[5];
72
+ }
73
+ useEffect(t0, t1);
74
+ return handle;
75
+ }
76
+ function useIsIntersecting(elementRef) {
77
+ const $ = c(5);
78
+ if ($[0] !== "499977ecd94e47a8c69d7083d0cd9908aa1ee1ef3ab3ce80135833f3d85e5429") {
79
+ for (let $i = 0; $i < 5; $i += 1) {
80
+ $[$i] = Symbol.for("react.memo_cache_sentinel");
81
+ }
82
+ $[0] = "499977ecd94e47a8c69d7083d0cd9908aa1ee1ef3ab3ce80135833f3d85e5429";
83
+ }
84
+ const handle = useContext(IntersectionObserverContext);
85
+ const [isIntersecting, setIsIntersecting] = useState(false);
86
+ let t0;
87
+ let t1;
88
+ if ($[1] !== elementRef || $[2] !== handle) {
89
+ t0 = () => {
90
+ const element = elementRef.current;
91
+ if (!element || !handle) {
92
+ return;
93
+ }
94
+ return handle.observe(element, setIsIntersecting);
95
+ };
96
+ t1 = [handle, elementRef, setIsIntersecting];
97
+ $[1] = elementRef;
98
+ $[2] = handle;
99
+ $[3] = t0;
100
+ $[4] = t1;
101
+ } else {
102
+ t0 = $[3];
103
+ t1 = $[4];
104
+ }
105
+ useEffect(t0, t1);
106
+ return isIntersecting;
107
+ }
108
+ function useIsIntersectingListener(elementRef, onChange) {
109
+ const $ = c(6);
110
+ if ($[0] !== "499977ecd94e47a8c69d7083d0cd9908aa1ee1ef3ab3ce80135833f3d85e5429") {
111
+ for (let $i = 0; $i < 6; $i += 1) {
112
+ $[$i] = Symbol.for("react.memo_cache_sentinel");
113
+ }
114
+ $[0] = "499977ecd94e47a8c69d7083d0cd9908aa1ee1ef3ab3ce80135833f3d85e5429";
115
+ }
116
+ const handle = useContext(IntersectionObserverContext);
117
+ let t0;
118
+ let t1;
119
+ if ($[1] !== elementRef || $[2] !== handle || $[3] !== onChange) {
120
+ t0 = () => {
121
+ const element = elementRef.current;
122
+ if (!element || !handle) {
123
+ return;
124
+ }
125
+ return handle.observe(element, onChange);
126
+ };
127
+ t1 = [handle, elementRef, onChange];
128
+ $[1] = elementRef;
129
+ $[2] = handle;
130
+ $[3] = onChange;
131
+ $[4] = t0;
132
+ $[5] = t1;
133
+ } else {
134
+ t0 = $[4];
135
+ t1 = $[5];
136
+ }
137
+ useEffect(t0, t1);
138
+ }
139
+
140
+ export { IntersectionObserverContext, useIntersectionObserverHandle, useIsIntersecting, useIsIntersectingListener };
@@ -1,7 +1,7 @@
1
1
  import { PureComponent } from 'react';
2
2
  import classNames from 'classnames';
3
3
  import joinDataTestAttributes from '../global/data-tests.js';
4
- import { s as style } from '../_helpers/table.js';
4
+ import { s as style } from '../_helpers/table2.js';
5
5
  import { jsx } from 'react/jsx-runtime';
6
6
 
7
7
  class Cell extends PureComponent {
@@ -1,10 +1,10 @@
1
1
  import { PureComponent } from 'react';
2
2
  import classNames from 'classnames';
3
- import sortableIcon from '@jetbrains/icons/unsorted-12px';
3
+ import unsortedIcon from '@jetbrains/icons/unsorted-12px';
4
4
  import chevron12pxDown from '@jetbrains/icons/chevron-12px-down';
5
5
  import Icon from '../icon/icon.js';
6
6
  import joinDataTestAttributes from '../global/data-tests.js';
7
- import { s as style } from '../_helpers/table.js';
7
+ import { s as style } from '../_helpers/table2.js';
8
8
  import { jsxs, jsx } from 'react/jsx-runtime';
9
9
  import 'util-deprecate';
10
10
  import '../icon/icon.constants.js';
@@ -46,7 +46,7 @@ class HeaderCell extends PureComponent {
46
46
  } = this.props;
47
47
  this.sortable = column.sortable === true;
48
48
  this.sorted = sortKey === column.id;
49
- const glyph = this.sorted ? chevron12pxDown : sortableIcon;
49
+ const glyph = this.sorted ? chevron12pxDown : unsortedIcon;
50
50
  const classes = classNames(className, column.headerClassName, {
51
51
  [style.headerCell]: true,
52
52
  [style.headerCellSortable]: this.sortable,
@@ -3,7 +3,7 @@ import classNames from 'classnames';
3
3
  import Checkbox from '../checkbox/checkbox.js';
4
4
  import getUID from '../global/get-uid.js';
5
5
  import HeaderCell from './header-cell.js';
6
- import { s as style } from '../_helpers/table.js';
6
+ import { s as style } from '../_helpers/table2.js';
7
7
  import { jsx, jsxs } from 'react/jsx-runtime';
8
8
  import '@jetbrains/icons/checkmark-12px';
9
9
  import '@jetbrains/icons/remove-12px';
@@ -44,7 +44,7 @@ import '../popup/popup.target.js';
44
44
  import '../popup/position-css.js';
45
45
  import '../_helpers/theme.js';
46
46
  import './cell.js';
47
- import '../_helpers/table.js';
47
+ import '../_helpers/table2.js';
48
48
 
49
49
  const getContainer = () => focusSensorHOC(Row);
50
50
  class RowWithFocusSensorCallbacks extends PureComponent {
@@ -11,7 +11,7 @@ import joinDataTestAttributes from '../global/data-tests.js';
11
11
  import getUID from '../global/get-uid.js';
12
12
  import { createComposedRef } from '../global/compose-refs.js';
13
13
  import Cell from './cell.js';
14
- import { s as style } from '../_helpers/table.js';
14
+ import { s as style } from '../_helpers/table2.js';
15
15
  import { jsxs, jsx } from 'react/jsx-runtime';
16
16
  import '@jetbrains/icons/checkmark-12px';
17
17
  import '@jetbrains/icons/remove-12px';
@@ -4,7 +4,7 @@
4
4
  export interface SelectionItem {
5
5
  id: string | number;
6
6
  }
7
- export interface TableSelectionConfig<T extends object> {
7
+ export interface TableSelectionConfig<T> {
8
8
  data?: readonly T[] | undefined;
9
9
  selected?: Set<T> | undefined;
10
10
  focused?: T | null | undefined;
@@ -17,7 +17,7 @@ export interface CloneWithConfig<T> {
17
17
  selected?: Set<T> | readonly T[] | null | undefined;
18
18
  focused?: T | null | undefined;
19
19
  }
20
- export default class Selection<T extends object> {
20
+ export default class Selection<T> {
21
21
  protected _rawData: readonly T[];
22
22
  protected _getChildren: (item: T) => readonly T[];
23
23
  protected _data: Set<T>;
@@ -15,7 +15,7 @@ let Selection$1 = class Selection {
15
15
  focused = null,
16
16
  getKey = item => {
17
17
  // Default behavior stays backward compatible: use item's "id" if present
18
- if ('id' in item) {
18
+ if (item && typeof item === 'object' && 'id' in item) {
19
19
  return item.id;
20
20
  }
21
21
  // If there's no id provided on item and no getKey supplied, fail fast with a clear message
@@ -2,7 +2,7 @@ import { PureComponent } from 'react';
2
2
  import classNames from 'classnames';
3
3
  import TableContainer from './table.js';
4
4
  import Selection$1 from './selection.js';
5
- import { s as style } from '../_helpers/table.js';
5
+ import { s as style } from '../_helpers/table2.js';
6
6
  import { jsx } from 'react/jsx-runtime';
7
7
  import 'react-movable';
8
8
  import '../global/focus-sensor-hoc.js';
@@ -32,7 +32,7 @@ import '../global/data-tests.js';
32
32
  import './header-cell.js';
33
33
  import '@jetbrains/icons/unsorted-12px';
34
34
  import '@jetbrains/icons/chevron-12px-down';
35
- import '../_helpers/table.js';
35
+ import '../_helpers/table2.js';
36
36
  import './selection-shortcuts-hoc.js';
37
37
  import './disable-hover-hoc.js';
38
38
  import './row-with-focus-sensor.js';
@@ -0,0 +1,109 @@
1
+ /**
2
+ * @name Table
3
+ */
4
+ import { Component, PureComponent, type ReactNode, type SyntheticEvent } from 'react';
5
+ import * as React from 'react';
6
+ import { type OnChangeMeta } from 'react-movable/lib/types';
7
+ import { type FocusSensorAddProps, type FocusSensorProps } from '../global/focus-sensor-hoc';
8
+ import { type SelectionShortcutsAddProps, type SelectionShortcutsProps } from './selection-shortcuts-hoc';
9
+ import { type DisableHoverAddProps, type DisableHoverProps } from './disable-hover-hoc';
10
+ import Row from './row-with-focus-sensor';
11
+ import { type Column, type SortParams } from './header-cell';
12
+ export interface ReorderParams<T> {
13
+ data: T[];
14
+ oldIndex: number;
15
+ newIndex: number;
16
+ }
17
+ export interface TableProps<T extends object> extends FocusSensorAddProps<HTMLTableRowElement>, SelectionShortcutsAddProps<T>, DisableHoverAddProps {
18
+ data: readonly T[];
19
+ columns: readonly Column<T>[] | ((item: T | null) => readonly Column<T>[]);
20
+ isItemSelectable: (item: T) => boolean;
21
+ loading: boolean;
22
+ onSort: (params: SortParams) => void;
23
+ onReorder: (params: ReorderParams<T>) => void;
24
+ getItemKey: (item: T) => string | number;
25
+ sortKey: string;
26
+ sortOrder: boolean;
27
+ draggable: boolean;
28
+ alwaysShowDragHandle: boolean;
29
+ dragHandleTitle?: string;
30
+ stickyHeader: boolean;
31
+ wideFirstColumn: boolean;
32
+ getItemLevel: (item: T) => number;
33
+ getItemClassName: (item: T) => string | null | undefined;
34
+ getMetaColumnClassName: (item: T) => string | null | undefined;
35
+ getItemDataTest: (item: T) => string | null | undefined;
36
+ isItemCollapsible: (item: T) => boolean;
37
+ isParentCollapsible: (item: T) => boolean;
38
+ isItemCollapsed: (item: T) => boolean;
39
+ onItemCollapse: (item: T) => void;
40
+ onItemExpand: (item: T) => void;
41
+ onItemDoubleClick: (item: T) => void;
42
+ onItemClick: (item: T, e: React.MouseEvent<HTMLTableRowElement>) => void;
43
+ remoteSelection: boolean;
44
+ isDisabledSelectionVisible: (item: T) => boolean;
45
+ getCheckboxTooltip: (item: T) => string | undefined;
46
+ className?: string | null | undefined;
47
+ wrapperClassName?: string | null | undefined;
48
+ headerClassName?: string | null | undefined;
49
+ cellClassName?: string | null | undefined;
50
+ loaderClassName?: string | undefined;
51
+ caption?: string | null | undefined;
52
+ stickyHeaderOffset?: string | undefined;
53
+ renderEmpty?: (() => ReactNode) | null | undefined;
54
+ RowComponent: typeof Row;
55
+ renderLoader?: ((loaderClassName?: string) => ReactNode) | null | undefined;
56
+ }
57
+ /**
58
+ * Interactive table with selection and keyboard navigation support.
59
+ */
60
+ export declare class Table<T extends object> extends PureComponent<TableProps<T>> {
61
+ static defaultProps: {
62
+ isItemSelectable: () => boolean;
63
+ loading: boolean;
64
+ onSort: () => void;
65
+ onReorder: () => void;
66
+ getItemKey: (item: object) => string | number;
67
+ sortKey: string;
68
+ sortOrder: boolean;
69
+ draggable: boolean;
70
+ alwaysShowDragHandle: boolean;
71
+ stickyHeader: boolean;
72
+ getItemLevel: () => number;
73
+ getItemClassName: () => null;
74
+ getMetaColumnClassName: () => null;
75
+ getItemDataTest: () => null;
76
+ isItemCollapsible: () => boolean;
77
+ isParentCollapsible: () => boolean;
78
+ isItemCollapsed: () => boolean;
79
+ onItemCollapse: () => void;
80
+ onItemExpand: () => void;
81
+ onItemDoubleClick: () => void;
82
+ onItemClick: () => void;
83
+ remoteSelection: boolean;
84
+ isDisabledSelectionVisible: () => boolean;
85
+ getCheckboxTooltip: () => undefined;
86
+ RowComponent: typeof Row;
87
+ wideFirstColumn: boolean;
88
+ };
89
+ state: {
90
+ shortcutsScope: string;
91
+ userSelectNone: boolean;
92
+ };
93
+ componentDidMount(): void;
94
+ componentDidUpdate({ data, selection, onSelect, selectable, remoteSelection }: TableProps<T>): void;
95
+ componentWillUnmount(): void;
96
+ onMouseDown: (e: React.MouseEvent) => void;
97
+ onMouseUp: () => void;
98
+ onRowFocus: (row: T) => void;
99
+ onRowSelect: (row: T, selected: boolean) => void;
100
+ onSortEnd: ({ oldIndex, newIndex }: OnChangeMeta) => void;
101
+ onCheckboxChange: (e: SyntheticEvent<HTMLInputElement>) => void;
102
+ restoreFocusWithoutScroll: () => void;
103
+ render(): React.JSX.Element;
104
+ }
105
+ export type TableAttrs<T extends object> = DisableHoverProps<SelectionShortcutsProps<T, FocusSensorProps<TableProps<T>, HTMLTableRowElement, typeof Table>>>;
106
+ export default class TableContainer<T extends object> extends Component<TableAttrs<T>> {
107
+ Table: React.ComponentClass<DisableHoverProps<SelectionShortcutsProps<T, FocusSensorProps<TableProps<T>, HTMLTableRowElement, typeof Table>>>, any>;
108
+ render(): React.JSX.Element;
109
+ }