@inceptionbg/iui 2.0.15 → 2.0.17

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 (76) hide show
  1. package/dist/NoAccessPage-BmizYfw0.js +2 -0
  2. package/dist/{NoAccessPage-DBq5IzIf.js.map → NoAccessPage-BmizYfw0.js.map} +1 -1
  3. package/dist/NotFoundPage-Cv544vAr.js +2 -0
  4. package/dist/{NotFoundPage-DM-I96ar.js.map → NotFoundPage-Cv544vAr.js.map} +1 -1
  5. package/dist/index.d.ts +160 -91
  6. package/dist/index.js +1 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/iui.css +1 -1
  9. package/package.json +4 -7
  10. package/src/assets/icons/duotone/faBell.ts +17 -0
  11. package/src/assets/icons/duotone/faPen.ts +18 -0
  12. package/src/assets/icons/duotone/faTrashCan.ts +18 -0
  13. package/src/assets/icons/light/faBell.ts +15 -0
  14. package/src/assets/icons/light/faEnvelope.ts +15 -0
  15. package/src/assets/icons/regular/faEllipsisVertical.ts +15 -0
  16. package/src/assets/icons/solid/faEnvelopeDot.ts +15 -0
  17. package/src/components/Button/SplitButton.tsx +5 -5
  18. package/src/components/Dialog/Dialog.tsx +3 -3
  19. package/src/components/Header/Components/ModuleSelect.tsx +5 -5
  20. package/src/components/Header/Components/Notifications.tsx +208 -0
  21. package/src/components/Header/Components/UserMenu.tsx +15 -14
  22. package/src/components/Header/Header.tsx +5 -4
  23. package/src/components/Inputs/NumberInput.tsx +3 -0
  24. package/src/components/Inputs/Selects/components/SelectWrapper.tsx +48 -29
  25. package/src/components/Inputs/TextInput.tsx +1 -0
  26. package/src/components/List/ListItem.tsx +1 -1
  27. package/src/components/Loader/ProgressBar.tsx +1 -1
  28. package/src/components/Menu/Menu.tsx +3 -0
  29. package/src/components/Pullover/Pullover.tsx +38 -39
  30. package/src/components/Table/Table.tsx +23 -32
  31. package/{idea/Table/Components/Columns → src/components/Table/components/columns}/ColumnsList.tsx +12 -14
  32. package/src/components/Table/components/columns/TableColumnsEdit.tsx +112 -0
  33. package/src/components/Table/components/edit/TableEditRow.tsx +26 -21
  34. package/src/components/Table/components/header/TableHeaderRow.tsx +2 -1
  35. package/src/components/Table/components/items/TableItemActions.tsx +18 -13
  36. package/src/components/Table/components/print/TablePrint.tsx +1 -5
  37. package/src/components/Table/components/templates/CreateTemplateDialog.tsx +48 -0
  38. package/src/components/Table/components/templates/TableTemplates.tsx +24 -4
  39. package/src/components/Table/contexts/TableContext.tsx +34 -33
  40. package/src/components/Table/hooks/localHooks/useLocalTableColumns.tsx +27 -28
  41. package/src/components/Table/hooks/localHooks/useLocalTableData.tsx +17 -11
  42. package/src/components/Table/hooks/localHooks/useLocalTableKeyboard.ts +8 -6
  43. package/src/components/Table/hooks/useTableColumns.ts +16 -10
  44. package/src/components/Table/hooks/useTableEdit.tsx +24 -2
  45. package/src/components/Table/hooks/useTablePrint.ts +12 -4
  46. package/src/components/Table/hooks/useTableSelect.ts +1 -1
  47. package/src/components/Tabs/Tabs.tsx +1 -0
  48. package/src/components/Tooltip/Tooltip.tsx +81 -14
  49. package/src/hooks/useIsMenuOpen.ts +3 -3
  50. package/src/hooks/usePopupControl.ts +9 -4
  51. package/src/index.ts +24 -5
  52. package/src/styles/App.scss +1 -0
  53. package/src/styles/components/_badge.scss +8 -1
  54. package/src/styles/components/_header.scss +18 -8
  55. package/src/styles/components/_list.scss +1 -1
  56. package/src/styles/components/_notifications.scss +71 -0
  57. package/src/styles/components/_page.scss +1 -0
  58. package/src/styles/components/_pullover.scss +1 -1
  59. package/src/styles/components/_sidebar.scss +1 -3
  60. package/src/styles/components/_table.scss +110 -57
  61. package/src/styles/variables/_variables.scss +9 -0
  62. package/src/types/IHeader.ts +1 -1
  63. package/src/types/IKeyboard.ts +0 -5
  64. package/src/types/IMenu.ts +2 -2
  65. package/src/types/INotifications.ts +15 -0
  66. package/src/types/IPopup.ts +2 -2
  67. package/src/types/ITable.ts +36 -32
  68. package/src/utils/i18n/i18nIUICyrilic.ts +12 -0
  69. package/src/utils/i18n/i18nIUILatin.ts +13 -0
  70. package/src/utils/i18n/i18nIUIMe.ts +12 -0
  71. package/src/utils/objectUtils.ts +19 -0
  72. package/src/utils/tableUtils.ts +1 -1
  73. package/dist/NoAccessPage-DBq5IzIf.js +0 -2
  74. package/dist/NotFoundPage-DM-I96ar.js +0 -2
  75. package/idea/Notifications.tsx +0 -245
  76. package/idea/Table/Components/Columns/SetColumnsList.tsx +0 -113
