onekijs-ui 1.0.2 → 1.0.3

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "onekijs-ui",
3
3
  "private": false,
4
- "version": "1.0.2",
4
+ "version": "1.0.3",
5
5
  "description": "Advanced React Web Components",
6
6
  "source": "src/index.ts",
7
7
  "main": "dist/index.js",
@@ -35,7 +35,7 @@
35
35
  "@floating-ui/react": "^0.27.20",
36
36
  "@popperjs/core": "^2.11.8",
37
37
  "@reach/observe-rect": "^1.2.0",
38
- "onekijs-framework": "^1.0.1",
38
+ "onekijs-framework": "^1.0.3",
39
39
  "react-virtualized-auto-sizer": "^2.0.3",
40
40
  "react-window": "^2.2.7",
41
41
  "react-window-infinite-loader": "^2.0.1",
@@ -50,5 +50,5 @@
50
50
  "react-dom": "^19.2.7"
51
51
  },
52
52
  "sideEffects": false,
53
- "gitHead": "41c607ce7e141ab8df632682b71560486eb5e95c"
53
+ "gitHead": "58f5cbd9afb558e3a4a92941332d71672047c4ea"
54
54
  }
@@ -23,6 +23,7 @@ const findItemIndex = (items?: (Item<unknown> | undefined)[], uid?: string): num
23
23
  });
24
24
  };
25
25
 
