@inceptionbg/iui 2.0.8 → 2.0.10

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 (138) hide show
  1. package/dist/icons/index.d.ts +2 -2
  2. package/dist/icons/index.js +1 -1
  3. package/dist/index.d.ts +286 -259
  4. package/dist/index.js +1 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/iui.css +1 -1
  7. package/idea/GridTable/GridTable.tsx +119 -0
  8. package/idea/GridTable/gridTable.scss +42 -0
  9. package/{src/components → idea}/Table/Components/Print/CustomTablePrint.tsx +2 -2
  10. package/{src/components → idea}/Table/Components/Print/TablePrint.tsx +2 -2
  11. package/{src/components → idea}/Table/Components/SetTableFilter.tsx +1 -1
  12. package/{src/components → idea}/Table/Components/TableOptions.tsx +4 -4
  13. package/idea/{Table2 → Table}/Table.tsx +151 -281
  14. package/idea/Table/hooks/useDefaultTemplate.ts +20 -0
  15. package/{src/components → idea}/Table/hooks/useTableKeyboard.ts +1 -2
  16. package/idea/Table/hooks/useTableSelect.ts +11 -0
  17. package/package.json +1 -1
  18. package/src/assets/icons/index.ts +1 -1
  19. package/src/assets/icons/light/faClipboardCheck.ts +15 -0
  20. package/src/assets/icons/light/faHouse.ts +15 -15
  21. package/src/assets/icons/light/faIdBadge.ts +15 -15
  22. package/src/assets/icons/light/faPen.ts +15 -0
  23. package/src/components/Button/IconButton.tsx +3 -1
  24. package/src/components/Dialog/Dialog.tsx +59 -123
  25. package/src/components/Dialog/components/DialogFooter.tsx +92 -0
  26. package/src/components/Dialog/hooks/useDialogKeyboard.ts +6 -5
  27. package/src/components/Header/Header.tsx +1 -1
  28. package/src/components/Inputs/DateInput/DateInput.tsx +108 -102
  29. package/src/components/Inputs/DateInput/components/DatePartInput.tsx +7 -3
  30. package/src/components/Inputs/InputWrapper.tsx +6 -1
  31. package/src/components/Inputs/SearchInput.tsx +9 -4
  32. package/src/components/Inputs/Select2/Select.tsx +65 -30
  33. package/src/components/Inputs/Select2/select.scss +13 -14
  34. package/src/components/Inputs/Selects/components/SelectWrapper.tsx +4 -2
  35. package/src/components/Inputs/Selects/utils/selectStyles.ts +9 -12
  36. package/src/components/Menu/Menu.tsx +10 -2
  37. package/src/components/Menu/MenuItem.tsx +11 -10
  38. package/src/components/Menu/hooks/useMenuPosition.tsx +23 -6
  39. package/src/components/Pullover/Pullover.tsx +122 -59
  40. package/src/components/Table/Table.tsx +78 -342
  41. package/src/components/Table/components/edit/TableEditRow.tsx +69 -0
  42. package/src/components/Table/components/filters/FilterItem.tsx +15 -0
  43. package/src/components/Table/components/filters/TableFilters.tsx +125 -0
  44. package/src/components/Table/components/footer/TableFooter.tsx +128 -0
  45. package/src/components/Table/components/header/TableHeader.tsx +42 -0
  46. package/src/components/Table/components/header/TableHeaderRow.tsx +47 -0
  47. package/src/components/Table/components/items/TableItemActions.tsx +66 -0
  48. package/src/components/Table/components/select/TableSelect.tsx +49 -0
  49. package/src/components/Table/components/sort/TableSort.tsx +52 -0
  50. package/src/components/Table/contexts/TableContext.tsx +123 -0
  51. package/src/components/Table/hooks/localHooks/useLocalTableColumns.tsx +73 -0
  52. package/src/components/Table/hooks/localHooks/useLocalTableData.tsx +78 -0
  53. package/src/components/Table/hooks/localHooks/useLocalTableKeyboard.ts +173 -0
  54. package/src/components/Table/hooks/localHooks/useLocalTablePagination.ts +12 -0
  55. package/src/components/Table/hooks/useTableEdit.tsx +111 -0
  56. package/src/components/Table/hooks/useTableFilterFields.tsx +150 -0
  57. package/src/components/Table/hooks/useTablePagination.ts +16 -0
  58. package/src/components/Table/hooks/useTableSearch.ts +29 -0
  59. package/src/components/Table/hooks/useTableSort.ts +8 -0
  60. package/src/components/Tooltip/Tooltip.tsx +1 -1
  61. package/src/components/Wrappers/PageLayout.tsx +9 -12
  62. package/src/hooks/useGetFocusableElements.ts +42 -0
  63. package/src/hooks/useLocalPopoverControl.ts +38 -0
  64. package/src/hooks/usePopupControl.ts +13 -0
  65. package/src/index.ts +53 -39
  66. package/src/styles/components/_accordions.scss +1 -1
  67. package/src/styles/components/_badge.scss +4 -3
  68. package/src/styles/components/_card.scss +1 -1
  69. package/src/styles/components/_dialog.scss +8 -8
  70. package/src/styles/components/_input.scss +1 -1
  71. package/src/styles/components/_inputCheckbox.scss +1 -1
  72. package/src/styles/components/_inputDateTime.scss +2 -2
  73. package/src/styles/components/_inputRadio.scss +1 -1
  74. package/src/styles/components/_inputSelect.scss +6 -4
  75. package/src/styles/components/_menu-v2.scss +1 -1
  76. package/src/styles/components/_menu.scss +23 -15
  77. package/src/styles/components/_pullover.scss +74 -18
  78. package/src/styles/components/_table.scss +151 -142
  79. package/src/styles/components/_widget.scss +1 -1
  80. package/src/styles/variables/_bp.scss +1 -0
  81. package/src/styles/variables/_variables.scss +4 -2
  82. package/src/types/IKeyboard.ts +2 -1
  83. package/src/types/IMenu.ts +1 -0
  84. package/src/types/ISelect.ts +1 -0
  85. package/src/types/ITable.ts +87 -80
  86. package/src/utils/fileUtils.ts +3 -3
  87. package/src/utils/i18n/i18nIUICyrilic.ts +4 -0
  88. package/src/utils/i18n/i18nIUILatin.ts +3 -1
  89. package/src/utils/i18n/i18nIUIMe.ts +4 -0
  90. package/src/utils/{ObjectUtils.ts → objectUtils.ts} +8 -8
  91. package/src/utils/popupUtils.ts +82 -0
  92. package/src/utils/{TableUtils.ts → tableUtils.ts} +5 -5
  93. package/src/utils/{Toasts.ts → toasts.ts} +6 -6
  94. package/src/utils/{UrlUtils.ts → urlUtils.ts} +4 -4
  95. package/idea/Table2/Components/Columns/ColumnsList.tsx +0 -56
  96. package/idea/Table2/Components/Columns/SetColumnsList.tsx +0 -107
  97. package/idea/Table2/Components/Edit/ItemActionsMenu.tsx +0 -87
  98. package/idea/Table2/Components/Edit/ItemEditOptionsButtons.tsx +0 -32
  99. package/idea/Table2/Components/Edit/TableEditRow.tsx +0 -56
  100. package/idea/Table2/Components/FilterItem.tsx +0 -20
  101. package/idea/Table2/Components/Header/TableHeader.tsx +0 -35
  102. package/idea/Table2/Components/Header/TableHeaderRow.tsx +0 -37
  103. package/idea/Table2/Components/Print/CustomTablePrint.tsx +0 -119
  104. package/idea/Table2/Components/Print/TablePrint.tsx +0 -208
  105. package/idea/Table2/Components/SetSortList.tsx +0 -33
  106. package/idea/Table2/Components/SetTableFilter.tsx +0 -90
  107. package/idea/Table2/Components/TableFooter.tsx +0 -107
  108. package/idea/Table2/Components/TableOptions.tsx +0 -211
  109. package/idea/Table2/Components/Templates/TemplateCreate.tsx +0 -75
  110. package/idea/Table2/Components/Templates/TemplateCreateDefault.tsx +0 -45
  111. package/idea/Table2/Components/Templates/TemplateList.tsx +0 -167
  112. package/idea/Table2/Components/Templates/repo/TemplateRepo.ts +0 -51
  113. package/idea/Table2/_table.scss +0 -300
  114. package/idea/Table2/hooks/useDefaultTemplate.ts +0 -22
  115. package/idea/Table2/hooks/useTableKeyboard.ts +0 -115
  116. package/src/assets/icons/light/faPenField.ts +0 -15
  117. package/src/assets/icons/solid/faMagnifyingGlass.ts +0 -15
  118. package/src/components/Dialog/DeleteItemDialog.tsx +0 -52
  119. package/src/components/Dialog/hooks/useDialogObserver.ts +0 -21
  120. /package/{src/components → idea}/Table/Components/Columns/ColumnsList.tsx +0 -0
  121. /package/{src/components → idea}/Table/Components/Columns/SetColumnsList.tsx +0 -0
  122. /package/{src/components → idea}/Table/Components/Edit/ItemActionsMenu.tsx +0 -0
  123. /package/{src/components → idea}/Table/Components/Edit/ItemEditOptionsButtons.tsx +0 -0
  124. /package/{src/components → idea}/Table/Components/Edit/TableEditRow.tsx +0 -0
  125. /package/{src/components → idea}/Table/Components/FilterItem.tsx +0 -0
  126. /package/{src/components → idea}/Table/Components/Header/TableHeader.tsx +0 -0
  127. /package/{src/components → idea}/Table/Components/Header/TableHeaderRow.tsx +0 -0
  128. /package/{src/components → idea}/Table/Components/SetSortList.tsx +0 -0
  129. /package/{src/components → idea}/Table/Components/TableFooter.tsx +0 -0
  130. /package/{src/components → idea}/Table/Components/Templates/TemplateCreate.tsx +0 -0
  131. /package/{src/components → idea}/Table/Components/Templates/TemplateCreateDefault.tsx +0 -0
  132. /package/{src/components → idea}/Table/Components/Templates/TemplateList.tsx +0 -0
  133. /package/{src/components → idea}/Table/Components/Templates/repo/TemplateRepo.ts +0 -0
  134. /package/src/utils/{DateUtils.ts → dateUtils.ts} +0 -0
  135. /package/src/utils/{LocalStorageHelper.ts → localStorageHelper.ts} +0 -0
  136. /package/src/utils/{NumberUtils.ts → numberUtils.ts} +0 -0
  137. /package/src/utils/{RootDir.ts → rootDir.ts} +0 -0
  138. /package/src/utils/{StringUtils.ts → stringUtils.ts} +0 -0
