@inceptionbg/iui 2.0.12 → 2.0.14

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/index.d.ts +112 -53
  2. package/dist/index.js +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/iui.css +1 -1
  5. package/package.json +1 -1
  6. package/rollup.config.js +1 -5
  7. package/src/assets/icons/light/faBookmark.ts +15 -15
  8. package/src/assets/icons/light/faBookmarkSlash.ts +15 -15
  9. package/src/assets/images/logo/inception.svg +22 -0
  10. package/src/components/Button/Button.tsx +1 -1
  11. package/src/components/Button/SplitButton.tsx +91 -0
  12. package/src/components/Dialog/components/DialogFooter.tsx +5 -1
  13. package/src/components/Header/Components/ModuleSelect.tsx +15 -10
  14. package/src/components/Header/Components/UserMenu.tsx +1 -0
  15. package/src/components/List/List.tsx +5 -3
  16. package/src/components/List/ListItem.tsx +58 -13
  17. package/src/components/Menu/Menu.tsx +5 -1
  18. package/src/components/Pullover/Pullover.tsx +25 -9
  19. package/src/components/Sidebar/Sidebar.tsx +6 -4
  20. package/src/components/Table/Table.tsx +2 -5
  21. package/src/components/Table/components/edit/TableEditRow.tsx +4 -1
  22. package/src/components/Table/components/filters/TableFilters.tsx +4 -1
  23. package/src/components/Table/components/items/TableItemActions.tsx +12 -3
  24. package/src/components/Table/components/print/TablePrint.tsx +4 -1
  25. package/src/components/Table/components/sort/TableSort.tsx +19 -1
  26. package/src/components/Table/components/templates/TableTemplates.tsx +56 -45
  27. package/src/components/Table/contexts/TableContext.tsx +13 -17
  28. package/src/components/Table/hooks/localHooks/useLocalTableColumns.tsx +8 -10
  29. package/src/components/Table/hooks/localHooks/useLocalTableData.tsx +1 -1
  30. package/src/components/Table/hooks/useTableColumns.ts +28 -0
  31. package/src/components/Table/hooks/useTablePagination.ts +10 -7
  32. package/src/components/Table/hooks/useTableSelect.ts +15 -7
  33. package/src/index.ts +14 -2
  34. package/src/styles/App.scss +1 -0
  35. package/src/styles/common/maps/_buttonMaps.scss +42 -0
  36. package/src/styles/components/_button.scss +11 -50
  37. package/src/styles/components/_buttonSplit.scss +90 -0
  38. package/src/styles/components/_header.scss +26 -5
  39. package/src/styles/components/_list.scss +19 -1
  40. package/src/styles/components/_page.scss +2 -1
  41. package/src/styles/components/_sidebar.scss +2 -2
  42. package/src/styles/components/_table.scss +6 -6
  43. package/src/styles/variables/_variables.scss +1 -0
  44. package/src/types/ITable.ts +40 -44
  45. package/src/utils/i18n/i18nIUICyrilic.ts +22 -13
  46. package/src/utils/i18n/i18nIUILatin.ts +15 -7
  47. package/src/utils/i18n/i18nIUIMe.ts +21 -11
  48. package/src/utils/logoUtils.ts +7 -0
  49. package/src/utils/tableUtils.ts +5 -5
  50. package/tsconfig.json +2 -0
  51. package/src/components/Table/hooks/useDefaultTemplate.ts +0 -20
@@ -1,24 +1,69 @@
1
1
  import clsx from 'clsx';
2
- import type { FC } from 'react';
2
+ import { useMemo, type FC } from 'react';
3
+ import { IconButton } from '../Button/IconButton';
4
+ import type { IconDefinition } from '@fortawesome/fontawesome-svg-core';
5
+ import { IButtonColor } from '../Button/Button';
6
+
7
+ export interface IListItemAction {
8
+ icon: IconDefinition;
9
+ onClick: () => void;
10
+ disabled?: boolean;
11
+ color?: IButtonColor;
12
+ hidden?: boolean;
13
+ }
3
14
 
4
15
  export interface IListItem {
5
16
  id?: string;
6
17
  label: string;
7
18
  desc?: string;
19
+ actions?: IListItemAction[];
8
20
  onClick?: () => void;
9
21
  active?: boolean;
10
22
  disabled?: boolean;
11
23
  }