@@ -17,10 +17,12 @@ import { TableFilters } from './components/filters/TableFilters';
17
17
  import { TableEditRow } from './components/edit/TableEditRow';
18
18
  import { TablePrint } from './components/print/TablePrint';
19
19
  import { TableTemplates } from './components/templates/TableTemplates';
20
+ import { TableColumnsEdit } from './components/columns/TableColumnsEdit';
21
+ import { useLocalTableColumns } from './hooks/localHooks/useLocalTableColumns';
20
22
 
21
23
  export const TableContent: FC = () => {
22
24
  const {
23
- columnData: { columns },
25
+ columnData,
24
26
  customHeader,
25
27
  headerWrap,
26
28
  data,
@@ -39,12 +41,15 @@ export const TableContent: FC = () => {
39
41
  const [extendedRow, setExtendedRow] = useState('');
40
42
 
41
43
  const { t } = useTranslation();
44
+ const { visibleColumns } = useLocalTableColumns();
42
45
  const { focusedRow } = useLocalTableKeyboard();
46
+
43
47
  const noTotalRows = footer?.totalRows === undefined;
44
48
 
45
49
  return (
46
50
  <Loader isLoading={!!isLoading}>
47
51
  <div
52
+ id={props.id}
48
53
  // onKeyDown={handleKeyDown}
49
54
  className={clsx('iui-table', props.className, {
50
55
  'pb-3': data.length === 0,
@@ -52,28 +57,9 @@ export const TableContent: FC = () => {
52
57
  // tabIndex={-1}
53
58
  >
54
59
  <div className="iui-table-header-actions">
55
- {/* {(!!filterData ||
56
- !!sortData ||
57
- !!setColumns ||
58
- !!printData ||
59
- !!customPrintData) && (
60
- <TableOptions
61
- columns={cols}
62
- columnsData={
63
- setColumns
64
- ? { columns, setColumns, withSearch: withColumnsSearch }
65
- : undefined
66
- }
67
- filterData={filterData}
68
- sortData={sortData}
69
- printData={printData}
70
- customPrintData={customPrintData}
71
- templates={templates}
72
- additionsalOptions={additionsalOptions}
73
- />
74
- )} */}
75
60
  {props.selectActions.length > 0 && <TableSelect />}
76
61
  {props.filterData && <TableFilters />}
62
+ {!!columnData.setColumns && <TableColumnsEdit />}
77
63
  {props.sortData && <TableSort />}
78
64
  {props.templateData && <TableTemplates />}
79
65
  {props.printData && <TablePrint />}
@@ -100,7 +86,7 @@ export const TableContent: FC = () => {
100
86
  >
101
87
  <table className="full-width">
102
88
  <HeaderTable
103
- columns={columns}
89
+ columns={visibleColumns}
104
90
  customHeader={customHeader}
105
91
  headerWrap={headerWrap}
106
92
  maxHeight={maxHeight}
@@ -117,7 +103,7 @@ export const TableContent: FC = () => {
117
103
  <Fragment key={row.uuid}>
118
104
  {/* ////// EDITABLE ROW ////// */}
119
105
  {!!editable && row.uuid === editable.selectedItem?.uuid ? (
120
- <TableEditRow />
106
+ <TableEditRow columns={visibleColumns} />
121
107
  ) : (
122
108
  ////// REGULAR ROW //////
123
109
  <tr
@@ -137,7 +123,7 @@ export const TableContent: FC = () => {
137
123
  );
138
124
  }}
139
125
  >
140
- {columns.map(column => {
126
+ {visibleColumns.map(column => {
141
127
  const cell = row.cells[column.id];
142
128
  return (
143
129
  <Tooltip
@@ -169,8 +155,9 @@ export const TableContent: FC = () => {
169
155
  cell?.className,
170
156
  rowHeight,
171
157
  {
158
+ 'sticky-column': column.sticky,
172
159
  link: cell?.link,
173
- 'clickable-column': cell?.onClick,
160
+ 'clickable-cell': cell?.onClick,
174
161
  'word-break': column.break,
175
162
  }
176
163
  )}
@@ -186,7 +173,7 @@ export const TableContent: FC = () => {
186
173
  {/* ////// EXTENDABLE ROW ////// */}
187
174
  {isExtended && (
188
175
  <tr>
189
- <td colSpan={columns.length} className={rowHeight}>
176
+ <td colSpan={visibleColumns.length} className={rowHeight}>
190
177
  {row.extendable!.element}
191
178
  </td>
192
179
  </tr>
@@ -197,7 +184,7 @@ export const TableContent: FC = () => {
197
184
  </>
198
185
  ) : (
199
186
  <tr>
200
- <td colSpan={columns.length}>{t('NoResults')}</td>
187
+ <td colSpan={visibleColumns.length}>{t('NoResults')}</td>
201
188
  </tr>
202
189
  )}
203
190
  </tbody>
@@ -214,7 +201,10 @@ export const TableContent: FC = () => {
214
201
  })}
215
202
  onClick={() => editable.setIsAdding(true)}
216
203
  >
217
- <td className={`text-center ${rowHeight}`} colSpan={columns.length}>
204
+ <td
205
+ className={`text-center ${rowHeight}`}
206
+ colSpan={visibleColumns.length}
207
+ >
218
208
  <div className="flex center gap-2">
219
209
  <FontAwesomeIcon icon={faPlus} className="c-primary icon24" />
220
210
  <p>{editable.addLabel || t('AddItem')}</p>
@@ -222,13 +212,13 @@ export const TableContent: FC = () => {
222
212
  </td>
223
213
  </tr>
224
214
  ) : (
225
- <TableEditRow />
215
+ <TableEditRow columns={visibleColumns} />
226
216
  ))}
227
217
  {!!sumRows &&
228
218
  !!data.length &&
229
219
  sumRows.map(row => (
230
220
  <tr key={row.uuid}>
231
- {columns.map(({ id: columnId }) => (
221
+ {visibleColumns.map(({ id: columnId }) => (
232
222
  <td
233
223
  key={columnId}
234
224
  align={row.cells[columnId]?.align || 'right'}
@@ -260,8 +250,9 @@ export const TableContent: FC = () => {
260
250
  );
261
251
  };
262
252
 
263
- export const Table: FC<ITable> = props => (
264
- <TableProvider {...props}>
253
+ export const Table = <T,>(props: ITable<T>) => (
254
+ <TableProvider<T> {...props}>
265
255
  <TableContent />
256
+ {props.itemDeleteData?.DeleteDialog}
266
257
  </TableProvider>
267
258
  );
@@ -1,7 +1,7 @@
1
- import { FC, useEffect, useState } from 'react';
2
- import { ITableColumn } from '../../../../types/ITable';
3
- import { Draggable, Droppable } from 'react-beautiful-dnd';
1
+ import { useEffect, useState, type FC } from 'react';
2
+ import { Draggable, Droppable } from '@hello-pangea/dnd';
4
3
  import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
4
+ import { ITableColumn } from '../../../../types/ITable';
5
5
  import { faGripDotsVertical } from '../../../../assets/icons/solid/faGripDotsVertical';
6
6
 
7
7
  interface Props {
@@ -14,30 +14,28 @@ export const ColumnsList: FC<Props> = ({ id, items, search }) => {
14
14
  const [filteredItems, setFilteredItems] = useState<ITableColumn[]>([]);
15
15
 
16
16
  useEffect(() => {
17
- search.length &&
17
+ if (search.length) {
18
18
  setFilteredItems(
19
19
  items.filter(e =>
20
- (typeof e.label === 'string' ? e.label : e.labelForFilter ?? '')
20
+ (typeof e.label === 'string' ? e.label : (e.labelForFilter ?? ''))
21
21
  .toLocaleLowerCase()
22
22
  .includes(search.toLocaleLowerCase())
23
23
  )
24
24
  );
25
+ }
25
26
  }, [search, items]);
26
27
 
28
+ const list = search.length ? filteredItems : items;
29
+
27
30
  return (
28
31
  <Droppable droppableId={id}>
29
32
  {({ droppableProps, innerRef, placeholder }) => (
30
33
  <div {...droppableProps} ref={innerRef} className="list-box">
31
- {(search.length ? filteredItems : items).map(c => (
32
- <Draggable
33
- key={c.id}
34
- draggableId={c.id}
35
- index={items.indexOf(c)}
36
- isDragDisabled
37
- >
38
- {({ innerRef, draggableProps, dragHandleProps }) => (
34
+ {list.map(c => (
35
+ <Draggable key={c.id} draggableId={c.id} index={items.indexOf(c)}>
36
+ {({ innerRef, draggableProps, dragHandleProps }, snapshot) => (
39
37
  <div
40
- className="item"
38
+ className={`item ${snapshot.isDragging ? 'dragging' : ''}`}
41
39
  ref={innerRef}
42
40
  {...draggableProps}
43
41
  {...dragHandleProps}
@@ -0,0 +1,112 @@
1
+ import { FC, useEffect, useState } from 'react';
2
+ import { DragDropContext, DropResult } from '@hello-pangea/dnd';
3
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
4
+ import { ITableColumn } from '../../../../types/ITable';
5
+ import { faArrowRightArrowLeft } from '../../../../assets/icons/regular/faArrowRightArrowLeft';
6
+ import { useTranslation } from 'react-i18next';
7
+ import { ColumnsList } from './ColumnsList';
8
+ import { SearchInput } from '../../../Inputs/SearchInput';
9
+ import { Pullover } from '../../../Pullover/Pullover';
10
+ import { useTableContext } from '../../contexts/TableContext';
11
+ import { usePopupControl } from '../../../../hooks/usePopupControl';
12
+ import { IconButton } from '../../../Button/IconButton';
13
+ import { faLineColumns } from '../../../../assets/icons/light/faLineColumns';
14
+
15
+ export const TableColumnsEdit: FC = () => {
16
+ const [hidden, setHidden] = useState<ITableColumn[]>([]);
17
+ const [visible, setVisible] = useState<ITableColumn[]>([]);
18
+ const [searchHidden, setSearchHidden] = useState('');
19
+ const [searchVisible, setSearchVisible] = useState('');
20
+
21
+ const { t } = useTranslation();
22
+ const {
23
+ columnData: { columns, setColumns },
24
+ } = useTableContext();
25
+ const { control, onClose, onOpen } = usePopupControl();
26
+
27
+ useEffect(() => {
28
+ if (control.isOpen) {
29
+ let hiddenCols: ITableColumn[] = [];
30
+ let visibleCols: ITableColumn[] = [];
31
+ columns.forEach(col =>
32
+ !!col.hidden ? hiddenCols.push(col) : visibleCols.push(col)
33
+ );
34
+ setHidden(hiddenCols);
35
+ setVisible(visibleCols);
36
+ }
37
+ }, [control.isOpen, columns]);
38
+
39
+ const onDragEnd = ({ source, destination }: DropResult) => {
40
+ if (!destination) return;
41
+ const hiddenCols = [...hidden];
42
+ const visibleCols = [...visible];
43
+ const destinationIsHidden = destination.droppableId === 'hidden';
44
+
45
+ const sourceList = source.droppableId === 'hidden' ? hiddenCols : visibleCols;
46
+ const destinationList = destinationIsHidden ? hiddenCols : visibleCols;
47
+
48
+ const [removed] = sourceList.splice(source.index, 1);
49
+ destinationList.splice(destination.index, 0, removed);
50
+ if (source.droppableId !== destination.droppableId) {
51
+ destinationList[destination.index].hidden = destinationIsHidden;
52
+ setHidden(hiddenCols);
53
+ setVisible(visibleCols);
54
+ } else {
55
+ destinationIsHidden ? setHidden(hiddenCols) : setVisible(visibleCols);
56
+ }
57
+ };
58
+
59
+ const onSubmit = () => {
60
+ if (setColumns) {
61
+ const newColumns = [...visible, ...hidden];
62
+ setColumns(newColumns);
63
+ onClose();
64
+ }
65
+ };
66
+
67
+ return (
68
+ <>
69
+ <IconButton
70
+ tooltip={t('Columns')}
71
+ icon={faLineColumns}
72
+ active={control.isOpen}
73
+ onClick={onOpen}
74
+ size="s"
75
+ variant="outlined"
76
+ />
77
+
78
+ <DragDropContext onDragEnd={onDragEnd}>
79
+ <Pullover
80
+ control={control}
81
+ header={{ title: t('Columns') }}
82
+ className="column-pullover"
83
+ footer={{
84
+ confirmButton: {
85
+ label: t('Confirm'),
86
+ onClick: onSubmit,
87
+ },
88
+ }}
89
+ >
90
+ <div className="dual-list-container">
91
+ <p className="pb-3">{t('DragDropListsInfo')}</p>
92
+ <div className="dual-list-content">
93
+ <p className="bold ml-2">{t('HiddenColumns')}:</p>
94
+ <div />
95
+ <p className="bold ml-2">{t('SelectedColumns')}:</p>
96
+
97
+ <SearchInput onSearch={setSearchHidden} />
98
+ <div />
99
+ <SearchInput onSearch={setSearchVisible} />
100
+
101
+ <ColumnsList id="hidden" items={hidden} search={searchHidden} />
102
+ <div className="exchange-icon">
103
+ <FontAwesomeIcon icon={faArrowRightArrowLeft} />
104
+ </div>
105
+ <ColumnsList id="visible" items={visible} search={searchVisible} />
106
+ </div>
107
+ </div>
108
+ </Pullover>
109
+ </DragDropContext>
110
+ </>
111
+ );
112
+ };
@@ -1,15 +1,13 @@
1
1
  import { FC, useEffect, useRef } from 'react';
2
- import { ITableDataItem } from '../../../../types/ITable';
2
+ import { ITableColumn, ITableDataItem } from '../../../../types/ITable';
3
3
  import { IconButton } from '../../../Button/IconButton';
4
4
  import { faCheck, faXmark } from '../../../../assets/icons';
5
5
  import { useTableContext } from '../../contexts/TableContext';
6
6
  import { useGetFocusableElements } from '../../../../hooks/useGetFocusableElements';
7
+ import clsx from 'clsx';
7
8
 
8
- export const TableEditRow: FC = () => {
9
- const {
10
- columnData: { columns },
11
- editable,
12
- } = useTableContext();
9
+ export const TableEditRow: FC<{ columns: ITableColumn[] }> = ({ columns }) => {
10
+ const { editable } = useTableContext();
13
11
 
14
12
  const elementRef = useRef(null);
15
13
 
@@ -23,7 +21,9 @@ export const TableEditRow: FC = () => {
23
21
  }, [focusableElements]);
24
22
 
25
23
  useEffect(() => {
26
- editable!.setEditData(editable!.selectedItem ?? editable!.defaultDataValue ?? {});
24
+ editable!.setEditData(
25
+ editable!.selectedItem?.item ?? editable!.defaultDataValue ?? {}
26
+ );
27
27
  // eslint-disable-next-line
28
28
  }, [editable?.setEditData, editable?.selectedItem, editable?.defaultDataValue]);
29
29
 
@@ -50,23 +50,28 @@ export const TableEditRow: FC = () => {
50
50
  },
51
51
  };
52
52
 
53
- const rowData: ITableDataItem = { uuid: editable?.selectedItem?.uuid, cells: rowCells };
53
+ const rowData: ITableDataItem = {
54
+ uuid: editable?.selectedItem?.uuid as string,
55
+ cells: rowCells,
56
+ };
54
57
 
55
58
  return (
56
59
  <tr ref={elementRef} data-id={rowData.uuid} className="edit-row">
57
- {columns.map(
58
- column =>
59
- !column.hidden && (
60
- <td
61
- key={column.id}
62
- align={column.align}
63
- colSpan={rowData.cells[column.id]?.span}
64
- className={rowData.cells[column.id]?.className}
65
- >
66
- {rowData.cells[column.id]?.value ?? ''}
67
- </td>
68
- )
69
- )}
60
+ {columns.map(column => {
61
+ const item = rowData.cells[column.id];
62
+ return (
63
+ <td
64
+ key={column.id}
65
+ align={column.align}
66
+ colSpan={item?.span}
67
+ className={clsx(item?.className, {
68
+ editable: typeof item?.value === 'object',
69
+ })}
70
+ >
71
+ {item?.value ?? ''}
72
+ </td>
73
+ );
74
+ })}
70
75
  </tr>
71
76
  );
72
77
  };
@@ -23,6 +23,7 @@ export const TableHeaderRow: FC<Props> = ({ row, print }) => {
23
23
  print
24
24
  ? undefined
25
25
  : clsx(col.color, col.className, {
26
+ 'sticky-column': col.sticky,
26
27
  'not-first-cell': col.notFirstCell,
27
28
  })
28
29
  }
@@ -40,7 +41,7 @@ export const TableHeaderRow: FC<Props> = ({ row, print }) => {
40
41
  ? { width: col.width }
41
42
  : undefined
42
43
  }
43
- hidden={col.hidden}
44
+ // hidden={col.hidden}
44
45
  >
45
46
  <div className="flex align-center">
46
47
  {typeof col.label === 'string' ? (
@@ -2,16 +2,20 @@ import { type FC } from 'react';
2
2
  import { useTableContext } from '../../contexts/TableContext';
3
3
  import { IconButton } from '../../../Button/IconButton';
4
4
  import { faEllipsisVertical, faPen, faTrashCan } from '../../../../assets/icons';
5
+ // TO CONSIDER
6
+ // import { faPen } from '../../../../assets/icons/duotone/faPen';
7
+ // import { faTrashCan } from '../../../../assets/icons/duotone/faTrashCan';
8
+ // import { faEllipsisVertical } from '../../../../assets/icons/regular/faEllipsisVertical';
5
9
  import { useIsMenuOpen } from '../../../../hooks/useIsMenuOpen';
6
10
  import { Menu } from '../../../Menu/Menu';
7
11
  import { ITableDataItem } from '../../../../types/ITable';
8
12
 
9
- export const TableItemActions: FC<{ tableDataItem: ITableDataItem }> = ({
13
+ export const TableItemActions: FC<{ tableDataItem: ITableDataItem<any> }> = ({
10
14
  tableDataItem,
11
15
  }) => {
12
- const { isMenuOpen, onMenuClose, onMenuOpen } = useIsMenuOpen();
16
+ const { isOpen, onClose, onOpen } = useIsMenuOpen();
13
17
 
14
- const { dataActions, editable } = useTableContext();
18
+ const { dataActions, itemDeleteData, editable } = useTableContext();
15
19
 
16
20
  if (!dataActions?.hasItemActions) {
17
21
  return null;
@@ -24,7 +28,7 @@ export const TableItemActions: FC<{ tableDataItem: ITableDataItem }> = ({
24
28
  icon={faPen}
25
29
  onClick={e => {
26
30
  e.stopPropagation();
27
- editable?.setSelectedItem(tableDataItem.item ?? null);
31
+ editable?.setSelectedItem(tableDataItem);
28
32
  }}
29
33
  size="s"
30
34
  />
@@ -34,37 +38,38 @@ export const TableItemActions: FC<{ tableDataItem: ITableDataItem }> = ({
34
38
  icon={faTrashCan}
35
39
  onClick={e => {
36
40
  e.stopPropagation();
37
- dataActions.delete?.onClick?.(tableDataItem.uuid);
41
+ itemDeleteData?.setItemToDeleteUuids([tableDataItem.uuid]);
38
42
  }}
39
43
  size="s"
40
44
  color="danger"
41
45
  />
42
46
  )}
43
47
 
44
- {!!dataActions.actions?.length && (
48
+ {!!dataActions.filteredActions?.length && (
45
49
  <Menu
46
- isOpen={isMenuOpen}
47
- onClose={onMenuClose}
50
+ isOpen={isOpen}
51
+ onClose={onClose}
48
52
  placement="bottom-right"
49
53
  renderButton={ref => (
50
54
  <IconButton
51
55
  ref={ref}
52
56
  icon={faEllipsisVertical}
53
- active={isMenuOpen}
57
+ active={isOpen}
54
58
  onClick={e => {
55
59
  e.stopPropagation();
56
- onMenuOpen();
60
+ onOpen();
57
61
  }}
58
62
  size="s"
59
63
  />
60
64
  )}
61
65
  items={
62
- dataActions.actions?.map(action => ({
66
+ dataActions.actions?.(tableDataItem.item)?.map(action => ({
63
67
  label: action.label,
64
68
  hidden: !action.hasAccess,
69
+ disabled: action.disabled,
65
70
  onClick: () => {
66
- action.onClick(tableDataItem);
67
- onMenuClose();
71
+ action.onClick();
72
+ onClose();
68
73
  },
69
74
  })) ?? []
70
75
  }
@@ -28,7 +28,6 @@ export const TablePrint: FC = () => {
28
28
  paginationControl,
29
29
  printPopupControl,
30
30
  customHeader,
31
- excludeColumnIds,
32
31
  filters,
33
32
  optionalNode,
34
33
  organization,
@@ -37,10 +36,7 @@ export const TablePrint: FC = () => {
37
36
  } = useMemo(() => (printData ?? {}) as IPrintData, [printData]);
38
37
  const { control, onOpen } = printPopupControl;
39
38
 
40
- const cols = useMemo(
41
- () => columns.filter(e => !['actions', 'select', excludeColumnIds].includes(e.id)),
42
- [columns, excludeColumnIds]
43
- );
39
+ const cols = useMemo(() => columns.filter(e => !e.hidden && !e.printHidden), [columns]);
44
40
 
45
41
  useEffect(() => {
46
42
  if (control.isOpen) {
@@ -0,0 +1,48 @@
1
+ import { useState, type FC } from 'react';
2
+ import { useTranslation } from 'react-i18next';
3
+ import type { ILocalPopupControl } from '../../../../types/IPopup';
4
+ import type { IReportTemplate } from '../../../../types/ITable';
5
+ import { Dialog } from '../../../Dialog/Dialog';
6
+ import { TextInput } from '../../../Inputs/TextInput';
7
+ import { Checkbox } from '../../../Inputs/Checkbox';
8
+ import { useTableContext } from '../../contexts/TableContext';
9
+
10
+ interface Props {
11
+ control: ILocalPopupControl;
12
+ }
13
+
14
+ export const CreateTemplateDialog: FC<Props> = ({ control }) => {
15
+ const { t } = useTranslation();
16
+ const { templateData: { createItem } = {} } = useTableContext();
17
+
18
+ const [formData, setFormData] = useState<Partial<IReportTemplate>>({});
19
+
20
+ return (
21
+ <Dialog
22
+ title={t('CreateTemplateLong')}
23
+ control={control}
24
+ onFormSubmit={() => createItem?.onCreate(formData)}
25
+ footer={{
26
+ confirmButton: {
27
+ label: t('CreateTemplate'),
28
+ type: 'submit',
29
+ },
30
+ }}
31
+ onCloseCallback={() => setFormData({})}
32
+ >
33
+ <TextInput
34
+ label={t('TemplateName')}
35
+ required
36
+ value={formData.name}
37
+ setValue={name => setFormData({ ...formData, name })}
38
+ />
39
+ {createItem?.allowPublicCreate && (
40
+ <Checkbox
41
+ label={t('PublicTemplate')}
42
+ value={formData.isPublic}
43
+ setValue={isPublic => setFormData({ ...formData, isPublic })}
44
+ />
45
+ )}
46
+ </Dialog>
47
+ );
48
+ };
@@ -1,4 +1,4 @@
1
- import { type FC } from 'react';
1
+ import { useEffect, 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';
@@ -6,11 +6,30 @@ import { faBookmark, faBookmarkSlash, faTrashCan } from '../../../../assets/icon
6
6
  import { Pullover } from '../../../Pullover/Pullover';
7
7
  import { List } from '../../../List/List';
8
8
  import { setTemplateData } from '../../../../utils/tableUtils';
9
+ import { usePopupControl } from '../../../../hooks/usePopupControl';
10
+ import { CreateTemplateDialog } from './CreateTemplateDialog';
9
11
 
10
12
  export const TableTemplates: FC = () => {
11
13
  const { t } = useTranslation();
12
14
  const { templateData, columnData, filterData, sortData } = useTableContext();
13
15
 
16
+ const createTemplatePopupController = usePopupControl();
17
+
18
+ useEffect(() => {
19
+ if (templateData?.defaultTemplate) {
20
+ setTemplateData({
21
+ template: templateData.defaultTemplate,
22
+ columnData,
23
+ setFilters: e => {
24
+ filterData?.setSearchData(e);
25
+ filterData?.onSearch(e);
26
+ },
27
+ setSort: sortData?.setSort,
28
+ });
29
+ }
30
+ // eslint-disable-next-line
31
+ }, [templateData?.defaultTemplate]);
32
+
14
33
  if (!templateData) return null;
15
34
 
16
35
  return (
@@ -34,12 +53,12 @@ export const TableTemplates: FC = () => {
34
53
  footer={{
35
54
  confirmButton: {
36
55
  label: t('CreateTemplate'),
37
- onClick: templateData.initiateCreate,
56
+ onClick: createTemplatePopupController.onOpen,
38
57
  splitActions: [
39
58
  {
40
59
  label: t('CreateDefaultTemplate'),
41
60
  icon: faBookmark,
42
- onClick: templateData.initiateCreateDefault,
61
+ onClick: templateData.createItem.onCreateDefault,
43
62
  },
44
63
  ],
45
64
  },
@@ -86,7 +105,8 @@ export const TableTemplates: FC = () => {
86
105
  noItemsMessage={t('NoTemplatesAvailable')}
87
106
  />
88
107
  </Pullover>
89
- {templateData.TemplateNode}
108
+ <CreateTemplateDialog control={createTemplatePopupController.control} />
109
+ {templateData.DeleteDialog}
90
110
  </>
91
111
  );
92
112
  };