@@ -1,87 +0,0 @@
1
- import { FC, useState } from 'react';
2
- import { faEllipsisVertical } from '../../../../icons/light/faEllipsisVertical';
3
- import { IconButton } from '../../../Button/IconButton';
4
- import { Menu } from '../../../Menu/Menu';
5
- import { MenuItem } from '../../../Menu/MenuItem';
6
- import { useTranslation } from 'react-i18next';
7
-
8
- interface Props {
9
- item: any;
10
- setSelectedItem?: (item: any) => void;
11
- setItemToDeleteUuid?: (uuid: string) => void;
12
- actions?: {
13
- label: string;
14
- onClick: (uuid: string) => void;
15
- hidden?: boolean;
16
- disabled?: boolean;
17
- }[];
18
- }
19
-
20
- export const ItemActionsMenu: FC<Props> = ({
21
- item,
22
- setSelectedItem,
23
- setItemToDeleteUuid,
24
- actions,
25
- }) => {
26
- const [menuOpen, setMenuOpen] = useState(false);
27
-
28
- const { t } = useTranslation();
29
-
30
- return (
31
- <Menu
32
- isOpen={menuOpen}
33
- onClose={() => setMenuOpen(false)}
34
- placementX="right"
35
- renderButton={ref => (
36
- <IconButton
37
- ref={ref}
38
- icon={faEllipsisVertical}
39
- active={menuOpen}
40
- onClick={e => {
41
- e.stopPropagation();
42
- setMenuOpen(!menuOpen);
43
- }}
44
- />
45
- )}
46
- >
47
- {!!setSelectedItem && (
48
- <MenuItem
49
- onClick={e => {
50
- e.stopPropagation();
51
- setSelectedItem(item);
52
- setMenuOpen(false);
53
- }}
54
- >
55
- <p>{t('Edit')}</p>
56
- </MenuItem>
57
- )}
58
- {actions?.map(
59
- action =>
60
- !action.hidden && (
61
- <MenuItem
62
- key={action.label}
63
- disabled={!!action.disabled}
64
- onClick={e => {
65
- e.stopPropagation();
66
- action.onClick(item.uuid);
67
- setMenuOpen(false);
68
- }}
69
- >
70
- <p>{action.label}</p>
71
- </MenuItem>
72
- )
73
- )}
74
- {!!setItemToDeleteUuid && (
75
- <MenuItem
76
- onClick={e => {
77
- e.stopPropagation();
78
- setItemToDeleteUuid(item.uuid);
79
- setMenuOpen(false);
80
- }}
81
- >
82
- <p>{t('Delete')}</p>
83
- </MenuItem>
84
- )}
85
- </Menu>
86
- );
87
- };
@@ -1,32 +0,0 @@
1
- import { FC, RefObject } from 'react';
2
- import { faCheck } from '../../../../icons/light/faCheck';
3
- import { faXmark } from '../../../../icons/light/faXmark';
4
- import { IconButton } from '../../../Button/IconButton';
5
-
6
- interface Props {
7
- setData: (item: any) => void;
8
- clearItem: () => void;
9
- inputFocusRef?: RefObject<any>;
10
- defaultDataValue?: any;
11
- }
12
- export const ItemEditOptionsButtons: FC<Props> = ({
13
- setData,
14
- clearItem,
15
- inputFocusRef,
16
- defaultDataValue,
17
- }) => {
18
- return (
19
- <div className="flex center gap-1">
20
- <IconButton icon={faCheck} className="p-1" />
21
- <IconButton
22
- icon={faXmark}
23
- className="p-1"
24
- onClick={() => {
25
- setData(defaultDataValue || {});
26
- inputFocusRef?.current?.focus();
27
- clearItem();
28
- }}
29
- />
30
- </div>
31
- );
32
- };
@@ -1,56 +0,0 @@
1
- import { FC, isValidElement, useEffect } from 'react';
2
- import { ITableDataItem, ITableEditRow } from '../../../../types/ITable';
3
- import { ItemEditOptionsButtons } from './ItemEditOptionsButtons';
4
-
5
- export const TableEditRow: FC<ITableEditRow> = ({
6
- columns,
7
- defaultDataValue,
8
- data,
9
- setData,
10
- item,
11
- clearItem,
12
- inputFocusRef,
13
- }) => {
14
- useEffect(() => {
15
- inputFocusRef?.current?.focus();
16
- setData(item ?? defaultDataValue ?? {});
17
- }, [item, defaultDataValue, inputFocusRef, setData]);
18
-
19
- let cells = {
20
- ...data,
21
- actions: {
22
- value: (
23
- <ItemEditOptionsButtons
24
- setData={setData}
25
- clearItem={clearItem}
26
- defaultDataValue={defaultDataValue}
27
- inputFocusRef={inputFocusRef}
28
- />
29
- ),
30
- },
31
- };
32
-
33
- Object.keys(cells).forEach(key => {
34
- isValidElement(cells[key].value) && (cells[key].className = 'p-1');
35
- });
36
-
37
- const rowData: ITableDataItem = { uuid: item?.uuid, cells };
38
-
39
- return (
40
- <tr data-id={rowData.uuid} className="edit-row">
41
- {columns.map(
42
- column =>
43
- !column.hidden && (
44
- <td
45
- key={column.id}
46
- align={column.align}
47
- colSpan={rowData.cells[column.id]?.span}
48
- className={rowData.cells[column.id]?.className}
49
- >
50
- {rowData.cells[column.id]?.value}
51
- </td>
52
- )
53
- )}
54
- </tr>
55
- );
56
- };
@@ -1,20 +0,0 @@
1
- import { FC } from 'react';
2
- import { ITableFilterItem } from '../../../types/ITable';
3
- import { Button } from '../../Button/Button';
4
- import { useTranslation } from 'react-i18next';
5
-
6
- interface Props {
7
- item: ITableFilterItem;
8
- }
9
- export const FilterItem: FC<Props> = ({ item }) => {
10
- const { t } = useTranslation();
11
- return (
12
- <div key={item.label} className="table-filter-item">
13
- {/* Added zero-width non-breaking space symbol (&#8288;)
14
- because of losing focus from input field when first letter of the label is pressed. */}
15
- <p className="label">&#8288;{item.label}</p>
16
- <div className="field">{item.field}</div>
17
- <Button label={t('Delete')} onClick={() => item.resetField()} size="m" />
18
- </div>
19
- );
20
- };
@@ -1,35 +0,0 @@
1
- import { FC } from 'react';
2
- import clsx from 'clsx';
3
- import { ITableColumn } from '../../../../types/ITable';
4
- import { TableHeaderRow } from './TableHeaderRow';
5
-
6
- interface Props {
7
- columns: ITableColumn[];
8
- customHeader?: ITableColumn[][];
9
- headerWrap?: boolean;
10
- printTable?: boolean;
11
- sticky?: boolean;
12
- }
13
- export const HeaderTable: FC<Props> = ({
14
- columns,
15
- customHeader,
16
- headerWrap,
17
- printTable,
18
- sticky,
19
- }) => (
20
- <thead
21
- className={clsx({
22
- 'no-wrap': !headerWrap,
23
- 'sticky-header': sticky,
24
- })}
25
- >
26
- {customHeader ? (
27
- customHeader?.map((row, i) => (
28
- // No array manipulation will be performed, so using key 'i' is acceptable.
29
- <TableHeaderRow key={i} row={row} printTable={printTable} />
30
- ))
31
- ) : (
32
- <TableHeaderRow row={columns} printTable={printTable} />
33
- )}
34
- </thead>
35
- );
@@ -1,37 +0,0 @@
1
- import { FC } from 'react';
2
- import { ITableColumn } from '../../../../types/ITable';
3
-
4
- interface Props {
5
- row: ITableColumn[];
6
- printTable?: boolean;
7
- }
8
-
9
- export const TableHeaderRow: FC<Props> = ({ row, printTable }) => (
10
- <tr>
11
- {row.map(col => (
12
- <th
13
- key={col.id}
14
- colSpan={col.colSpan}
15
- rowSpan={col.rowSpan}
16
- className={col.color}
17
- style={
18
- col.minWidth
19
- ? { minWidth: col.minWidth }
20
- : col.width
21
- ? { width: col.width }
22
- : undefined
23
- }
24
- hidden={col.hidden}
25
- >
26
- <div className="flex align-center">
27
- {typeof col.label === 'string' ? (
28
- <p className={`full-width text-${col.align || 'left'}`}>{col.label}</p>
29
- ) : (
30
- <div className={`full-width text-${col.align || 'left'}`}>{col.label}</div>
31
- )}
32
- {/* {!printTable && <div className="vertical-separator" />} */}
33
- </div>
34
- </th>
35
- ))}
36
- </tr>
37
- );
@@ -1,119 +0,0 @@
1
- import { FC, useEffect } from 'react';
2
- import { createPortal } from 'react-dom';
3
- import { faFileArrowDown } from '../../../../icons/regular/faFileArrowDown';
4
- import { faPrint } from '../../../../icons/solid/faPrint';
5
- import { faXmark } from '../../../../icons/solid/faXmark';
6
- import { ICustomPrintData } from '../../../../types/ITable';
7
- import { formatDate, getCurrentDateFormatted } from '../../../../utils/DateUtils';
8
- import { Button } from '../../../Button/Button';
9
- import { useTranslation } from 'react-i18next';
10
- import { rootDir } from '../../../../utils/RootDir';
11
- import { useHideZendesk } from '../../../../hooks/useZendesk';
12
-
13
- interface Props extends ICustomPrintData {
14
- isOpen: boolean;
15
- onClose: () => void;
16
- }
17
- export const CustomTablePrint: FC<Props> = ({
18
- isOpen,
19
- onClose,
20
- label,
21
- organization,
22
- filters,
23
- content,
24
- saveXlsx,
25
- }) => {
26
- const { t } = useTranslation();
27
- useHideZendesk();
28
-
29
- useEffect(() => {
30
- rootDir?.classList.add('hidden');
31
- return () => {
32
- rootDir?.classList.remove('hidden');
33
- };
34
- }, []);
35
-
36
- return isOpen
37
- ? createPortal(
38
- <div className="iui-print-dialog">
39
- <div className="content">
40
- <div className="flex justify-between">
41
- {organization ? (
42
- <div>
43
- <p className="name">{organization.name}</p>
44
- {organization.taxId && <p>{`${t('TaxId')}: ${organization.taxId}`}</p>}
45
- {organization.registrationNumber && (
46
- <p>{`${t('BusinessCode')}: ${organization.registrationNumber}`}</p>
47
- )}
48
- {organization.jbkjs && <p>JBKJS: {organization.jbkjs}</p>}
49
- {organization.email && <p>Email: {organization.email}</p>}
50
- </div>
51
- ) : (
52
- <div />
53
- )}
54
- <div className="text-right">
55
- <p>{`${t('PrintDate')}: ${getCurrentDateFormatted()}`}</p>
56
- </div>
57
- </div>
58
- <h4 className="my-3 text-center">{label}</h4>
59
- {filters && (
60
- <div className="flex justify-between">
61
- <div>
62
- {filters.basic?.map(
63
- e =>
64
- !!e.value && (
65
- <div key={e.value} className="mb-2">
66
- <p>{`${e.label}: ${e.value}`}</p>
67
- </div>
68
- )
69
- )}
70
- </div>
71
- {filters.date && (
72
- <div>
73
- {filters.date.map(
74
- e =>
75
- (!!e.from || !!e.to) && (
76
- <div key={e.label} className="mb-2 text-right">
77
- <p>
78
- {e.label} {!!e.from && `${t('from')} ${formatDate(e.from)}`}{' '}
79
- {`${t('to')} ${formatDate(e.to || new Date().toString())}`}
80
- </p>
81
- </div>
82
- )
83
- )}
84
- </div>
85
- )}
86
- </div>
87
- )}
88
- {content}
89
- </div>
90
- <div className="iui-print-actions no-print">
91
- <Button
92
- label={t('Cancel')}
93
- icon={faXmark}
94
- onClick={e => {
95
- e.stopPropagation();
96
- onClose();
97
- }}
98
- className="mr-3"
99
- />
100
- {!!saveXlsx && (
101
- <Button
102
- label={t('SaveXlsx')}
103
- icon={faFileArrowDown}
104
- onClick={() => saveXlsx()}
105
- className="mr-3"
106
- />
107
- )}
108
- <Button
109
- label={t('Print')}
110
- icon={faPrint}
111
- solid
112
- onClick={() => window.print()}
113
- />
114
- </div>
115
- </div>,
116
- document.body
117
- )
118
- : null;
119
- };
@@ -1,208 +0,0 @@
1
- import { FC, useEffect, useState } from 'react';
2
- import { createPortal } from 'react-dom';
3
- import { faFileArrowDown } from '../../../../icons/regular/faFileArrowDown';
4
- import { faPrint } from '../../../../icons/solid/faPrint';
5
- import { faXmark } from '../../../../icons/solid/faXmark';
6
- import { IPrintData, ITableColumn, ITableDataItem } from '../../../../types/ITable';
7
- import { formatDate, getCurrentDateFormatted } from '../../../../utils/DateUtils';
8
- import { Button } from '../../../Button/Button';
9
- import { FullScreenLoader } from '../../../Loader/Loader';
10
- import { useTranslation } from 'react-i18next';
11
- import { rootDir } from '../../../../utils/RootDir';
12
- import clsx from 'clsx';
13
- import { HeaderTable } from '../Header/TableHeader';
14
- import { useHideZendesk } from '../../../../hooks/useZendesk';
15
-
16
- interface Props extends IPrintData {
17
- isOpen: boolean;
18
- onClose: () => void;
19
- columns: ITableColumn[];
20
- }
21
- export const TablePrint: FC<Props> = ({
22
- isOpen,
23
- onClose,
24
- columns,
25
- customHeader,
26
- organization,
27
- filters,
28
- label,
29
- optionalNode,
30
- getPrintData,
31
- formatPrintData,
32
- saveXlsx,
33
- totals,
34
- }) => {
35
- const [data, setData] = useState<ITableDataItem[]>([]);
36
- const [offset, setOffset] = useState(0);
37
- const [isLoading, setIsLoading] = useState(false);
38
-
39
- const { t } = useTranslation();
40
- useHideZendesk();
41
-
42
- const cols = columns.filter(e => e.id !== 'actions');
43
-
44
- useEffect(() => {
45
- rootDir?.classList.add('hidden');
46
- return () => {
47
- rootDir?.classList.remove('hidden');
48
- };
49
- }, []);
50
-
51
- useEffect(() => {
52
- setIsLoading(true);
53
- getPrintData({ limit: 1000, offset })
54
- .then(e => {
55
- setData(prevState => {
56
- const data = !!e.data.length ? formatPrintData(e.data) : [];
57
- const newState = [...prevState, ...data];
58
- e.totalRows && e.totalRows > newState.length
59
- ? setOffset(offset + 1)
60
- : setIsLoading(false);
61
- return e.totalRows && e.totalRows > prevState.length ? newState : prevState;
62
- });
63
- })
64
- .catch(() => setIsLoading(false));
65
- }, [offset, formatPrintData, getPrintData]);
66
-
67
- return isOpen
68
- ? createPortal(
69
- <div className="iui-print-dialog">
70
- <div className="content">
71
- <div className="flex justify-between">
72
- {organization ? (
73
- <div>
74
- <p className="name">{organization.name}</p>
75
- {organization.taxId && <p>{`${t('TaxId')}: ${organization.taxId}`}</p>}
76
- {organization.registrationNumber && (
77
- <p>{`${t('BusinessCode')}: ${organization.registrationNumber}`}</p>
78
- )}
79
- {organization.jbkjs && <p>JBKJS: {organization.jbkjs}</p>}
80
- {organization.email && <p>Email: {organization.email}</p>}
81
- </div>
82
- ) : (
83
- <div />
84
- )}
85
- <div className="text-right">
86
- <p>{`${t('PrintDate')}: ${getCurrentDateFormatted()}`}</p>
87
- </div>
88
- </div>
89
- <h4 className="my-3 text-center">{label}</h4>
90
- {filters && (
91
- <div className="flex justify-between">
92
- <div>
93
- {filters.basic?.map(
94
- e =>
95
- !!e.value && (
96
- <div key={e.value} className="mb-2">
97
- <p>{`${e.label}: ${e.value}`}</p>
98
- </div>
99
- )
100
- )}
101
- </div>
102
- {filters.date && (
103
- <div>
104
- {filters.date.map(
105
- e =>
106
- (!!e.from || !!e.to) && (
107
- <div key={e.label} className="mb-2 text-right">
108
- <p>
109
- {e.label} {!!e.from && `${t('from')} ${formatDate(e.from)}`}{' '}
110
- {`${t('to')} ${formatDate(e.to || new Date().toString())}`}
111
- </p>
112
- </div>
113
- )
114
- )}
115
- </div>
116
- )}
117
- </div>
118
- )}
119
- {optionalNode?.aboveTable}
120
- {data && (
121
- <table width="100%" className="print-table">
122
- <HeaderTable columns={cols} customHeader={customHeader} headerWrap />
123
- <tbody>
124
- <>
125
- {data.map(row => {
126
- let totalColsSpan = 0;
127
- return (
128
- <tr key={row.uuid} className={row.className}>
129
- {cols.map(column => {
130
- const cell = row.cells[column.id];
131
-
132
- totalColsSpan += cell?.span
133
- ? // If span is -1 or larger then the number of columns
134
- cell.span === -1 || cell.span > cols.length
135
- ? // ...fill the rest of the table
136
- cols.length - totalColsSpan
137
- : cell.span
138
- : 1;
139
-
140
- return (
141
- cols.length >= totalColsSpan && (
142
- <td
143
- key={column.id}
144
- align={cell?.align || column.align}
145
- className={clsx(column.color, cell?.className, {
146
- 'word-break': column.break,
147
- })}
148
- colSpan={cell?.span === -1 ? cols.length : cell?.span}
149
- >
150
- {cell?.printValue ?? cell?.value}
151
- </td>
152
- )
153
- );
154
- })}
155
- </tr>
156
- );
157
- })}
158
- {!!totals && (
159
- <tr>
160
- {cols.map(({ id: columnId }) => (
161
- <td
162
- key={columnId}
163
- align={totals.cells[columnId]?.align || 'right'}
164
- colSpan={totals.cells[columnId]?.span}
165
- className="py-3"
166
- >
167
- <strong>{totals.cells[columnId]?.value}</strong>
168
- </td>
169
- ))}
170
- </tr>
171
- )}
172
- </>
173
- </tbody>
174
- </table>
175
- )}
176
- {optionalNode?.bellowTable}
177
- </div>
178
- <div className="iui-print-actions no-print">
179
- <Button
180
- label={t('Cancel')}
181
- icon={faXmark}
182
- onClick={e => {
183
- e.stopPropagation();
184
- onClose();
185
- }}
186
- className="mr-3"
187
- />
188
- {!!saveXlsx && (
189
- <Button
190
- label={t('SaveXlsx')}
191
- icon={faFileArrowDown}
192
- onClick={() => saveXlsx()}
193
- className="mr-3"
194
- />
195
- )}
196
- <Button
197
- label={t('Print')}
198
- icon={faPrint}
199
- solid
200
- onClick={() => window.print()}
201
- />
202
- </div>
203
- <FullScreenLoader isLoading={isLoading} />
204
- </div>,
205
- document.body
206
- )
207
- : null;
208
- };
@@ -1,33 +0,0 @@
1
- import { FC } from 'react';
2
- import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
3
- import { ITableSort } from '../../../types/ITable';
4
- import { faArrowDownWideShort } from '../../../icons/light/faArrowDownWideShort';
5
- import { faArrowDownShortWide } from '../../../icons/light/faArrowDownShortWide';
6
- import { MenuItem } from '../../Menu/MenuItem';
7
- import { useTranslation } from 'react-i18next';
8
-
9
- interface Props {
10
- sort: string;
11
- setSort: (sort: string) => void;
12
- sortOptions: ITableSort[];
13
- }
14
- export const SetSortList: FC<Props> = ({ sortOptions, sort, setSort }) => {
15
- const { t } = useTranslation();
16
- return (
17
- <>
18
- {sortOptions.map(e => (
19
- <MenuItem
20
- key={e.label}
21
- className="menu-item-m"
22
- onClick={() => setSort(sort === e.desc ? e.asc : e.desc)}
23
- >
24
- <div className="flex center justify-between full-width">
25
- <p className="mr-5 mb-0">{e.label}</p>
26
- {sort === e.desc && <FontAwesomeIcon icon={faArrowDownWideShort} />}
27
- {sort === e.asc && <FontAwesomeIcon icon={faArrowDownShortWide} />}
28
- </div>
29
- </MenuItem>
30
- ))}
31
- </>
32
- );
33
- };