@true-engineering/true-react-common-ui-kit 3.0.0-alpha.19 → 3.0.0-alpha.20
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/hooks/index.d.ts +1 -0
- package/dist/hooks/use-merged-refs.d.ts +2 -0
- package/dist/true-react-common-ui-kit.js +258 -291
- package/dist/true-react-common-ui-kit.js.map +1 -1
- package/dist/true-react-common-ui-kit.umd.cjs +257 -290
- package/dist/true-react-common-ui-kit.umd.cjs.map +1 -1
- package/package.json +1 -1
- package/src/components/FlexibleTable/FlexibleTable.tsx +38 -21
- package/src/hooks/index.ts +1 -0
- package/src/hooks/use-merged-refs.ts +4 -0
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ReactNode, RefObject, useCallback, useEffect, useMemo, useRef
|
|
1
|
+
import { ReactNode, RefObject, useCallback, useEffect, useMemo, useRef } from 'react';
|
|
2
2
|
import clsx from 'clsx';
|
|
3
3
|
import {
|
|
4
4
|
addDataTestId,
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
isNotEmpty,
|
|
9
9
|
} from '@true-engineering/true-react-platform-helpers';
|
|
10
10
|
import { addDataAttributes } from '../../helpers';
|
|
11
|
-
import { useTweakStyles } from '../../hooks';
|
|
11
|
+
import { useMergedRefs, useTweakStyles } from '../../hooks';
|
|
12
12
|
import { ICommonProps } from '../../types';
|
|
13
13
|
import { Skeleton } from '../Skeleton';
|
|
14
14
|
import { ThemedPreloader } from '../ThemedPreloader';
|
|
@@ -73,18 +73,44 @@ export function FlexibleTable<Values extends Record<string, any>>({
|
|
|
73
73
|
currentComponentName: 'FlexibleTable',
|
|
74
74
|
});
|
|
75
75
|
|
|
76
|
-
const [isHorizontallyScrolled, setIsHorizontallyScrolled] = useState(false);
|
|
77
|
-
const [hasScrollBar, setHasScrollBar] = useState(false);
|
|
78
|
-
|
|
79
76
|
const observer = useRef<IntersectionObserver>();
|
|
80
77
|
const scrollRef = useRef<HTMLDivElement>(null);
|
|
81
|
-
const ref = refForScroll ?? scrollRef;
|
|
82
78
|
|
|
83
79
|
const showedColumns = useMemo(
|
|
84
80
|
() => enabledColumns ?? Object.keys(config),
|
|
85
81
|
[enabledColumns, config],
|
|
86
82
|
);
|
|
87
83
|
|
|
84
|
+
const getDataScrollAttributeSetter = useCallback(
|
|
85
|
+
(key: string, setter: (el: HTMLDivElement) => boolean) => (el?: HTMLDivElement) => {
|
|
86
|
+
if (isHorizontallyScrollable && isNotEmpty(el) && setter(el)) {
|
|
87
|
+
el.dataset[key] = 'true';
|
|
88
|
+
} else {
|
|
89
|
+
el?.removeAttribute(`data-${key}`);
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
[isHorizontallyScrollable],
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
// Когда таблица имеет скроллбар - добавляем аттрибут scrollable
|
|
96
|
+
const setHasScrollBarAttribute = useCallback(
|
|
97
|
+
getDataScrollAttributeSetter('scrollable', hasHorizontalScrollBar),
|
|
98
|
+
[getDataScrollAttributeSetter],
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
// Когда таблица проскроллена - добавляем аттрибут scrolled
|
|
102
|
+
const setIsScrolledAttribute = useCallback(
|
|
103
|
+
getDataScrollAttributeSetter('scrolled', (el) => el.scrollLeft > 0),
|
|
104
|
+
[getDataScrollAttributeSetter],
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
const ref = useMergedRefs([
|
|
108
|
+
refForScroll,
|
|
109
|
+
scrollRef,
|
|
110
|
+
setHasScrollBarAttribute,
|
|
111
|
+
setIsScrolledAttribute,
|
|
112
|
+
]);
|
|
113
|
+
|
|
88
114
|
const initIntersectionObserver = useCallback(
|
|
89
115
|
(node: HTMLDivElement) => {
|
|
90
116
|
if (infinityScrollConfig) {
|
|
@@ -118,21 +144,19 @@ export function FlexibleTable<Values extends Record<string, any>>({
|
|
|
118
144
|
);
|
|
119
145
|
|
|
120
146
|
useEffect(() => {
|
|
121
|
-
const scrollContainer =
|
|
122
|
-
if (isEmpty(scrollContainer) || !isHorizontallyScrollable
|
|
147
|
+
const scrollContainer = scrollRef.current;
|
|
148
|
+
if (isEmpty(scrollContainer) || !isHorizontallyScrollable) {
|
|
123
149
|
return;
|
|
124
150
|
}
|
|
125
151
|
|
|
126
152
|
const scrollHandler = () => {
|
|
127
|
-
|
|
153
|
+
setIsScrolledAttribute(scrollContainer);
|
|
128
154
|
};
|
|
129
155
|
|
|
130
156
|
const resizeHandler = () => {
|
|
131
|
-
|
|
157
|
+
setHasScrollBarAttribute(scrollContainer);
|
|
132
158
|
};
|
|
133
159
|
|
|
134
|
-
resizeHandler();
|
|
135
|
-
|
|
136
160
|
scrollContainer.addEventListener('scroll', scrollHandler);
|
|
137
161
|
window.addEventListener('resize', resizeHandler);
|
|
138
162
|
|
|
@@ -140,17 +164,10 @@ export function FlexibleTable<Values extends Record<string, any>>({
|
|
|
140
164
|
scrollContainer.removeEventListener('scroll', scrollHandler);
|
|
141
165
|
window.removeEventListener('resize', resizeHandler);
|
|
142
166
|
};
|
|
143
|
-
}, [
|
|
167
|
+
}, [scrollRef, setIsScrolledAttribute, setHasScrollBarAttribute]);
|
|
144
168
|
|
|
145
169
|
return (
|
|
146
|
-
<div
|
|
147
|
-
ref={ref}
|
|
148
|
-
className={clsx({ [classes.scroll]: isHorizontallyScrollable })}
|
|
149
|
-
{...addDataAttributes({
|
|
150
|
-
scrolled: isHorizontallyScrolled ? true : undefined,
|
|
151
|
-
scrollable: isHorizontallyScrollable && hasScrollBar ? true : undefined,
|
|
152
|
-
})}
|
|
153
|
-
>
|
|
170
|
+
<div ref={ref} className={clsx({ [classes.scroll]: isHorizontallyScrollable })}>
|
|
154
171
|
<table className={classes.root} {...addDataTestId(testId)} {...addDataAttributes(data)}>
|
|
155
172
|
<thead>
|
|
156
173
|
<tr className={classes.headerRow}>
|
package/src/hooks/index.ts
CHANGED