@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@true-engineering/true-react-common-ui-kit",
3
- "version": "3.0.0-alpha.19",
3
+ "version": "3.0.0-alpha.20",
4
4
  "description": "True Engineering React UI Kit with theming support",
5
5
  "author": "True Engineering (https://trueengineering.ru)",
6
6
  "keywords": [
@@ -1,4 +1,4 @@
1
- import { ReactNode, RefObject, useCallback, useEffect, useMemo, useRef, useState } from 'react';
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 = ref.current;
122
- if (isEmpty(scrollContainer) || !isHorizontallyScrollable || !isFirstColumnSticky) {
147
+ const scrollContainer = scrollRef.current;
148
+ if (isEmpty(scrollContainer) || !isHorizontallyScrollable) {
123
149
  return;
124
150
  }
125
151
 
126
152
  const scrollHandler = () => {
127
- setIsHorizontallyScrolled(scrollContainer.scrollLeft > 0);
153
+ setIsScrolledAttribute(scrollContainer);
128
154
  };
129
155
 
130
156
  const resizeHandler = () => {
131
- setHasScrollBar(hasHorizontalScrollBar(scrollContainer));
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
- }, [ref]);
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}>
@@ -4,3 +4,4 @@ export * from './use-dropdown';
4
4
  export * from './use-tweak-styles';
5
5
  export * from './use-did-mount-effect';
6
6
  export * from './use-mixed-styles';
7
+ export * from './use-merged-refs';
@@ -0,0 +1,4 @@
1
+ import { useMemo } from 'react';
2
+ import { mergeRefs } from '@true-engineering/true-react-platform-helpers';
3
+
4
+ export const useMergedRefs: typeof mergeRefs = (refs) => useMemo(() => mergeRefs(refs), refs);