26
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-constraint
26
27
  const ListBodyComponent = <T extends any = any, I extends ListItem<T> = ListItem<T>>({
27
28
  autoRefresh,
28
29
  bodyRef,
@@ -4,6 +4,7 @@ import { ListItem, VirtualItemWrapperProps, VirtualListProps } from '../typings'
4
4
  import ListItemComponent, { ListItemContent } from './ListItemComponent';
5
5
  import LoadingItem from './LoadingItem';
6
6
 
7
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-constraint
7
8
  const VirtualItemWrapper = <T extends any = any, I extends ListItem<T> = ListItem<T>>({
8
9
  virtualItem,
9
10
  listItem,
@@ -83,6 +84,7 @@ const VirtualItemWrapper = <T extends any = any, I extends ListItem<T> = ListIte
83
84
  );
84
85
  };
85
86
 
87
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-constraint
86
88
  const VirtualListComponent = <T extends any = any, I extends ListItem<T> = ListItem<T>>({
87
89
  items,
88
90
  ItemComponent = ListItemComponent,
@@ -50,7 +50,6 @@ const useListView: <T = any, I extends Item<T> = Item<T>>(
50
50
  }
51
51
  return itemHeight;
52
52
  },
53
- // eslint-disable-next-line react-hooks/exhaustive-deps
54
53
  [itemHeight],
55
54
  );
56
55
 
@@ -61,7 +60,6 @@ const useListView: <T = any, I extends Item<T> = Item<T>>(
61
60
  const fn = keyExtractor || defaultKeyExtractor;
62
61
  return fn(index);
63
62
  },
64
- // eslint-disable-next-line react-hooks/exhaustive-deps
65
63
  [keyExtractor, force],
66
64
  );
67
65
 
@@ -24,7 +24,7 @@ const DefaultDeleteRowComponent: React.FC<TableBodyCellProps> = ({ rowIndex }) =
24
24
 
25
25
  const metadata = useFormMetadata(tableName);
26
26
  let disabled = false;
27
- if (metadata.readOnly || (metadata.editable === false && form.config.reconfigure)) {
27
+ if (metadata.disabled || metadata.readOnly || (metadata.editable === false && form.config.reconfigure)) {
28
28
  disabled = true;
29
29
  }
30
30
 
@@ -1,5 +1,5 @@
1
- import { AnonymousObject, useLogger } from 'onekijs-framework';
2
- import React, { useRef } from 'react';
1
+ import { AnonymousObject, useLogger, useThrottle } from 'onekijs-framework';
2
+ import React, { useCallback, useEffect, useMemo, useRef } from 'react';
3
3
  import { CSSTransition } from 'react-transition-group';
4
4
  import LoadingItem from '../../list/components/LoadingItem';
5
5
  import { ListItemProps, VirtualItem } from '../../list/typings';
@@ -27,7 +27,8 @@ type VirtualTreeListItemProps<T = any, I extends TreeItem<T> = TreeItem<T>> = {
27
27
  defer?: () => void;
28
28
  };
29
29
 
30
- const VirtualTreeListItemComponent = <T = any, I extends TreeItem<T> = TreeItem<T>>({
30
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-constraint
31
+ const VirtualTreeListItemComponent = <T extends any = any, I extends TreeItem<T> = TreeItem<T>>({
31
32
  itemClassName,
32
33
  ItemComponent,
33
34
  virtualItem,
@@ -40,6 +41,8 @@ const VirtualTreeListItemComponent = <T = any, I extends TreeItem<T> = TreeItem<
40
41
  const service = useTreeService();
41
42
  const { animate } = useTreeConfig();
42
43
  const childrenRef = useRef<HTMLDivElement | null>(null);
44
+ const ref = useRef<HTMLDivElement | null>(null);
45
+ const previousHeightRef = useRef<number | undefined>(undefined);
43
46
 
44
47
  const expand: TreeItemHandler<T, I> = (item, index) => {
45
48
  if (animate) {
@@ -81,29 +84,62 @@ const VirtualTreeListItemComponent = <T = any, I extends TreeItem<T> = TreeItem<
81
84
 
82
85
  const expanded = !!(item && isTreeItemExpanded(item, service));
83
86
 
87
+ const measure = useCallback(
88
+ (el: HTMLElement | null) => {
89
+ if (el?.offsetHeight !== previousHeightRef.current && el?.offsetHeight) {
90
+ previousHeightRef.current = el.offsetHeight;
91
+ measureRef(el);
92
+ }
93
+ },
94
+ [measureRef],
95
+ );
96
+
97
+ const measureThrottle = useThrottle(measure, 50);
98
+
99
+ const resizeObserver = useMemo(() => {
100
+ return new ResizeObserver(() => {
101
+ measureThrottle(ref.current);
102
+ });
103
+ }, [measureThrottle]);
104
+
105
+ useEffect(() => {
106
+ const el = ref.current;
107
+ if (el) {
108
+ previousHeightRef.current = el.offsetHeight;
109
+ resizeObserver.observe(el);
110
+ }
111
+ return () => {
112
+ if (el) {
113
+ resizeObserver.unobserve(el);
114
+ }
115
+ };
116
+ }, [resizeObserver]);
117
+
84
118
  return (
85
119
  <div>
86
120
  <div className="o-virtual-item" key={`virtual-item-${item?.uid || index}`} ref={measureRef}>
87
- {(!item || !item.data) && <LoadingItem />}
88
- {item && item.data && (
89
- <DefaultTreeItemContext.Provider
90
- value={{
91
- onExpand: expand,
92
- onCollapse: collapse,
93
- className,
94
- }}
95
- >
96
- <ItemComponent
97
- key={`item-${item?.uid || index}`}
98
- index={index}
99
- item={item}
100
- data={item.data}
101
- onClick={onClick}
102
- onMouseEnter={onMouseEnter}
103
- onMouseLeave={onMouseLeave}
104
- />
105
- </DefaultTreeItemContext.Provider>
106
- )}
121
+ <div ref={ref}>
122
+ {(!item || !item.data) && <LoadingItem />}
123
+ {item && item.data && (
124
+ <DefaultTreeItemContext.Provider
125
+ value={{
126
+ onExpand: expand,
127
+ onCollapse: collapse,
128
+ className,
129
+ }}
130
+ >
131
+ <ItemComponent
132
+ key={`item-${item?.uid || index}`}
133
+ index={index}
134
+ item={item}
135
+ data={item.data}
136
+ onClick={onClick}
137
+ onMouseEnter={onMouseEnter}
138
+ onMouseLeave={onMouseLeave}
139
+ />
140
+ </DefaultTreeItemContext.Provider>
141
+ )}
142
+ </div>
107
143
  </div>
108
144
  <CSSTransition
109
145
  in={expanded}
@@ -153,7 +189,8 @@ type NodeItem = {
153
189
  level: number;
154
190
  };
155
191
 
156
- const VirtualTreeListComponent = <T = any, I extends TreeItem<T> = TreeItem<T>>({
192
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-constraint
193
+ const VirtualTreeListComponent = <T extends any = any, I extends TreeItem<T> = TreeItem<T>>({
157
194
  items,
158
195
  onItemClick,
159
196
  onItemMouseEnter,