@inceptionbg/iui 2.0.10 → 2.0.12

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 (117) hide show
  1. package/dist/icons/index.d.ts +5 -1
  2. package/dist/icons/index.js +1 -1
  3. package/dist/index.d.ts +169 -85
  4. package/dist/index.js +1 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/iui.css +1 -1
  7. package/package.json +1 -1
  8. package/src/assets/icons/duotone/faCircleUser.ts +6 -6
  9. package/src/assets/icons/index.ts +2 -0
  10. package/src/assets/icons/light/faArrowDownShortWide.ts +1 -1
  11. package/src/assets/icons/light/faArrowDownWideShort.ts +1 -1
  12. package/src/assets/icons/light/faArrowUpArrowDown.ts +5 -5
  13. package/src/assets/icons/light/faArrowUpRightFromSquare.ts +1 -1
  14. package/src/assets/icons/light/faArrowsToLine.ts +1 -1
  15. package/src/assets/icons/light/faArrowsUpDown.ts +1 -1
  16. package/src/assets/icons/light/faBookmark.ts +15 -0
  17. package/src/assets/icons/light/faBookmarkSlash.ts +15 -0
  18. package/src/assets/icons/light/faCalendarPlus.ts +5 -5
  19. package/src/assets/icons/light/faCheck.ts +1 -1
  20. package/src/assets/icons/light/faChevronDown.ts +5 -5
  21. package/src/assets/icons/light/faChevronRight.ts +5 -5
  22. package/src/assets/icons/light/faCircleInfo.ts +5 -5
  23. package/src/assets/icons/light/faCircleXmark.ts +5 -5
  24. package/src/assets/icons/light/faClipboardCheck.ts +5 -5
  25. package/src/assets/icons/light/faClockRotateLeft.ts +1 -1
  26. package/src/assets/icons/light/faEllipsisVertical.ts +1 -1
  27. package/src/assets/icons/light/faEye.ts +5 -5
  28. package/src/assets/icons/light/faEyeSlash.ts +5 -5
  29. package/src/assets/icons/light/faFilter.ts +5 -5
  30. package/src/assets/icons/light/faGear.ts +1 -1
  31. package/src/assets/icons/light/faHouse.ts +5 -5
  32. package/src/assets/icons/light/faIdBadge.ts +5 -5
  33. package/src/assets/icons/light/faLineColumns.ts +5 -5
  34. package/src/assets/icons/light/faLink.ts +1 -1
  35. package/src/assets/icons/light/faMagnifyingGlass.ts +5 -5
  36. package/src/assets/icons/light/faPen.ts +15 -15
  37. package/src/assets/icons/light/faPrint.ts +5 -5
  38. package/src/assets/icons/light/faQuestion.ts +5 -5
  39. package/src/assets/icons/light/faRotateRight.ts +5 -5
  40. package/src/assets/icons/light/faTrashCan.ts +5 -5
  41. package/src/assets/icons/light/faTriangleExclamation.ts +5 -5
  42. package/src/assets/icons/light/faXmark.ts +1 -1
  43. package/src/assets/icons/regular/faArrowLeft.ts +6 -6
  44. package/src/assets/icons/regular/faArrowRightArrowLeft.ts +1 -1
  45. package/src/assets/icons/regular/faCircleCheck.ts +1 -1
  46. package/src/assets/icons/regular/faCircleExclamation.ts +1 -1
  47. package/src/assets/icons/regular/faCircleInfo.ts +1 -1
  48. package/src/assets/icons/regular/faFileArrowDown.ts +1 -1
  49. package/src/assets/icons/regular/faFilterCircleXmark.ts +1 -1
  50. package/src/assets/icons/regular/faTriangleExclamation.ts +1 -1
  51. package/src/assets/icons/solid/faAngleLeft.ts +1 -1
  52. package/src/assets/icons/solid/faAngleRight.ts +1 -1
  53. package/src/assets/icons/solid/faArrowDownWideShort.ts +1 -1
  54. package/src/assets/icons/solid/faCaretDown.ts +1 -1
  55. package/src/assets/icons/solid/faCheck.ts +5 -5
  56. package/src/assets/icons/solid/faEllipsisVertical.ts +1 -1
  57. package/src/assets/icons/solid/faFilter.ts +1 -1
  58. package/src/assets/icons/solid/faFloppyDisk.ts +1 -1
  59. package/src/assets/icons/solid/faGripDotsVertical.ts +1 -1
  60. package/src/assets/icons/solid/faListUl.ts +1 -1
  61. package/src/assets/icons/solid/faMinus.ts +6 -6
  62. package/src/assets/icons/solid/faPlus.ts +6 -6
  63. package/src/assets/icons/solid/faPrint.ts +1 -1
  64. package/src/assets/icons/solid/faRotateRight.ts +1 -1
  65. package/src/assets/icons/solid/faXmark.ts +1 -1
  66. package/src/components/Button/Button.tsx +1 -1
  67. package/src/components/Button/IconButton.tsx +1 -1
  68. package/src/components/Dashboard/FastLinksWidget/FastLinksWidget.tsx +1 -1
  69. package/src/components/Dialog/Dialog.tsx +6 -8
  70. package/src/components/Dialog/components/DialogFooter.tsx +1 -1
  71. package/src/components/Header/Components/ModuleSelect.tsx +14 -6
  72. package/src/components/Header/Components/UserMenu.tsx +2 -4
  73. package/src/components/Inputs/DateInput/DateInput.tsx +1 -2
  74. package/src/components/Inputs/InputWrapper.tsx +1 -1
  75. package/src/components/Inputs/PasswordInput.tsx +2 -1
  76. package/src/components/Inputs/Select2/Select.tsx +0 -1
  77. package/src/components/Inputs/TextInput.tsx +1 -1
  78. package/src/components/List/List.tsx +18 -0
  79. package/src/components/List/ListItem.tsx +24 -0
  80. package/src/components/Loader/ProgressBar.tsx +41 -0
  81. package/src/components/Menu/Menu.tsx +0 -3
  82. package/src/components/Menu/MenuItem.tsx +21 -23
  83. package/src/components/Menu/NewMenu.tsx +0 -3
  84. package/src/components/Menu/hooks/useMenuPosition.tsx +26 -8
  85. package/src/components/Pullover/Pullover.tsx +33 -16
  86. package/src/components/Sidebar/types/ISidebar.ts +1 -1
  87. package/src/components/Table/Table.tsx +18 -11
  88. package/src/components/Table/components/filters/TableFilters.tsx +5 -8
  89. package/src/components/Table/components/footer/TableFooter.tsx +6 -10
  90. package/src/components/Table/components/header/TableHeader.tsx +22 -24
  91. package/src/components/Table/components/header/TableHeaderRow.tsx +16 -7
  92. package/{idea/Table/Components/Print → src/components/Table/components/print}/TablePrint.tsx +89 -96
  93. package/src/components/Table/components/sort/TableSort.tsx +2 -0
  94. package/src/components/Table/components/templates/TableTemplates.tsx +81 -0
  95. package/src/components/Table/hooks/useTablePrint.ts +75 -0
  96. package/src/components/Wrappers/PageLayout.tsx +1 -1
  97. package/src/hooks/useLocalPopoverControl.ts +11 -17
  98. package/src/hooks/usePopupControl.ts +11 -7
  99. package/src/index.ts +11 -0
  100. package/src/styles/App.scss +2 -0
  101. package/src/styles/common/_animations.scss +8 -14
  102. package/src/styles/common/_typography.scss +1 -1
  103. package/src/styles/common/helpers/_base.scss +0 -4
  104. package/src/styles/components/_header.scss +21 -9
  105. package/src/styles/components/_list.scss +40 -0
  106. package/src/styles/components/_loader.scss +3 -1
  107. package/src/styles/components/_menu.scss +19 -18
  108. package/src/styles/components/_print.scss +36 -46
  109. package/src/styles/components/_progressBar.scss +83 -0
  110. package/src/styles/components/_table.scss +16 -22
  111. package/src/types/IHeader.ts +13 -7
  112. package/src/types/IPopup.ts +17 -0
  113. package/src/types/ITable.ts +55 -32
  114. package/src/utils/i18n/i18nIUICyrilic.ts +2 -1
  115. package/src/utils/i18n/i18nIUILatin.ts +16 -12
  116. package/src/utils/i18n/i18nIUIMe.ts +2 -1
  117. package/src/utils/icons.ts +1 -1
