qbs-react-grid 1.2.1 → 1.2.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 (51) hide show
  1. package/dist/css/qbs-react-grid.css +1 -1095
  2. package/dist/css/qbs-react-grid.min.css +1 -1
  3. package/dist/css/qbs-react-grid.min.css.map +1 -1
  4. package/es/Table.js +19 -19
  5. package/es/less/index.less +3 -0
  6. package/es/qbsTable/QbsTable.js +34 -7
  7. package/es/qbsTable/TableCardList.d.ts +5 -0
  8. package/es/qbsTable/TableCardList.js +564 -0
  9. package/es/qbsTable/Toolbar.js +16 -2
  10. package/es/qbsTable/commontypes.d.ts +9 -0
  11. package/es/qbsTable/utilities/CardComponent.d.ts +12 -0
  12. package/es/qbsTable/utilities/CardComponent.js +64 -0
  13. package/es/qbsTable/utilities/CardMenuDropdown.d.ts +13 -0
  14. package/es/qbsTable/utilities/CardMenuDropdown.js +89 -0
  15. package/es/qbsTable/utilities/SwitchCardColumns.d.ts +2 -0
  16. package/es/qbsTable/utilities/SwitchCardColumns.js +24 -0
  17. package/es/qbsTable/utilities/icons.d.ts +3 -0
  18. package/es/qbsTable/utilities/icons.js +45 -0
  19. package/es/utils/getTotalByColumns.js +1 -1
  20. package/es/utils/mergeCells.js +1 -1
  21. package/es/utils/useCellDescriptor.js +11 -11
  22. package/es/utils/useClassNames.js +2 -0
  23. package/lib/Table.js +19 -19
  24. package/lib/less/index.less +3 -0
  25. package/lib/qbsTable/QbsTable.js +34 -7
  26. package/lib/qbsTable/TableCardList.d.ts +5 -0
  27. package/lib/qbsTable/TableCardList.js +571 -0
  28. package/lib/qbsTable/Toolbar.js +16 -2
  29. package/lib/qbsTable/commontypes.d.ts +9 -0
  30. package/lib/qbsTable/utilities/CardComponent.d.ts +12 -0
  31. package/lib/qbsTable/utilities/CardComponent.js +72 -0
  32. package/lib/qbsTable/utilities/CardMenuDropdown.d.ts +13 -0
  33. package/lib/qbsTable/utilities/CardMenuDropdown.js +95 -0
  34. package/lib/qbsTable/utilities/SwitchCardColumns.d.ts +2 -0
  35. package/lib/qbsTable/utilities/SwitchCardColumns.js +30 -0
  36. package/lib/qbsTable/utilities/icons.d.ts +3 -0
  37. package/lib/qbsTable/utilities/icons.js +50 -2
  38. package/lib/utils/getTotalByColumns.js +1 -1
  39. package/lib/utils/mergeCells.js +1 -1
  40. package/lib/utils/useCellDescriptor.js +11 -11
  41. package/lib/utils/useClassNames.js +2 -0
  42. package/package.json +11 -6
  43. package/src/less/index.less +3 -0
  44. package/src/qbsTable/QbsTable.tsx +201 -173
  45. package/src/qbsTable/TableCardList.tsx +629 -0
  46. package/src/qbsTable/Toolbar.tsx +22 -2
  47. package/src/qbsTable/commontypes.ts +9 -0
  48. package/src/qbsTable/utilities/CardComponent.tsx +102 -0
  49. package/src/qbsTable/utilities/CardMenuDropdown.tsx +118 -0
  50. package/src/qbsTable/utilities/SwitchCardColumns.tsx +29 -0
  51. package/src/qbsTable/utilities/icons.tsx +51 -0
@@ -18,12 +18,13 @@ import ToolBar from './Toolbar';
18
18
  import ColumToggle from './utilities/ColumShowHide';
19
19
  import debounce from './utilities/debounce';
20
20
  import { deepEqual } from './utilities/deepEqual';
21
+ import NoData from './utilities/empty';
21
22
  import { SettingsIcon } from './utilities/icons';
22
23
 
23
24
  // import 'qbs-react-table/dist/css/qbs-react-grid.css';
24
25
 
25
26
  import '../../dist/css/qbs-react-grid.css';
26
- import NoData from './utilities/empty';
27
+ import CardComponent from './utilities/CardComponent';
27
28
 
28
29
  const CHECKBOX_LINE_HEIGHT = '36px';
29
30
  const COLUMN_WIDTH = 250;
