qbs-react-grid 1.0.46 → 1.0.48

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.
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useEffect, useMemo, useState } from 'react';
1
+ import React, { useCallback, useEffect, useMemo, useState, useRef } from 'react';
2
2
 
3
3
  import Cell from '../Cell';
4
4
  import Column from '../Column';
@@ -14,6 +14,7 @@ import debounce from './utilities/debounce';
14
14
  import { SettingsIcon } from './utilities/icons';
15
15
 
16
16
  import '../../dist/css/qbs-react-grid.css';
17
+ import { deepEqual } from './utilities/deepEqual';
17
18
 
18
19
  const CHECKBOX_LINE_HEIGHT = '36px';
19
20
  const COLUMN_WIDTH = 250;
@@ -67,6 +68,7 @@ const QbsTable: React.FC<QbsTableProps> = ({
67
68
  const [checkedKeys, setCheckedKeys] = useState<(number | string)[]>([]);
68
69
  const dataTheme = useMemo(() => localStorage.getItem('theme') ?? theme, [theme]);
69
70
  const [isOpen, setIsOpen] = useState(false);
71
+ const prevColumns = useRef<any | null>();
70
72
 
71
73
  const handleSortColumn = useCallback(
72
74
  (sortColumn: any, sortType: any) => {
@@ -93,10 +95,7 @@ const QbsTable: React.FC<QbsTableProps> = ({
93
95
  const handleCheckAll = useCallback(
94
96
  (event: React.ChangeEvent<HTMLInputElement>) => {
95
97
  const keys = event.target.checked ? data.map(item => item.id) : [];
96
- let updatedKeys = [...keys];
97
- if (checkedKeys) {
98
- updatedKeys = [...checkedKeys, ...updatedKeys];
99
- }
98
+ let updatedKeys = [...checkedKeys, ...keys];
100
99
  setCheckedKeys(updatedKeys);
101
100
  handleChecked(updatedKeys);
102
101
  },
@@ -146,9 +145,8 @@ const QbsTable: React.FC<QbsTableProps> = ({
146
145
  setColumns(columns);
147
146
  }, []);
148
147
 
149
- useEffect(() => {
150
- handleColumnToggle?.(columns);
151
- }, [columns]);
148
+ // useEffect(() => {
149
+ // }, [columns]);
152
150
 
153
151
  const handleClear = ([]) => {
154
152
  setCheckedKeys([]);
@@ -173,9 +171,11 @@ const QbsTable: React.FC<QbsTableProps> = ({
173
171
  checkedKeys: checkedKeys,
174
172
  tableHeaderActions: tableHeaderActions,
175
173
  selectedRowActions: selectedRowActions,
176
- onSelect: handleClear
174
+ onSelect: handleClear,
175
+ handleColumnToggle: handleColumnToggle
177
176
  };
178
177
  const themeToggle = useMemo(() => document.getElementById('themeToggle') as HTMLInputElement, []);
178
+
179
179
  useEffect(() => {
180
180
  const handleThemeToggle = () => {
181
181
  if (themeToggle?.checked) {
@@ -236,6 +236,23 @@ const QbsTable: React.FC<QbsTableProps> = ({
236
236
 
237
237
  return largestCellLength;
238
238
  }
239
+ const handleColumnsResizable = useCallback(() => {
240
+ const filteredColumns = columns?.filter(item => item.isVisible);
241
+ const length = filteredColumns?.length ?? 0;
242
+ const lastVisibleColumn = filteredColumns[length - 1];
243
+ const reColumns = columns?.map(item =>
244
+ item?.field === lastVisibleColumn?.field ? { ...item, resizable: false } : item
245
+ );
246
+ setColumns(reColumns);
247
+ }, [columns]);
248
+
249
+ useEffect(() => {
250
+ if (!deepEqual(columns, prevColumns.current)) {
251
+ handleColumnsResizable();
252
+ }
253
+ prevColumns.current = columns;
254
+ }, [columns, handleColumnsResizable]);
255
+
239
256
  const columnsRendered: React.ReactElement[] = useMemo(
240
257
  () =>
241
258
  (columns ?? []).map(
@@ -42,7 +42,15 @@ const ToolBar: React.FC<QbsTableToolbarProps> = ({
42
42
  },
43
43
  [asyncSearch, handleSearch, handleSearchValue]
44
44
  );
45
-
45
+ const handleHide = (actions: any) => {
46
+ if (actions.hidden) {
47
+ return false;
48
+ } else if (actions.customHide == '>2') {
49
+ return checkedKeys && checkedKeys?.length >= 2 ? true : false;
50
+ } else {
51
+ return true;
52
+ }
53
+ };
46
54
  return (
47
55
  <div className="qbs-table-toolbar-container">
48
56
  <div className={`qbs-table-toolbar ${className}`}>
@@ -75,7 +83,7 @@ const ToolBar: React.FC<QbsTableToolbarProps> = ({
75
83
  </button>
76
84
  {selectedRowActions?.map((actions, index: number) => (
77
85
  <>
78
- {!actions.hidden && (
86
+ {handleHide(actions) && (
79
87
  <button
80
88
  key={index.toString()}
81
89
  className="btn"
@@ -93,6 +93,7 @@ export interface QbsTableProps {
93
93
  action: (checked: (number | string)[]) => void;
94
94
  disabled?: boolean;
95
95
  hidden?: boolean;
96
+ customHide?: string;
96
97
  }[];
97
98
  selectedRows?: (number | string)[];
98
99
  classes?: { [key: string]: any };
@@ -121,10 +122,12 @@ export interface QbsTableToolbarProps {
121
122
  checkedKeys?: (number | string)[];
122
123
  tableHeaderActions?: ReactElement | ReactNode;
123
124
  onSelect?: (keys: any[]) => void;
125
+ handleColumnToggle?: (columns: QbsColumnProps[]) => void;
124
126
  selectedRowActions?: {
125
127
  actionTitle?: string;
126
128
  action: (checked: (number | string)[]) => void;
127
129
  disabled?: boolean;
128
130
  hidden?: boolean;
131
+ customHide?:string
129
132
  }[];
130
133
  }
@@ -0,0 +1,37 @@
1
+ export function deepEqual(value1: any, value2: any): boolean {
2
+ if (value1 === value2) {
3
+ return true;
4
+ }
5
+ if (typeof value1 !== typeof value2) {
6
+ return false;
7
+ }
8
+ if (value1 === null || value2 === null) {
9
+ return value1 === value2;
10
+ }
11
+ if (typeof value1 === 'object' && typeof value2 === 'object') {
12
+ if (Array.isArray(value1) && Array.isArray(value2)) {
13
+ if (value1.length !== value2.length) {
14
+ return false;
15
+ }
16
+ for (let i = 0; i < value1.length; i++) {
17
+ if (!deepEqual(value1[i], value2[i])) {
18
+ return false;
19
+ }
20
+ }
21
+ return true;
22
+ } else if (!Array.isArray(value1) && !Array.isArray(value2)) {
23
+ const keys1 = Object.keys(value1);
24
+ const keys2 = Object.keys(value2);
25
+ if (keys1.length !== keys2.length) {
26
+ return false;
27
+ }
28
+ for (const key of keys1) {
29
+ if (!keys2.includes(key) || !deepEqual(value1[key], value2[key])) {
30
+ return false;
31
+ }
32
+ }
33
+ return true;
34
+ }
35
+ }
36
+ return false;
37
+ }