12
24
 
13
- export const ListItem: FC<IListItem> = ({ label, desc, onClick, active, disabled }) => (
14
- <div
15
- className={clsx('iui-list-item', { active, disabled })}
16
- onClick={e => {
17
- e.stopPropagation();
18
- onClick?.();
19
- }}
20
- >
21
- <p className="bold">{label}</p>
22
- {desc && <div className="iui-list-item-desc">{desc}</div>}
23
- </div>
24
- );
25
+ export const ListItem: FC<IListItem> = ({
26
+ label,
27
+ desc,
28
+ actions,
29
+ onClick,
30
+ active,
31
+ disabled,
32
+ }) => {
33
+ const filteredActions = useMemo(
34
+ () => actions?.filter(action => !action.hidden),
35
+ [actions]
36
+ );
37
+
38
+ return (
39
+ <div
40
+ className={clsx('iui-list-item', { active, disabled })}
41
+ onClick={e => {
42
+ e.stopPropagation();
43
+ onClick?.();
44
+ }}
45
+ >
46
+ <div>
47
+ <p className="bold">{label}</p>
48
+ {desc && <div className="iui-list-item-desc">{desc}</div>}
49
+ </div>
50
+ {filteredActions && filteredActions.length > 0 && (
51
+ <div className="iui-list-item-actions">
52
+ {filteredActions.map((action, index) => (
53
+ <IconButton
54
+ key={index}
55
+ icon={action.icon}
56
+ onClick={e => {
57
+ e.stopPropagation();
58
+ action.onClick();
59
+ }}
60
+ size="s"
61
+ color={action.color}
62
+ disabled={action.disabled}
63
+ />
64
+ ))}
65
+ </div>
66
+ )}
67
+ </div>
68
+ );
69
+ };
@@ -46,7 +46,11 @@ export const Menu: FC<Props> = ({
46
46
  {renderButton(containerRef)}
47
47
  {isOpen
48
48
  ? createPortal(
49
- <div ref={portalRef} className="portal-background">
49
+ <div
50
+ ref={portalRef}
51
+ className="portal-background"
52
+ onClick={e => e.stopPropagation()}
53
+ >
50
54
  <div
51
55
  ref={menuRef}
52
56
  className={clsx('iui-menu', className, size)}
@@ -12,6 +12,7 @@ import { useTranslation } from 'react-i18next';
12
12
  import { onPopupKeyDown } from '../../utils/popupUtils';
13
13
  import { ILocalPopupControl } from '../../types/IPopup';
14
14
  import { Loader } from '../Loader/Loader';
15
+ import { SplitButton } from '../Button/SplitButton';
15
16
 
16
17
  interface Props {
17
18
  id?: string;
@@ -20,8 +21,10 @@ interface Props {
20
21
  title: string;
21
22
  onSearch?: (search: string) => void;
22
23
  };
24
+ isFetching?: boolean;
23
25
  isLoading?: boolean;
24
26
  onFormSubmit?: () => void;
27
+ onContentClick?: () => void;
25
28
  onCloseCallback?: () => void;
26
29
  footer?: IDialogFooterActions;
27
30
  size?: 'vw25' | 'vw50' | 'vw75' | 'vw100' | 'w500' | 'w600';
@@ -34,8 +37,10 @@ export const Pullover: FC<Props> = ({
34
37
  id,
35
38
  control,
36
39
  header,
40
+ isFetching = false,
37
41
  isLoading = false,
38
42
  onFormSubmit,
43
+ onContentClick,
39
44
  onCloseCallback,
40
45
  footer,
41
46
  size = 'vw50',
@@ -47,6 +52,8 @@ export const Pullover: FC<Props> = ({
47
52
  const { t } = useTranslation();
48
53
  const searchRef = useRef<HTMLInputElement>(null);
49
54
 
55
+ const ConfirmButton = footer?.confirmButton.splitActions ? SplitButton : Button;
56
+
50
57
  const { elementRef, isOpen, onClose } = useLocalPopoverControl({
51
58
  control,
52
59
  onCloseCallback,
@@ -126,11 +133,18 @@ export const Pullover: FC<Props> = ({
126
133
  )}
127
134
  >
128
135
  {/* CONTENT */}
129
- <Loader isLoading={isLoading}>
130
- <div className={clsx('pullover-content', contentClassName)}>
131
- {children}
132
- </div>
133
- </Loader>
136
+ {isLoading ? (
137
+ <Loader isLoading isFullPage />
138
+ ) : (
139
+ <Loader isLoading={isFetching}>
140
+ <div
141
+ onClick={onContentClick}
142
+ className={clsx('pullover-content', contentClassName)}
143
+ >
144
+ {children}
145
+ </div>
146
+ </Loader>
147
+ )}
134
148
 
135
149
  {/* FOOTER */}
136
150
  {footer && (
@@ -138,7 +152,9 @@ export const Pullover: FC<Props> = ({
138
152
  {footer.additionalButton && (
139
153
  <Button
140
154
  {...footer.additionalButton}
141
- disabled={footer.additionalButton.disabled || isLoading}
155
+ disabled={
156
+ footer.additionalButton.disabled || isFetching || isLoading
157
+ }
142
158
  variant="simple"
143
159
  className="mr-auto"
144
160
  />
@@ -147,12 +163,12 @@ export const Pullover: FC<Props> = ({
147
163
  label={t('Cancel')}
148
164
  variant="outlined"
149
165
  onClick={onClose}
150
- disabled={isLoading}
166
+ disabled={isFetching || isLoading}
151
167
  />
152
- <Button
168
+ <ConfirmButton
153
169
  {...footer.confirmButton}
154
170
  label={footer.confirmButton.label ?? t('Confirm')}
155
- disabled={footer.confirmButton.disabled || isLoading}
171
+ disabled={footer.confirmButton.disabled || isFetching || isLoading}
156
172
  type={
157
173
  (footer.confirmButton.type ?? onFormSubmit) ? 'submit' : 'button'
158
174
  }
@@ -4,13 +4,15 @@ import { SidebarItem } from './SidebarItem';
4
4
  import { ISidebarItem } from './types/ISidebar';
5
5
  import { faAngleLeft } from '../../assets/icons/solid/faAngleLeft';
6
6
  import { IconButton } from '../Button/IconButton';
7
+ import { IOrgLogo, orgLogo } from '../../utils/logoUtils';
7
8
 
8
9
  export interface ISidebarProps {
9
10
  items: ISidebarItem[][];
10
- logo?: string;
11
+ logo?: IOrgLogo;
12
+ customLogo?: string;
11
13
  appVersion?: string;
12
14
  }
13
- export const Sidebar: FC<ISidebarProps> = ({ items, logo, appVersion }) => {
15
+ export const Sidebar: FC<ISidebarProps> = ({ items, logo, customLogo, appVersion }) => {
14
16
  const [itemsList, setItemsList] = useState<ISidebarItem[][]>([]);
15
17
  const [collapsed, setCollapsed] = useState(false);
16
18
  const [openedMenu, setOpenedMenu] = useState('');
@@ -66,11 +68,11 @@ export const Sidebar: FC<ISidebarProps> = ({ items, logo, appVersion }) => {
66
68
  </div>
67
69
  {/* ////// FOOTER ////// */}
68
70
  <div className={clsx('sidebar-footer', { collapsed })}>
69
- {logo && (
71
+ {(logo ?? customLogo) && (
70
72
  <img
71
73
  className="sidebar-logo"
72
74
  // src={!!organization?.reseller ? orgLogo[organization?.reseller] : logo}
73
- src={logo}
75
+ src={customLogo || orgLogo[logo || 'INC']}
74
76
  alt="logo"
75
77
  />
76
78
  )}
@@ -20,17 +20,14 @@ import { TableTemplates } from './components/templates/TableTemplates';
20
20
 
21
21
  export const TableContent: FC = () => {
22
22
  const {
23
- columns,
23
+ columnData: { columns },
24
24
  customHeader,
25
25
  headerWrap,
26
- // setColumns,
27
- // withColumnsSearch,
28
26
  data,
29
27
  sumRows,
30
28
  isLoading,
31
29
  selectedRowUuid,
32
30
  // customPrintData,
33
- // templates,
34
31
  // additionsalOptions,
35
32
  footer,
36
33
  rowHeight = 'm',
@@ -78,7 +75,7 @@ export const TableContent: FC = () => {
78
75
  {props.selectActions.length > 0 && <TableSelect />}
79
76
  {props.filterData && <TableFilters />}
80
77
  {props.sortData && <TableSort />}
81
- {props.templates && <TableTemplates />}
78
+ {props.templateData && <TableTemplates />}
82
79
  {props.printData && <TablePrint />}
83
80
  </div>
84
81
  <div className="table-container" style={{ maxHeight }}>
@@ -6,7 +6,10 @@ import { useTableContext } from '../../contexts/TableContext';
6
6
  import { useGetFocusableElements } from '../../../../hooks/useGetFocusableElements';
7
7
 
8
8
  export const TableEditRow: FC = () => {
9
- const { columns, editable } = useTableContext();
9
+ const {
10
+ columnData: { columns },
11
+ editable,
12
+ } = useTableContext();
10
13
 
11
14
  const elementRef = useRef(null);
12
15
 
@@ -20,7 +20,10 @@ import { usePopupControl } from '../../../../hooks/usePopupControl';
20
20
 
21
21
  export const TableFilters: FC = () => {
22
22
  const { t } = useTranslation();
23
- const { columns, filterData } = useTableContext();
23
+ const {
24
+ columnData: { columns },
25
+ filterData,
26
+ } = useTableContext();
24
27
  const { control, onClose, onOpen } = usePopupControl();
25
28
  const columnIds = getVisibleColumnsIds(columns);
26
29
 
@@ -22,14 +22,20 @@ export const TableItemActions: FC<{ tableDataItem: ITableDataItem }> = ({
22
22
  {dataActions.isEditable && (
23
23
  <IconButton
24
24
  icon={faPen}
25
- onClick={() => editable?.setSelectedItem(tableDataItem.item ?? null)}
25
+ onClick={e => {
26
+ e.stopPropagation();
27
+ editable?.setSelectedItem(tableDataItem.item ?? null);
28
+ }}
26
29
  size="s"
27
30
  />
28
31
  )}
29
32
  {dataActions.isDeletable && (
30
33
  <IconButton
31
34
  icon={faTrashCan}
32
- onClick={() => dataActions.delete?.onClick?.(tableDataItem.uuid)}
35
+ onClick={e => {
36
+ e.stopPropagation();
37
+ dataActions.delete?.onClick?.(tableDataItem.uuid);
38
+ }}
33
39
  size="s"
34
40
  color="danger"
35
41
  />
@@ -45,7 +51,10 @@ export const TableItemActions: FC<{ tableDataItem: ITableDataItem }> = ({
45
51
  ref={ref}
46
52
  icon={faEllipsisVertical}
47
53
  active={isMenuOpen}
48
- onClick={onMenuOpen}
54
+ onClick={e => {
55
+ e.stopPropagation();
56
+ onMenuOpen();
57
+ }}
49
58
  size="s"
50
59
  />
51
60
  )}
@@ -15,7 +15,10 @@ import { ProgressBar } from '../../../Loader/ProgressBar';
15
15
  export const TablePrint: FC = () => {
16
16
  const { t } = useTranslation();
17
17
  useHideZendesk();
18
- const { columns, printData } = useTableContext();
18
+ const {
19
+ columnData: { columns },
20
+ printData,
21
+ } = useTableContext();
19
22
 
20
23
  const {
21
24
  label,
@@ -1,4 +1,4 @@
1
- import { useState, type FC } from 'react';
1
+ import { useEffect, useState, type FC } from 'react';
2
2
  import { Menu } from '../../../Menu/Menu';
3
3
  import { Tooltip } from '../../../Tooltip/Tooltip';
4
4
  import { IconButton } from '../../../Button/IconButton';
@@ -15,6 +15,24 @@ export const TableSort: FC = () => {
15
15
  const { sortData } = useTableContext();
16
16
  const { sort, setSort, sortOptions } = sortData ?? {};
17
17
 
18
+ useEffect(() => {
19
+ if (isOpen) {
20
+ const handleKeyDown = (event: KeyboardEvent) => {
21
+ event.stopPropagation();
22
+ if (event.key === 'Escape') {
23
+ event.preventDefault();
24
+ event.stopPropagation();
25
+ setIsOpen(false);
26
+ }
27
+ };
28
+
29
+ document.addEventListener('keydown', handleKeyDown);
30
+ return () => {
31
+ document.removeEventListener('keydown', handleKeyDown);
32
+ };
33
+ }
34
+ }, [isOpen]);
35
+
18
36
  return sortData ? (
19
37
  <Menu
20
38
  isOpen={isOpen}
@@ -1,81 +1,92 @@
1
- import { useState, type FC } from 'react';
1
+ import { type FC } from 'react';
2
2
  import { IconButton } from '../../../Button/IconButton';
3
3
  import { useTranslation } from 'react-i18next';
4
4
  import { useTableContext } from '../../contexts/TableContext';
5
- import { faBookmark, faBookmarkSlash } from '../../../../assets/icons';
6
- import { usePopupControl } from '../../../../hooks/usePopupControl';
5
+ import { faBookmark, faBookmarkSlash, faTrashCan } from '../../../../assets/icons';
7
6
  import { Pullover } from '../../../Pullover/Pullover';
7
+ import { List } from '../../../List/List';
8
+ import { setTemplateData } from '../../../../utils/tableUtils';
8
9
 
9
10
  export const TableTemplates: FC = () => {
10
11
  const { t } = useTranslation();
11
- const { templates } = useTableContext();
12
- const { control, onClose, onOpen } = usePopupControl();
12
+ const { templateData, columnData, filterData, sortData } = useTableContext();
13
+
14
+ if (!templateData) return null;
13
15
 
14
16
  return (
15
17
  <>
16
18
  <IconButton
17
19
  tooltip={t('Templates')}
18
20
  icon={faBookmark}
19
- active={control.isOpen}
20
- onClick={onOpen}
21
+ active={templateData.popupController.control.isOpen}
22
+ onClick={templateData.popupController.onOpen}
21
23
  size="s"
22
24
  variant="outlined"
23
25
  />
24
-
25
26
  <Pullover
26
- control={control}
27
+ isLoading={templateData.isLoading}
28
+ isFetching={templateData.isFetching}
29
+ control={templateData.popupController.control}
27
30
  header={{
28
31
  title: t('Templates'),
29
- onSearch: templates?.setSearch,
32
+ onSearch: templateData.setSearch,
30
33
  }}
31
- // onFormSubmit={() => {
32
- // const data = deleteEmptyPropsIncludingArray(searchData);
33
- // onSearch?.(excludeFromSearch ? deleteProps(data, excludeFromSearch) : data);
34
- // onClose();
35
- // }}
36
34
  footer={{
37
35
  confirmButton: {
38
- label: t('ApplyTemplate'),
39
- type: 'submit',
36
+ label: t('CreateTemplate'),
37
+ onClick: templateData.initiateCreate,
38
+ splitActions: [
39
+ {
40
+ label: t('CreateDefaultTemplate'),
41
+ icon: faBookmark,
42
+ onClick: templateData.initiateCreateDefault,
43
+ },
44
+ ],
40
45
  },
41
46
  additionalButton: {
42
47
  label: t('ResetTemplate'),
43
48
  icon: faBookmarkSlash,
44
49
  onClick: () => {
45
- // setSearchData?.(defaultSearch);
46
- // onSearch?.(defaultSearch);
47
- // onClose();
50
+ columnData?.setColumns?.(columnData.defaultColumns);
51
+ filterData?.setSearchData(filterData.defaultSearch ?? {});
52
+ filterData?.onSearch(filterData.defaultSearch ?? {});
53
+ sortData?.setSort('');
54
+ templateData.popupController.onClose();
48
55
  },
49
- // disabled: defaultSearch
50
- // ? JSON.stringify(searchData) === JSON.stringify(defaultSearch)
51
- // : Object.keys(searchData).length === 0,
52
56
  },
53
57
  }}
54
- // contentClassName="iui-filters-list"
55
- onCloseCallback={() => templates?.setSearch?.('')}
58
+ onCloseCallback={() => templateData.setSearch?.('')}
56
59
  size="w600"
57
60
  >
58
- Templates
59
- {templates?.items.map(item => (
60
- <div key={item.uuid}>{item.name}</div>
61
- ))}
61
+ <List
62
+ items={templateData.items.map(item => ({
63
+ id: item.uuid,
64
+ label: item.name,
65
+ desc: item.isPublic ? t('PublicTemplate') : t('PrivateTemplate'),
66
+ onClick: () => {
67
+ setTemplateData({
68
+ template: item,
69
+ columnData,
70
+ setFilters: e => {
71
+ filterData?.setSearchData(e);
72
+ filterData?.onSearch(e);
73
+ },
74
+ setSort: sortData?.setSort,
75
+ });
76
+ templateData.popupController.onClose();
77
+ },
78
+ actions: [
79
+ {
80
+ icon: faTrashCan,
81
+ onClick: () => templateData.setItemToDeleteUuids([item.uuid]),
82
+ color: 'danger',
83
+ },
84
+ ],
85
+ }))}
86
+ noItemsMessage={t('NoTemplatesAvailable')}
87
+ />
62
88
  </Pullover>
89
+ {templateData.TemplateNode}
63
90
  </>
64
- // <Menu
65
- // isOpen={isMenuOpen}
66
- // onClose={onMenuClose}
67
- // renderButton={ref => (
68
- // <Tooltip label={t('Templates')} ref={ref}>
69
- // <IconButton
70
- // icon={faBookmark}
71
- // active={isMenuOpen}
72
- // onClick={onMenuOpen}
73
- // size="s"
74
- // variant="outlined"
75
- // />
76
- // </Tooltip>
77
- // )}
78
- // items={templates?.menuItems}
79
- // />
80
91
  );
81
92
  };
@@ -10,17 +10,17 @@ import {
10
10
  import {
11
11
  IPaginationControl,
12
12
  ITable,
13
- ITableColumn,
13
+ ITableColumnsData,
14
14
  ITableEdit,
15
- ITableSelectedActions,
15
+ ITableSelectedAction,
16
16
  } from '../../../types/ITable';
17
17
  import { useLocalTablePagination } from '../hooks/localHooks/useLocalTablePagination';
18
18
  import { useLocalTableColumns } from '../hooks/localHooks/useLocalTableColumns';
19
19
  import { useLocalTableData } from '../hooks/localHooks/useLocalTableData';
20
20
 
21
21
  interface ITableContext extends ITable {
22
- setColumns: (columns: ITableColumn[]) => void;
23
- selectActions: ITableSelectedActions[];
22
+ columnData: ITableColumnsData;
23
+ selectActions: ITableSelectedAction[];
24
24
  dataActions?: ITable['dataActions'] & {
25
25
  hasItemActions: boolean;
26
26
  isEditable: boolean;
@@ -37,10 +37,9 @@ interface ITableContext extends ITable {
37
37
  }
38
38
 
39
39
  const TableContext = createContext<ITableContext>({
40
- setColumns: () => {},
41
- selectActions: [],
40
+ columnData: { columns: [], defaultColumns: [] },
42
41
  data: [],
43
- columns: [],
42
+ selectActions: [],
44
43
  });
45
44
 
46
45
  interface Props extends ITable {
@@ -48,18 +47,17 @@ interface Props extends ITable {
48
47
  }
49
48
 
50
49
  export const TableProvider = ({
51
- columns: initialColumns,
50
+ columnData,
52
51
  data: initialData,
53
52
  dataActions,
54
53
  editable,
55
54
  footer,
56
55
  children,
56
+ rowSelect,
57
57
  ...rest
58
58
  }: Props) => {
59
59
  const [isAdding, setIsAdding] = useState(false);
60
60
 
61
- const { rowSelect } = rest;
62
-
63
61
  const selectActions = useMemo(
64
62
  () => rowSelect?.actions.filter(e => !e.hidden) || [],
65
63
  [rowSelect?.actions]
@@ -80,17 +78,16 @@ export const TableProvider = ({
80
78
  const localPagination = useLocalTablePagination({
81
79
  defaultLimit: footer?.customPagination?.defaultLimit,
82
80
  });
83
-
84
- const { data } = useLocalTableData({
81
+ const data = useLocalTableData({
85
82
  initialData,
86
83
  localPagination,
87
84
  controledPagination: !!footer?.paginationControl,
88
- dataActions,
85
+ dataActions: updatedDataActions,
89
86
  rowSelect,
90
87
  });
91
88
 
92
- const { columns, setColumns } = useLocalTableColumns({
93
- initialColumns,
89
+ useLocalTableColumns({
90
+ columnData,
94
91
  hasSelect: selectActions.length > 0,
95
92
  data,
96
93
  rowSelect,
@@ -101,8 +98,7 @@ export const TableProvider = ({
101
98
  ...rest,
102
99
  data,
103
100
  dataActions: updatedDataActions,
104
- columns,
105
- setColumns,
101
+ columnData,
106
102
  selectActions,
107
103
  };
108
104
 
@@ -1,10 +1,10 @@
1
- import { useEffect, useState } from 'react';
2
- import { ITable, ITableColumn } from '../../../../types/ITable';
1
+ import { useEffect } from 'react';
2
+ import { ITable, ITableColumn, ITableColumnsData } from '../../../../types/ITable';
3
3
  import { useTranslation } from 'react-i18next';
4
4
  import { Checkbox } from '../../../Inputs/Checkbox';
5
5
 
6
6
  interface Props {
7
- initialColumns: ITableColumn[];
7
+ columnData: ITableColumnsData;
8
8
  hasSelect: boolean;
9
9
  data: ITable['data'];
10
10
  rowSelect: ITable['rowSelect'];
@@ -12,17 +12,17 @@ interface Props {
12
12
  }
13
13
 
14
14
  export const useLocalTableColumns = ({
15
- initialColumns,
15
+ columnData: { defaultColumns, setColumns },
16
16
  hasSelect,
17
17
  data,
18
18
  rowSelect,
19
19
  hasItemActions,
20
20
  }: Props) => {
21
- const [columns, setColumns] = useState<ITableColumn[]>([]);
22
21
  const { t } = useTranslation();
23
22
 
24
23
  useEffect(() => {
25
- const activeColumns = initialColumns.filter(e => !e.hidden && !e.unavailable);
24
+ const activeColumns = defaultColumns.filter(e => !e.hidden && !e.unavailable);
25
+ // const activeColumns = defaultColumns.filter(e => !e.unavailable);
26
26
 
27
27
  let newCols: ITableColumn[] = [];
28
28
 
@@ -66,8 +66,6 @@ export const useLocalTableColumns = ({
66
66
  className: 'actions-col',
67
67
  });
68
68
 
69
- setColumns(newCols);
70
- }, [initialColumns, hasSelect, data, rowSelect, hasItemActions, t]);
71
-
72
- return { columns, setColumns };
69
+ setColumns?.(newCols);
70
+ }, [defaultColumns, setColumns, hasSelect, data, rowSelect, hasItemActions, t]);
73
71
  };
@@ -74,5 +74,5 @@ export const useLocalTableData = ({
74
74
  dataActions,
75
75
  ]);
76
76
 
77
- return { data };
77
+ return data;
78
78
  };
@@ -0,0 +1,28 @@
1
+ import { useEffect, useMemo, useState } from 'react';
2
+ import { ITableColumn, ITableColumnsData } from '../../../types/ITable';
3
+
4
+ export interface ITableColumnsProps {
5
+ defaultColumns: ITableColumn[];
6
+ templateColumns?: ITableColumn[];
7
+ }
8
+
9
+ export const useTableColumns = ({
10
+ defaultColumns,
11
+ templateColumns,
12
+ }: ITableColumnsProps): ITableColumnsData => {
13
+ const [columns, setColumns] = useState<ITableColumn[]>(defaultColumns);
14
+
15
+ useEffect(() => {
16
+ setColumns(defaultColumns);
17
+ }, [defaultColumns, templateColumns]);
18
+
19
+ const columnData = useMemo(
20
+ () => ({
21
+ defaultColumns,
22
+ columns,
23
+ setColumns,
24
+ }),
25
+ [defaultColumns, columns]
26
+ );
27
+ return columnData;
28
+ };