@@ -81,7 +82,9 @@ const QbsTable: React.FC<QbsTableProps> = ({
81
82
  renderEmpty,
82
83
  autoHeight,
83
84
  emptySubTitle,
84
- emptyTitle
85
+ emptyTitle,
86
+ tableView = true,
87
+ enableTableToggle = false
85
88
  }) => {
86
89
  const [loading, setLoading] = useState(false);
87
90
  const [columns, setColumns] = useState(propColumn);
@@ -89,6 +92,8 @@ const QbsTable: React.FC<QbsTableProps> = ({
89
92
  const dataTheme = useMemo(() => localStorage.getItem('theme') ?? theme, [theme]);
90
93
  const [isOpen, setIsOpen] = useState(false);
91
94
  const prevColumns = useRef<any | null>();
95
+ const [tableViewToggle, setTableViewToggle] = useState(tableView);
96
+
92
97
  const tableBodyRef = useRef<HTMLDivElement>(null);
93
98
  const handleSortColumn = useCallback(
94
99
  (sortColumn: any, sortType: any) => {
@@ -115,7 +120,11 @@ const QbsTable: React.FC<QbsTableProps> = ({
115
120
  const handleCheckAll = useCallback(
116
121
  (event: React.ChangeEvent<HTMLInputElement>) => {
117
122
  const keys = event.target.checked ? data.map(item => item.id) : [];
118
- let updatedKeys = [...keys];
123
+ // let updatedKeys = [...keys];
124
+ // if (checkedKeys) {
125
+ // updatedKeys = [...checkedKeys, ...updatedKeys];
126
+ // } TODO => previous bug fix removed this section
127
+ const updatedKeys = [...keys];
119
128
  setCheckedKeys(updatedKeys);
120
129
  handleChecked(updatedKeys);
121
130
  },
@@ -126,7 +135,7 @@ const QbsTable: React.FC<QbsTableProps> = ({
126
135
  (event: React.ChangeEvent<HTMLInputElement>) => {
127
136
  const value = event.target.value;
128
137
  if (value !== undefined) {
129
- let updatedKeys = event.target.checked
138
+ const updatedKeys = event.target.checked
130
139
  ? [...checkedKeys, value]
131
140
  : checkedKeys.filter(key => key !== value);
132
141
  setCheckedKeys(updatedKeys);
@@ -222,7 +231,10 @@ const QbsTable: React.FC<QbsTableProps> = ({
222
231
  onSelect: handleClear,
223
232
  handleColumnToggle: handleColumnToggle,
224
233
  dataLength: data?.length,
225
- searchPlaceholder: searchPlaceholder
234
+ searchPlaceholder: searchPlaceholder,
235
+ setTableViewToggle: setTableViewToggle,
236
+ tableViewToggle: tableViewToggle,
237
+ enableTableToggle : enableTableToggle
226
238
  };
227
239
  const themeToggle = useMemo(() => document.getElementById('themeToggle') as HTMLInputElement, []);
228
240
 
@@ -259,7 +271,7 @@ const QbsTable: React.FC<QbsTableProps> = ({
259
271
  const keyValue = dataRowKey as string;
260
272
  const key = rowData[keyValue];
261
273
 
262
- let nextExpandedRowKeys = new Set(expandedRowKeys);
274
+ const nextExpandedRowKeys = new Set(expandedRowKeys);
263
275
 
264
276
  if (nextExpandedRowKeys.has(key)) {
265
277
  nextExpandedRowKeys.delete(key);
@@ -436,129 +448,154 @@ const QbsTable: React.FC<QbsTableProps> = ({
436
448
  <div className={`qbs-table ${classes.tableContainerClass}`} data-theme={dataTheme}>
437
449
  {toolbar && <ToolBar {...toolbarProps} />}
438
450
  <div className="qbs-table-border-wrap">
439
- <Table
440
- height={autoHeight ? undefined : height}
441
- key={tableKey}
442
- tableKey={tableKey}
443
- data={data}
444
- tableBodyRef={tableBodyRef}
445
- dataTheme={dataTheme}
446
- wordWrap={wordWrap}
447
- autoHeight={autoHeight}
448
- sortColumn={sortColumn}
449
- style={{ position: 'relative' }}
450
- sortType={sortType}
451
- onSortColumn={handleSortColumn}
452
- onRowClick={onRowClick}
453
- tableBodyHeight={tableBodyHeight}
454
- cellBordered={cellBordered}
455
- bordered={bordered}
456
- renderEmpty={(info: React.ReactNode) =>
457
- renderEmpty ? (
458
- renderEmpty(info)
459
- ) : (
460
- <NoData title={emptyTitle ?? 'No Data Found'} subtitle={emptySubTitle} />
461
- )
462
- }
463
- columns={columns}
464
- minHeight={minHeight}
465
- headerHeight={headerHeight}
466
- rowExpandedHeight={rowExpandedHeight}
467
- loading={isLoading ?? loading}
468
- showHeader
469
- defaultChecked
470
- expandedRowKeys={expandedRowKeys}
471
- onExpandChange={onExpandChange}
472
- rowKey={dataRowKey ?? 'id'}
473
- defaultExpandAllRows={defaultExpandAllRows}
474
- shouldUpdateScroll={shouldUpdateScroll}
475
- renderRowExpanded={rowData => {
476
- return handleRowExpanded?.(rowData);
477
- }}
478
- >
479
- {rowExpand && (
480
- <Column width={70} align="center" fixed="left">
481
- <HeaderCell
482
- verticalAlign={findGrouped() ? 'middle' : undefined}
483
- className={` ${classes.headerlClass}`}
484
- renderSortIcon={renderSortIcon}
485
- >
486
- #
487
- </HeaderCell>
488
- <ExpandCell
489
- dataKey={dataRowKey}
490
- expandedRowKeys={expandedRowKeys}
491
- onChange={handleExpanded}
492
- />
493
- </Column>
494
- )}
495
- {selection && (
496
- <Column width={50} align="center" fixed="left">
497
- <HeaderCell
498
- style={{ padding: 0 }}
499
- verticalAlign={findGrouped() ? 'middle' : undefined}
500
- dataTheme={dataTheme}
501
- renderSortIcon={renderSortIcon}
502
- className={`qbs-checkbox-border-none ${classes.headerlClass}`}
503
- >
504
- <div
505
- style={{ lineHeight: CHECKBOX_LINE_HEIGHT }}
506
- className={`qbs-table-checkbox ${classes.selectionCell}`}
451
+ {tableViewToggle ? (
452
+ <Table
453
+ height={autoHeight ? undefined : height}
454
+ key={tableKey}
455
+ tableKey={tableKey}
456
+ data={data}
457
+ tableBodyRef={tableBodyRef}
458
+ dataTheme={dataTheme}
459
+ wordWrap={wordWrap}
460
+ autoHeight={autoHeight}
461
+ sortColumn={sortColumn}
462
+ style={{ position: 'relative' }}
463
+ sortType={sortType}
464
+ onSortColumn={handleSortColumn}
465
+ onRowClick={onRowClick}
466
+ tableBodyHeight={tableBodyHeight}
467
+ cellBordered={cellBordered}
468
+ bordered={bordered}
469
+ renderEmpty={(info: React.ReactNode) =>
470
+ renderEmpty ? (
471
+ renderEmpty(info)
472
+ ) : (
473
+ <NoData title={emptyTitle ?? 'No Data Found'} subtitle={emptySubTitle} />
474
+ )
475
+ }
476
+ columns={columns}
477
+ minHeight={minHeight}
478
+ headerHeight={headerHeight}
479
+ rowExpandedHeight={rowExpandedHeight}
480
+ loading={isLoading ?? loading}
481
+ showHeader
482
+ defaultChecked
483
+ expandedRowKeys={expandedRowKeys}
484
+ onExpandChange={onExpandChange}
485
+ rowKey={dataRowKey ?? 'id'}
486
+ defaultExpandAllRows={defaultExpandAllRows}
487
+ shouldUpdateScroll={shouldUpdateScroll}
488
+ renderRowExpanded={rowData => {
489
+ return handleRowExpanded?.(rowData);
490
+ }}
491
+ >
492
+ {rowExpand && (
493
+ <Column width={70} align="center" fixed="left">
494
+ <HeaderCell
495
+ verticalAlign={findGrouped() ? 'middle' : undefined}
496
+ className={` ${classes.headerlClass}`}
497
+ renderSortIcon={renderSortIcon}
507
498
  >
508
- <input
509
- type="checkbox"
510
- onChange={handleCheckAll}
511
- id={`checkbox-all`}
512
- className={`qbs-table-checkbox-input ${classes.tableCheckBoxClass}`}
513
- checked={data?.length > 0 && data.every(item => checkedKeys?.includes(item.id))}
514
- />
515
- <label htmlFor={`checkbox-all`}>
516
- <svg
517
- width="8"
518
- height="6"
519
- viewBox="0 0 8 6"
520
- fill="none"
521
- xmlns="http://www.w3.org/2000/svg"
522
- >
523
- <path
524
- d="M0 3.21739L2.89883 6L8 1.06994L6.89494 0L2.89883 3.86768L1.09728 2.14745L0 3.21739Z"
525
- fill="white"
526
- />
527
- </svg>
528
- </label>
529
- </div>
530
- </HeaderCell>
531
- <CheckCell
532
- dataKey="id"
533
- checkedKeys={checkedKeys}
534
- className={`${classes.tableCheckBoxClass}`}
535
- onChange={handleCheck}
536
- dataTheme={dataTheme}
537
- />
538
- </Column>
539
- )}
540
- {customRowStatus && Object.keys(customRowStatus)?.length > 0 && (
541
- <Column width={50} align="center" fixed="left">
542
- <HeaderCell
543
- verticalAlign={findGrouped() ? 'middle' : undefined}
544
- className={` ${classes.headerlClass}`}
545
- renderSortIcon={renderSortIcon}
546
- >
547
- {' '}
548
- </HeaderCell>
549
- <CustomRowStatus
550
- getIcon={customRowStatus.getIcon}
551
- dataKey={customRowStatus.field}
552
- rowClick={customRowStatus.onClick}
553
- path={customRowStatus.getPath}
554
- link={customRowStatus.link}
555
- getToolTip={customRowStatus.getToolTip}
556
- />
557
- </Column>
558
- )}
559
- {columnsRendered}
560
- {!actionProps ||
561
- (actionProps?.length === 0 && columnToggle && (
499
+ #
500
+ </HeaderCell>
501
+ <ExpandCell
502
+ dataKey={dataRowKey}
503
+ expandedRowKeys={expandedRowKeys}
504
+ onChange={handleExpanded}
505
+ />
506
+ </Column>
507
+ )}
508
+ {selection && (
509
+ <Column width={50} align="center" fixed="left">
510
+ <HeaderCell
511
+ style={{ padding: 0 }}
512
+ verticalAlign={findGrouped() ? 'middle' : undefined}
513
+ dataTheme={dataTheme}
514
+ renderSortIcon={renderSortIcon}
515
+ className={`qbs-checkbox-border-none ${classes.headerlClass}`}
516
+ >
517
+ <div
518
+ style={{ lineHeight: CHECKBOX_LINE_HEIGHT }}
519
+ className={`qbs-table-checkbox ${classes.selectionCell}`}
520
+ >
521
+ <input
522
+ type="checkbox"
523
+ onChange={handleCheckAll}
524
+ id={'checkbox-all'}
525
+ className={`qbs-table-checkbox-input ${classes.tableCheckBoxClass}`}
526
+ checked={
527
+ data?.length > 0 && data.every(item => checkedKeys?.includes(item.id))
528
+ }
529
+ />
530
+ <label htmlFor={'checkbox-all'}>
531
+ <svg
532
+ width="8"
533
+ height="6"
534
+ viewBox="0 0 8 6"
535
+ fill="none"
536
+ xmlns="http://www.w3.org/2000/svg"
537
+ >
538
+ <path
539
+ d="M0 3.21739L2.89883 6L8 1.06994L6.89494 0L2.89883 3.86768L1.09728 2.14745L0 3.21739Z"
540
+ fill="white"
541
+ />
542
+ </svg>
543
+ </label>
544
+ </div>
545
+ </HeaderCell>
546
+ <CheckCell
547
+ dataKey="id"
548
+ checkedKeys={checkedKeys}
549
+ className={`${classes.tableCheckBoxClass}`}
550
+ onChange={handleCheck}
551
+ dataTheme={dataTheme}
552
+ />
553
+ </Column>
554
+ )}
555
+ {customRowStatus && Object.keys(customRowStatus)?.length > 0 && (
556
+ <Column width={50} align="center" fixed="left">
557
+ <HeaderCell
558
+ verticalAlign={findGrouped() ? 'middle' : undefined}
559
+ className={` ${classes.headerlClass}`}
560
+ renderSortIcon={renderSortIcon}
561
+ >
562
+ {' '}
563
+ </HeaderCell>
564
+ <CustomRowStatus
565
+ getIcon={customRowStatus.getIcon}
566
+ dataKey={customRowStatus.field}
567
+ rowClick={customRowStatus.onClick}
568
+ path={customRowStatus.getPath}
569
+ link={customRowStatus.link}
570
+ getToolTip={customRowStatus.getToolTip}
571
+ />
572
+ </Column>
573
+ )}
574
+ {columnsRendered}
575
+ {!actionProps ||
576
+ (actionProps?.length === 0 && columnToggle && (
577
+ <Column width={40} fixed="right">
578
+ <HeaderCell
579
+ verticalAlign={findGrouped() ? 'middle' : undefined}
580
+ className={` ${classes.headerlClass}`}
581
+ dataTheme={dataTheme}
582
+ renderSortIcon={renderSortIcon}
583
+ >
584
+ <ColumToggle
585
+ columns={columns}
586
+ onToggle={handleToggle}
587
+ onReorder={onReorder}
588
+ isOpen={isOpen}
589
+ tableHeight={height}
590
+ setIsOpen={setIsOpen}
591
+ handleResetColumns={handleResetColumns}
592
+ handleColumnToggle={handleColumnToggle}
593
+ />
594
+ </HeaderCell>
595
+ <Cell />
596
+ </Column>
597
+ ))}
598
+ {actionProps && actionProps?.length > 0 && (
562
599
  <Column width={40} fixed="right">
563
600
  <HeaderCell
564
601
  verticalAlign={findGrouped() ? 'middle' : undefined}
@@ -566,54 +603,45 @@ const QbsTable: React.FC<QbsTableProps> = ({
566
603
  dataTheme={dataTheme}
567
604
  renderSortIcon={renderSortIcon}
568
605
  >
569
- <ColumToggle
570
- columns={columns}
571
- onToggle={handleToggle}
572
- onReorder={onReorder}
573
- isOpen={isOpen}
574
- tableHeight={height}
575
- setIsOpen={setIsOpen}
576
- handleResetColumns={handleResetColumns}
577
- handleColumnToggle={handleColumnToggle}
578
- />
606
+ {!columnToggle ? (
607
+ <SettingsIcon />
608
+ ) : (
609
+ <ColumToggle
610
+ columns={columns}
611
+ onToggle={handleToggle}
612
+ tableHeight={height}
613
+ onReorder={onReorder}
614
+ isOpen={isOpen}
615
+ setIsOpen={setIsOpen}
616
+ handleResetColumns={handleResetColumns}
617
+ handleColumnToggle={handleColumnToggle}
618
+ />
619
+ )}
579
620
  </HeaderCell>
580
- <Cell />
621
+ <ActionCell
622
+ tableBodyRef={tableBodyRef}
623
+ actionProps={actionProps}
624
+ className={`${classes.cellClass} ${classes.actionCellClass}`}
625
+ handleMenuActions={handleMenuActions}
626
+ dataTheme={dataTheme}
627
+ />
581
628
  </Column>
629
+ )}
630
+ </Table>
631
+ ) : (
632
+ <div className=" p-2">
633
+ {data.map((items: any) => (
634
+ <div className="flex flex-col gap-3 p-2" key={items?.id}>
635
+ <CardComponent
636
+ data={items}
637
+ columns={columns}
638
+ tableBodyRef={tableBodyRef}
639
+ actionProps={actionProps}
640
+ />
641
+ </div>
582
642
  ))}
583
- {actionProps && actionProps?.length > 0 && (
584
- <Column width={40} fixed="right">
585
- <HeaderCell
586
- verticalAlign={findGrouped() ? 'middle' : undefined}
587
- className={` ${classes.headerlClass}`}
588
- dataTheme={dataTheme}
589
- renderSortIcon={renderSortIcon}
590
- >
591
- {!columnToggle ? (
592
- <SettingsIcon />
593
- ) : (
594
- <ColumToggle
595
- columns={columns}
596
- onToggle={handleToggle}
597
- tableHeight={height}
598
- onReorder={onReorder}
599
- isOpen={isOpen}
600
- setIsOpen={setIsOpen}
601
- handleResetColumns={handleResetColumns}
602
- handleColumnToggle={handleColumnToggle}
603
- />
604
- )}
605
- </HeaderCell>
606
- <ActionCell
607
- tableBodyRef={tableBodyRef}
608
- actionProps={actionProps}
609
- className={`${classes.cellClass} ${classes.actionCellClass}`}
610
- handleMenuActions={handleMenuActions}
611
- dataTheme={dataTheme}
612
- />
613
- </Column>
614
- )}
615
- </Table>
616
-
643
+ </div>
644
+ )}
617
645
  <div>
618
646
  {pagination && data?.length > 0 && <Pagination paginationProps={paginationProps} />}
619
647
  </div>