@@ -4,9 +4,10 @@ import clsx from 'clsx';
4
4
 
5
5
  interface Props {
6
6
  row: ITableColumn[];
7
+ print?: boolean;
7
8
  }
8
9
 
9
- export const TableHeaderRow: FC<Props> = ({ row }) => {
10
+ export const TableHeaderRow: FC<Props> = ({ row, print }) => {
10
11
  // const { sortData } = useTableContext();
11
12
  // const { sort, setSort, sortOptions } = sortData ?? {};
12
13
  // const activeSortOption = sortOptions?.find(e => sort?.startsWith(e.value));
@@ -18,18 +19,26 @@ export const TableHeaderRow: FC<Props> = ({ row }) => {
18
19
  key={col.id}
19
20
  colSpan={col.colSpan}
20
21
  rowSpan={col.rowSpan}
21
- className={clsx(col.color, col.className)}
22
+ className={
23
+ print
24
+ ? undefined
25
+ : clsx(col.color, col.className, {
26
+ 'not-first-cell': col.notFirstCell,
27
+ })
28
+ }
22
29
  // onClick={() => {
23
30
  // const sortValue = sortOptions?.find(e => col.label === e.label)?.value;
24
31
  // sortValue &&
25
32
  // setSort?.(sort === sortValue + desc ? sortValue + asc : sortValue + desc);
26
33
  // }}
27
34
  style={
28
- col.minWidth
29
- ? { minWidth: col.minWidth }
30
- : col.width
31
- ? { width: col.width }
32
- : undefined
35
+ print
36
+ ? undefined
37
+ : col.minWidth
38
+ ? { minWidth: col.minWidth }
39
+ : col.width
40
+ ? { width: col.width }
41
+ : undefined
33
42
  }
34
43
  hidden={col.hidden}
35
44
  >
@@ -1,77 +1,84 @@
1
- import { FC, useEffect, useState } from 'react';
2
- import { createPortal } from 'react-dom';
3
- import { faFileArrowDown } from '../../../../assets/icons/regular/faFileArrowDown';
4
- import { faPrint } from '../../../../assets/icons/solid/faPrint';
5
- import { faXmark } from '../../../../assets/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';
1
+ import { useEffect, useMemo, type FC } from 'react';
2
+ import { IconButton } from '../../../Button/IconButton';
3
+ import { faPrint } from '../../../../assets/icons';
10
4
  import { useTranslation } from 'react-i18next';
11
- import { rootDir } from '../../../../utils/rootDir';
12
- import clsx from 'clsx';
13
- import { HeaderTable } from '../Header/TableHeader';
5
+ import { Pullover } from '../../../Pullover/Pullover';
6
+ import { useTableContext } from '../../contexts/TableContext';
7
+ import { IPrintData } from '../../../../types/ITable';
14
8
  import { useHideZendesk } from '../../../../hooks/useZendesk';
9
+ import { formatDate, getCurrentDateFormatted } from '../../../../utils/dateUtils';
10
+ import { HeaderTable } from '../header/TableHeader';
11
+ import clsx from 'clsx';
12
+ import { faFileArrowDown } from '../../../../assets/icons/regular/faFileArrowDown';
13
+ import { ProgressBar } from '../../../Loader/ProgressBar';
15
14
 
16
- interface Props extends IPrintData {
17
- isOpen: boolean;
18
- onClose: () => void;
19
- columns: ITableColumn[];
20
- excludeColumnIds?: string[];
21
- }
22
- export const TablePrint: FC<Props> = ({
23
- isOpen,
24
- onClose,
25
- columns,
26
- excludeColumnIds = [],
27
- customHeader,
28
- organization,
29
- filters,
30
- label,
31
- optionalNode,
32
- getPrintData,
33
- formatPrintData,
34
- saveXlsx,
35
- totals,
36
- }) => {
37
- const [data, setData] = useState<ITableDataItem[]>([]);
38
- const [offset, setOffset] = useState(0);
39
- const [isLoading, setIsLoading] = useState(false);
40
-
15
+ export const TablePrint: FC = () => {
41
16
  const { t } = useTranslation();
42
17
  useHideZendesk();
18
+ const { columns, printData } = useTableContext();
19
+
20
+ const {
21
+ label,
22
+ tableData: data,
23
+ isLoading,
24
+ progress,
25
+ paginationControl,
26
+ printPopupControl,
27
+ customHeader,
28
+ excludeColumnIds,
29
+ filters,
30
+ optionalNode,
31
+ organization,
32
+ saveXlsx,
33
+ totals,
34
+ } = useMemo(() => (printData ?? {}) as IPrintData, [printData]);
35
+ const { control, onOpen } = printPopupControl;
43
36
 
44
- const cols = columns.filter(
45
- e => !['actions', 'select', ...excludeColumnIds].includes(e.id)
37
+ const cols = useMemo(
38
+ () => columns.filter(e => !['actions', 'select', excludeColumnIds].includes(e.id)),
39
+ [columns, excludeColumnIds]
46
40
  );
47
41
 
48
42
  useEffect(() => {
49
- rootDir?.classList.add('hidden');
50
- return () => {
51
- rootDir?.classList.remove('hidden');
52
- };
53
- }, []);
43
+ if (control.isOpen) {
44
+ paginationControl?.setLimit(1000);
45
+ paginationControl?.setOffset(0);
46
+ }
47
+ }, [paginationControl, control.isOpen]);
54
48
 
55
- useEffect(() => {
56
- setIsLoading(true);
57
- getPrintData({ limit: 1000, offset })
58
- .then(e => {
59
- setData(prevState => {
60
- const data = !!e.data.length ? formatPrintData(e.data) : [];
61
- const newState = [...prevState, ...data];
62
- e.totalRows && e.totalRows > newState.length
63
- ? setOffset(offset + 1)
64
- : setIsLoading(false);
65
- return e.totalRows && e.totalRows > prevState.length ? newState : prevState;
66
- });
67
- })
68
- .catch(() => setIsLoading(false));
69
- }, [offset, formatPrintData, getPrintData]);
49
+ return (
50
+ printData && (
51
+ <>
52
+ <IconButton
53
+ tooltip={t('PrintExport')}
54
+ icon={faPrint}
55
+ onClick={onOpen}
56
+ size="s"
57
+ variant="outlined"
58
+ />
70
59
 
71
- return isOpen
72
- ? createPortal(
73
- <div className="iui-print-dialog">
74
- <div className="content">
60
+ <Pullover
61
+ control={control}
62
+ header={{ title: t('PrintExport') }}
63
+ footer={{
64
+ confirmButton: {
65
+ label: t('Print'),
66
+ onClick: window.print,
67
+ // type: 'submit',
68
+ },
69
+ additionalButton: saveXlsx
70
+ ? {
71
+ label: t('SaveXlsx'),
72
+ icon: faFileArrowDown,
73
+ onClick: saveXlsx,
74
+ }
75
+ : undefined,
76
+ }}
77
+ contentClassName="iui-print"
78
+ size="vw100"
79
+ portalTarget={document.body}
80
+ >
81
+ <div className="print-content">
75
82
  <div className="flex justify-between">
76
83
  {organization ? (
77
84
  <div>
@@ -121,11 +128,18 @@ export const TablePrint: FC<Props> = ({
121
128
  </div>
122
129
  )}
123
130
  {optionalNode?.aboveTable}
124
- {data && (
125
- <table width="100%" className="print-table">
126
- <HeaderTable columns={cols} customHeader={customHeader} headerWrap />
127
- <tbody>
128
- <>
131
+ {isLoading ? (
132
+ <ProgressBar progress={progress} />
133
+ ) : (
134
+ data && (
135
+ <table width="100%" className="print-table">
136
+ <HeaderTable
137
+ columns={cols}
138
+ customHeader={customHeader}
139
+ headerWrap
140
+ print
141
+ />
142
+ <tbody>
129
143
  {data.map(row => {
130
144
  let totalColsSpan = 0;
131
145
  return (
@@ -173,35 +187,14 @@ export const TablePrint: FC<Props> = ({
173
187
  ))}
174
188
  </tr>
175
189
  )}
176
- </>
177
- </tbody>
178
- </table>
190
+ </tbody>
191
+ </table>
192
+ )
179
193
  )}
180
194
  {optionalNode?.bellowTable}
181
195
  </div>
182
- <div className="iui-print-actions no-print">
183
- <Button
184
- label={t('Cancel')}
185
- icon={faXmark}
186
- onClick={e => {
187
- e.stopPropagation();
188
- onClose();
189
- }}
190
- className="mr-3"
191
- />
192
- {!!saveXlsx && (
193
- <Button
194
- label={t('SaveXlsx')}
195
- icon={faFileArrowDown}
196
- onClick={() => saveXlsx()}
197
- className="mr-3"
198
- />
199
- )}
200
- <Button label={t('Print')} icon={faPrint} onClick={() => window.print()} />
201
- </div>
202
- <FullScreenLoader isLoading={isLoading} />
203
- </div>,
204
- document.body
205
- )
206
- : null;
196
+ </Pullover>
197
+ </>
198
+ )
199
+ );
207
200
  };
@@ -39,6 +39,8 @@ export const TableSort: FC = () => {
39
39
  label: e.label,
40
40
  onClick: () => setSort?.(sort === valueDesc ? valueAsc : valueDesc),
41
41
  active: sort?.startsWith(e.value),
42
+ className: 'table-sort-item',
43
+ keepOpen: true,
42
44
  icon:
43
45
  sort === valueDesc
44
46
  ? faArrowDownWideShort
@@ -0,0 +1,81 @@
1
+ import { useState, type FC } from 'react';
2
+ import { IconButton } from '../../../Button/IconButton';
3
+ import { useTranslation } from 'react-i18next';
4
+ import { useTableContext } from '../../contexts/TableContext';
5
+ import { faBookmark, faBookmarkSlash } from '../../../../assets/icons';
6
+ import { usePopupControl } from '../../../../hooks/usePopupControl';
7
+ import { Pullover } from '../../../Pullover/Pullover';
8
+
9
+ export const TableTemplates: FC = () => {
10
+ const { t } = useTranslation();
11
+ const { templates } = useTableContext();
12
+ const { control, onClose, onOpen } = usePopupControl();
13
+
14
+ return (
15
+ <>
16
+ <IconButton
17
+ tooltip={t('Templates')}
18
+ icon={faBookmark}
19
+ active={control.isOpen}
20
+ onClick={onOpen}
21
+ size="s"
22
+ variant="outlined"
23
+ />
24
+
25
+ <Pullover
26
+ control={control}
27
+ header={{
28
+ title: t('Templates'),
29
+ onSearch: templates?.setSearch,
30
+ }}
31
+ // onFormSubmit={() => {
32
+ // const data = deleteEmptyPropsIncludingArray(searchData);
33
+ // onSearch?.(excludeFromSearch ? deleteProps(data, excludeFromSearch) : data);
34
+ // onClose();
35
+ // }}
36
+ footer={{
37
+ confirmButton: {
38
+ label: t('ApplyTemplate'),
39
+ type: 'submit',
40
+ },
41
+ additionalButton: {
42
+ label: t('ResetTemplate'),
43
+ icon: faBookmarkSlash,
44
+ onClick: () => {
45
+ // setSearchData?.(defaultSearch);
46
+ // onSearch?.(defaultSearch);
47
+ // onClose();
48
+ },
49
+ // disabled: defaultSearch
50
+ // ? JSON.stringify(searchData) === JSON.stringify(defaultSearch)
51
+ // : Object.keys(searchData).length === 0,
52
+ },
53
+ }}
54
+ // contentClassName="iui-filters-list"
55
+ onCloseCallback={() => templates?.setSearch?.('')}
56
+ size="w600"
57
+ >
58
+ Templates
59
+ {templates?.items.map(item => (
60
+ <div key={item.uuid}>{item.name}</div>
61
+ ))}
62
+ </Pullover>
63
+ </>
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
+ );
81
+ };
@@ -0,0 +1,75 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { IGetPrintData, IPrintData } from '../../../types/ITable';
3
+ import { usePopupControl } from '../../../hooks/usePopupControl';
4
+
5
+ type Props<T> = {
6
+ getPrintData: IGetPrintData<T>;
7
+ totalRows?: number;
8
+ };
9
+
10
+ const limit = 1000;
11
+ const defaultData = { items: [], totalRows: 0 };
12
+
13
+ export const useTablePrint = <T>({
14
+ getPrintData,
15
+ totalRows: initialTotalRows = 0,
16
+ }: Props<T>) => {
17
+ const printPopupControl = usePopupControl();
18
+
19
+ const [data, setData] = useState<{ items: T[]; totalRows: number }>(defaultData);
20
+ const [offset, setOffset] = useState(0);
21
+ const [isLoading, setIsLoading] = useState(false);
22
+
23
+ useEffect(() => {
24
+ if (printPopupControl.control.isOpen) {
25
+ setIsLoading(true);
26
+ setOffset(0);
27
+ }
28
+ return () => {
29
+ setIsLoading(false);
30
+ setData(defaultData);
31
+ setOffset(0);
32
+ };
33
+ }, [printPopupControl.control.isOpen]);
34
+
35
+ useEffect(() => {
36
+ if (printPopupControl.control.isOpen) {
37
+ getPrintData({
38
+ pagination: { limit, offset },
39
+ noTotalRows: !!initialTotalRows || offset > 0,
40
+ })
41
+ .then(({ items, totalRows: newTotalRows }) => {
42
+ setData(prevState => {
43
+ const newData = offset === 0 ? items : prevState.items.concat(items);
44
+ const totalRows =
45
+ newTotalRows || initialTotalRows || prevState.totalRows || 0;
46
+
47
+ if (items?.length === limit) {
48
+ setOffset(offset => offset + 1);
49
+ } else {
50
+ setIsLoading(false);
51
+ }
52
+
53
+ return { items: newData, totalRows };
54
+ });
55
+ })
56
+ .catch(() => setIsLoading(false));
57
+ }
58
+ // eslint-disable-next-line react-hooks/exhaustive-deps
59
+ }, [printPopupControl.control.isOpen, initialTotalRows, offset]);
60
+
61
+ const loaded = data.items.length;
62
+ const progress = data.totalRows ? (loaded / data.totalRows) * 100 : 0;
63
+
64
+ const printData: Pick<
65
+ IPrintData<T>,
66
+ 'printPopupControl' | 'isLoading' | 'progress' | 'items'
67
+ > = {
68
+ printPopupControl,
69
+ isLoading,
70
+ progress,
71
+ items: data.items ?? [],
72
+ };
73
+
74
+ return printData;
75
+ };
@@ -93,7 +93,7 @@ export const PageLayout: FC<IPageLayoutProps> = ({
93
93
  size="s"
94
94
  />
95
95
  <Pullover
96
- controlRef={helpControl.controlRef}
96
+ control={helpControl.control}
97
97
  header={{
98
98
  title: help.title,
99
99
  }}
@@ -1,37 +1,31 @@
1
- import { Ref, useCallback, useImperativeHandle, useRef, useState } from 'react';
2
-
3
- export interface PopupControlRef {
4
- isOpen: boolean;
5
- onOpen: () => void;
6
- onClose: () => void;
7
- }
1
+ import { useCallback, useImperativeHandle, useRef } from 'react';
2
+ import { ILocalPopupControl } from '../types/IPopup';
8
3
 
9
4
  interface Props {
10
- controlRef?: Ref<PopupControlRef>;
5
+ control: ILocalPopupControl;
11
6
  onCloseCallback?: () => void;
12
7
  }
13
8
 
14
- export const useLocalPopoverControl = ({ controlRef, onCloseCallback }: Props) => {
15
- const [isOpen, setIsOpen] = useState(false);
16
-
9
+ export const useLocalPopoverControl = ({ control, onCloseCallback }: Props) => {
17
10
  const elementRef = useRef<HTMLDivElement>(null);
18
11
 
12
+ const handleOpen = useCallback(() => control.setIsOpen(true), [control]);
13
+
19
14
  const handleClose = useCallback(() => {
20
15
  elementRef.current?.classList.add('closing');
21
16
  setTimeout(() => {
22
17
  onCloseCallback?.();
23
- setIsOpen(false);
18
+ control.setIsOpen(false);
24
19
  }, 200);
25
- }, [onCloseCallback]);
20
+ }, [control, onCloseCallback]);
26
21
 
27
- useImperativeHandle(controlRef, () => ({
28
- isOpen,
29
- onOpen: () => setIsOpen(true),
22
+ useImperativeHandle(control?.controlRef, () => ({
23
+ onOpen: handleOpen,
30
24
  onClose: handleClose,
31
25
  }));
32
26
 
33
27
  return {
34
- isOpen,
28
+ isOpen: control?.isOpen,
35
29
  onClose: handleClose,
36
30
  elementRef: elementRef,
37
31
  };
@@ -1,13 +1,17 @@
1
- import { useRef } from 'react';
2
- import { PopupControlRef } from './useLocalPopoverControl';
1
+ import { useCallback, useRef, useState } from 'react';
2
+ import { IPopupControl, PopupControlRef } from '../types/IPopup';
3
+
4
+ export const usePopupControl: () => IPopupControl = () => {
5
+ const [isOpen, setIsOpen] = useState(false);
3
6
 
4
- export const usePopupControl = () => {
5
7
  const controlRef = useRef<PopupControlRef>(null);
6
8
 
9
+ const onOpen = useCallback(() => controlRef.current?.onOpen(), []);
10
+ const onClose = useCallback(() => controlRef.current?.onClose(), []);
11
+
7
12
  return {
8
- controlRef,
9
- isOpen: controlRef.current?.isOpen,
10
- onOpen: () => controlRef.current?.onOpen(),
11
- onClose: () => controlRef.current?.onClose(),
13
+ control: { controlRef, isOpen, setIsOpen },
14
+ onOpen,
15
+ onClose,
12
16
  };
13
17
  };
package/src/index.ts CHANGED
@@ -17,10 +17,12 @@ import type {
17
17
  } from './types/IBasic';
18
18
  import type { IKeyboardAction } from './types/IKeyboard';
19
19
  import type { IMenuItem, IMenuPlacement } from './types/IMenu';
20
+ import type { PopupControlRef, IPopupControl } from './types/IPopup';
20
21
  import type { IError } from './types/IError';
21
22
  import type { ISelectData } from './types/ISelect';
22
23
  import type { ITab } from './types/ITab';
23
24
  import type {
25
+ IGetPrintData,
24
26
  IPagination,
25
27
  IPaginationControl,
26
28
  ITable,
@@ -69,7 +71,9 @@ import {
69
71
  SelectCreatable,
70
72
  } from './components/Inputs/Selects/Select';
71
73
  import { TextInput } from './components/Inputs/TextInput';
74
+ import { List } from './components/List/List';
72
75
  import { FullScreenLoader, LazyLoader, Loader } from './components/Loader/Loader';
76
+ import { ProgressBar } from './components/Loader/ProgressBar';
73
77
  import { Menu } from './components/Menu/Menu';
74
78
  import { MenuItem } from './components/Menu/MenuItem';
75
79
  // import { ItemActionsMenu } from './components/Table/Components/Edit/ItemActionsMenu';
@@ -96,6 +100,7 @@ import { useDefaultTemplate } from './components/Table/hooks/useDefaultTemplate'
96
100
  import { useTableEdit } from './components/Table/hooks/useTableEdit';
97
101
  import { useTableFilterFields } from './components/Table/hooks/useTableFilterFields';
98
102
  import { useTablePagination } from './components/Table/hooks/useTablePagination';
103
+ import { useTablePrint } from './components/Table/hooks/useTablePrint';
99
104
  import { useTableSearch } from './components/Table/hooks/useTableSearch';
100
105
  import { useTableSelect } from './components/Table/hooks/useTableSelect';
101
106
  import { useTableSort } from './components/Table/hooks/useTableSort';
@@ -195,12 +200,14 @@ export {
195
200
  TextAreaInput,
196
201
  LazyLoader,
197
202
  Loader,
203
+ List,
198
204
  Menu,
199
205
  MenuItem,
200
206
  NotificationBadge,
201
207
  NumberInput,
202
208
  PageLayout,
203
209
  PasswordInput,
210
+ ProgressBar,
204
211
  Pullover,
205
212
  PillBadge,
206
213
  Radio,
@@ -229,6 +236,7 @@ export {
229
236
  useTableEdit,
230
237
  useTableFilterFields,
231
238
  useTablePagination,
239
+ useTablePrint,
232
240
  useTableSearch,
233
241
  useTableSelect,
234
242
  useTableSort,
@@ -244,6 +252,8 @@ export type {
244
252
  IKeyboardAction,
245
253
  IMenuItem,
246
254
  IMenuPlacement,
255
+ PopupControlRef,
256
+ IPopupControl as IPopupControl,
247
257
  IError,
248
258
  IFormWrapper,
249
259
  IHeaderAction,
@@ -264,6 +274,7 @@ export type {
264
274
  ITableFilterData,
265
275
  ITableFilterItem,
266
276
  ITableSort,
277
+ IGetPrintData,
267
278
  ITreeItem,
268
279
  IValueLabel,
269
280
  IconDefinition,
@@ -25,11 +25,13 @@
25
25
  @use './components/inputDateTime';
26
26
  @use './components/inputRadio';
27
27
  @use './components/inputSelect';
28
+ @use './components/list';
28
29
  @use './components/loader';
29
30
  @use './components/menu';
30
31
  @use './components/page';
31
32
  @use './components/portal';
32
33
  @use './components/print';
34
+ @use './components/progressBar';
33
35
  @use './components/pullover';
34
36
  @use './components/scrollbar';
35
37
  @use './components/sidebar';
@@ -24,20 +24,14 @@
24
24
  }
25
25
  }
26
26
 
27
- // @keyframes linear-progress {
28
- // 0% {
29
- // background-size: 200% 100%;
30
- // background-position: left -31.25% top 0%;
31
- // }
32
- // 50% {
33
- // background-size: 800% 100%;
34
- // background-position: left -49% top 0%;
35
- // }
36
- // 100% {
37
- // background-size: 400% 100%;
38
- // background-position: left -102% top 0%;
39
- // }
40
- // }
27
+ @keyframes shimmer {
28
+ 0% {
29
+ left: -100%;
30
+ }
31
+ 100% {
32
+ left: 100%;
33
+ }
34
+ }
41
35
 
42
36
  @keyframes auto-fill {
43
37
  to {
@@ -38,7 +38,7 @@ h4 {
38
38
  }
39
39
 
40
40
  .bold {
41
- font-weight: bold !important;
41
+ font-weight: 600 !important;
42
42
  }
43
43
  .italic {
44
44
  font-style: italic !important;
@@ -49,7 +49,3 @@ a {
49
49
  .hover-neutral:hover {
50
50
  background-color: var(--neutral-hover);
51
51
  }
52
-
53
- .no-border {
54
- border: none !important;
55
- }