@xqmsg/ui-core 0.23.1 → 0.23.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +468 -0
- package/LICENSE +20 -20
- package/README.md +40 -40
- package/dist/{89793640b494d7ea.svg → 78c9d6fd7766410f.svg} +9 -9
- package/dist/components/input/index.d.ts +2 -2
- package/dist/ui-core.cjs.development.js.map +1 -1
- package/dist/ui-core.cjs.production.min.js.map +1 -1
- package/dist/ui-core.esm.js.map +1 -1
- package/package.json +118 -118
- package/src/components/banner/Banner.stories.tsx +100 -100
- package/src/components/banner/index.tsx +73 -73
- package/src/components/breadcrumbs/Breadcrumbs.stories.tsx +66 -66
- package/src/components/breadcrumbs/components/icon/index.tsx +38 -38
- package/src/components/breadcrumbs/components/label/index.tsx +20 -20
- package/src/components/breadcrumbs/index.tsx +48 -48
- package/src/components/button/Button.stories.tsx +140 -140
- package/src/components/button/google/GoogleButton.stories.tsx +23 -23
- package/src/components/button/google/index.tsx +29 -29
- package/src/components/button/index.tsx +51 -51
- package/src/components/button/microsoft/MicrosoftButton.stories.tsx +25 -25
- package/src/components/button/microsoft/index.tsx +29 -29
- package/src/components/button/spinner/SpinnerButton.stories.tsx +60 -60
- package/src/components/button/spinner/index.tsx +36 -36
- package/src/components/card/Card.stories.tsx +56 -56
- package/src/components/card/index.tsx +78 -78
- package/src/components/form/Form.stories.tsx +62 -62
- package/src/components/form/FormTypes.ts +20 -20
- package/src/components/form/hooks/useFormHandler.tsx +74 -74
- package/src/components/form/index.tsx +25 -25
- package/src/components/form/section/FormSection.stories.tsx +109 -109
- package/src/components/form/section/index.tsx +87 -87
- package/src/components/form/utils/formErrors.ts +34 -34
- package/src/components/icons/checkmark/checkmark.svg +3 -3
- package/src/components/icons/checkmark/index.tsx +13 -13
- package/src/components/icons/chevron/down/chevron-down.svg +3 -3
- package/src/components/icons/chevron/down/index.tsx +14 -14
- package/src/components/icons/chevron/right/chevron-right.svg +3 -3
- package/src/components/icons/chevron/right/index.tsx +13 -13
- package/src/components/icons/clock/clock.svg +3 -3
- package/src/components/icons/clock/index.tsx +13 -13
- package/src/components/icons/close/close.svg +3 -3
- package/src/components/icons/close/index.tsx +21 -21
- package/src/components/icons/dropdown/dropdown.svg +3 -3
- package/src/components/icons/dropdown/index.tsx +16 -16
- package/src/components/icons/error/error.svg +3 -3
- package/src/components/icons/error/index.tsx +13 -13
- package/src/components/icons/file/fill/file-fill.svg +4 -4
- package/src/components/icons/file/fill/index.tsx +13 -13
- package/src/components/icons/file/outline/file-outline.svg +3 -3
- package/src/components/icons/file/outline/index.tsx +13 -13
- package/src/components/icons/folder/add/fill/folder-add-fill.svg +3 -3
- package/src/components/icons/folder/add/fill/index.tsx +13 -13
- package/src/components/icons/folder/add/outline/folder-add-outline.svg +3 -3
- package/src/components/icons/folder/add/outline/index.tsx +15 -15
- package/src/components/icons/folder/fill/folder-fill-gradient.svg +33 -33
- package/src/components/icons/folder/fill/folder-fill.svg +4 -4
- package/src/components/icons/folder/fill/index.tsx +21 -21
- package/src/components/icons/folder/outline/folder-outline.svg +3 -3
- package/src/components/icons/folder/outline/index.tsx +13 -13
- package/src/components/icons/gear/GearIcon.tsx +36 -36
- package/src/components/icons/google/drive/index.tsx +13 -13
- package/src/components/icons/google/google.svg +13 -13
- package/src/components/icons/google/index.tsx +13 -13
- package/src/components/icons/group/group.svg +3 -3
- package/src/components/icons/group/index.tsx +13 -13
- package/src/components/icons/home/home.svg +3 -3
- package/src/components/icons/home/index.tsx +13 -13
- package/src/components/icons/image/image.svg +3 -3
- package/src/components/icons/image/index.tsx +13 -13
- package/src/components/icons/index.tsx +101 -101
- package/src/components/icons/link/index.tsx +13 -13
- package/src/components/icons/link/link.svg +4 -4
- package/src/components/icons/menu/index.tsx +13 -13
- package/src/components/icons/menu/menu.svg +3 -3
- package/src/components/icons/microsoft/index.tsx +13 -13
- package/src/components/icons/microsoft/microsoft.svg +9 -9
- package/src/components/icons/microsoft/onedrive/index.tsx +16 -16
- package/src/components/icons/neutral/index.tsx +14 -14
- package/src/components/icons/neutral/neutral.svg +3 -3
- package/src/components/icons/page/index.tsx +13 -13
- package/src/components/icons/page/page.svg +3 -3
- package/src/components/icons/positive/index.tsx +13 -13
- package/src/components/icons/positive/positive.svg +3 -3
- package/src/components/icons/question/index.tsx +13 -13
- package/src/components/icons/question/question.svg +3 -3
- package/src/components/icons/search/index.tsx +13 -13
- package/src/components/icons/search/search.svg +3 -3
- package/src/components/icons/services/index.tsx +13 -13
- package/src/components/icons/services/services.svg +3 -3
- package/src/components/icons/settings/index.tsx +14 -14
- package/src/components/icons/settings/settings.svg +6 -6
- package/src/components/icons/table/fill/index.tsx +13 -13
- package/src/components/icons/table/fill/table-fill.svg +3 -3
- package/src/components/icons/table/outline/index.tsx +13 -13
- package/src/components/icons/table/outline/table-outline.svg +3 -3
- package/src/components/icons/task/index.tsx +10 -10
- package/src/components/icons/task/task.svg +11 -11
- package/src/components/icons/trash/index.tsx +13 -13
- package/src/components/icons/trash/trash.svg +3 -3
- package/src/components/icons/vault/index.tsx +14 -14
- package/src/components/icons/video/index.tsx +13 -13
- package/src/components/icons/video/video.svg +3 -3
- package/src/components/icons/warning/index.tsx +13 -13
- package/src/components/icons/warning/warning.svg +3 -3
- package/src/components/icons/workspace/index.tsx +14 -14
- package/src/components/input/Input.stories.tsx +287 -287
- package/src/components/input/InputTypes.ts +77 -77
- package/src/components/input/StackedCheckbox/StackedCheckbox.tsx +44 -44
- package/src/components/input/StackedInput/StackedInput.tsx +60 -60
- package/src/components/input/StackedMultiSelect/index.tsx +349 -349
- package/src/components/input/StackedPilledInput/index.tsx +386 -386
- package/src/components/input/StackedRadio/StackedRadioGroup.tsx +38 -38
- package/src/components/input/StackedSelect/index.tsx +232 -232
- package/src/components/input/StackedSwitch/index.tsx +33 -33
- package/src/components/input/StackedTextarea/StackedTextarea.tsx +55 -55
- package/src/components/input/components/dropdown/index.tsx +111 -111
- package/src/components/input/components/label/index.tsx +35 -35
- package/src/components/input/components/token/Token.stories.tsx +25 -25
- package/src/components/input/components/token/index.tsx +45 -45
- package/src/components/input/index.tsx +298 -298
- package/src/components/layout/BorderedBox/index.tsx +30 -30
- package/src/components/layout/Layout.stories.tsx +40 -40
- package/src/components/layout/index.tsx +100 -100
- package/src/components/link/Link.stories.tsx +23 -23
- package/src/components/link/index.tsx +34 -34
- package/src/components/loading/LoadingIndicator.stories.tsx +45 -45
- package/src/components/loading/index.tsx +45 -45
- package/src/components/modal/Modal.stories.tsx +36 -36
- package/src/components/modal/components/action/index.tsx +37 -37
- package/src/components/modal/index.tsx +41 -41
- package/src/components/navigation/NavigationMenu.stories.tsx +85 -85
- package/src/components/navigation/components/header/index.tsx +27 -27
- package/src/components/navigation/components/items/index.tsx +76 -76
- package/src/components/navigation/index.tsx +87 -87
- package/src/components/select/index.tsx +140 -140
- package/src/components/table/Table.stories.tsx +63 -63
- package/src/components/table/TableTypes.ts +15 -15
- package/src/components/table/components/loading/index.tsx +45 -45
- package/src/components/table/components/text/index.tsx +23 -23
- package/src/components/table/empty/index.tsx +47 -47
- package/src/components/table/index.tsx +84 -84
- package/src/components/table/utils/generateTableColumns.ts +9 -9
- package/src/components/tabs/TabsWrapper.stories.tsx +85 -85
- package/src/components/tabs/index.tsx +39 -39
- package/src/components/text/Text.stories.tsx +59 -59
- package/src/components/text/index.tsx +16 -16
- package/src/components/toast/Toast.stories.tsx +52 -52
- package/src/components/toast/index.tsx +78 -78
- package/src/components/toolbar/Toolbar.stories.tsx +59 -59
- package/src/components/toolbar/components/actions/add/index.tsx +18 -18
- package/src/components/toolbar/components/actions/search/index.tsx +38 -38
- package/src/components/toolbar/components/actions/sort/index.tsx +49 -49
- package/src/components/toolbar/components/breadcrumbs/index.tsx +63 -63
- package/src/components/toolbar/components/breadcrumbs/item/index.tsx +72 -72
- package/src/components/toolbar/components/dropdown/index.tsx +107 -107
- package/src/components/toolbar/components/navigation/components/button/left/index.tsx +28 -28
- package/src/components/toolbar/components/navigation/components/button/left/left-arrow.svg +3 -3
- package/src/components/toolbar/components/navigation/components/button/right/index.tsx +27 -27
- package/src/components/toolbar/components/navigation/components/button/right/right-arrow.svg +3 -3
- package/src/components/toolbar/components/navigation/index.tsx +36 -36
- package/src/components/toolbar/index.tsx +55 -55
- package/src/hooks/useDeepEffect.tsx +22 -22
- package/src/hooks/useDidMountEffect.tsx +13 -13
- package/src/hooks/useOnOutsideClick.tsx +31 -31
- package/src/hooks/useToast.tsx +16 -16
- package/src/index.tsx +78 -78
- package/src/theme/components/alert.ts +60 -60
- package/src/theme/components/badge.ts +59 -59
- package/src/theme/components/button.ts +163 -163
- package/src/theme/components/checkbox.ts +28 -28
- package/src/theme/components/code.ts +16 -16
- package/src/theme/components/form-error.ts +31 -31
- package/src/theme/components/form-label.ts +17 -17
- package/src/theme/components/form.ts +29 -29
- package/src/theme/components/input.ts +65 -65
- package/src/theme/components/link.ts +118 -118
- package/src/theme/components/modal.ts +45 -45
- package/src/theme/components/select.ts +36 -36
- package/src/theme/components/switch.ts +89 -89
- package/src/theme/components/table.ts +42 -42
- package/src/theme/components/tabs.ts +255 -255
- package/src/theme/components/text.ts +93 -93
- package/src/theme/components/textarea.ts +42 -42
- package/src/theme/customXQChakraTheme.ts +54 -54
- package/src/theme/foundations/breakpoints.ts +18 -18
- package/src/theme/foundations/colors.ts +165 -165
- package/src/theme/foundations/shadows.ts +23 -23
- package/src/theme/foundations/typography.ts +62 -62
- package/src/theme/provider/index.tsx +21 -21
- package/src/theme/styles.ts +19 -19
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Flex, IconButton, Spinner } from '@chakra-ui/react';
|
|
3
|
-
import { HiOutlineRefresh } from 'react-icons/hi';
|
|
4
|
-
import colors from '../../../../theme/foundations/colors';
|
|
5
|
-
import typography from '../../../../theme/foundations/typography';
|
|
6
|
-
|
|
7
|
-
interface TableLoadingRowsProps {
|
|
8
|
-
isLoading: boolean;
|
|
9
|
-
onLoadMore: () => void;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* A loading spinner rendered after the table to indicate more rows are being loaded.
|
|
14
|
-
*/
|
|
15
|
-
export const TableLoadingRows: React.FC<TableLoadingRowsProps> = ({
|
|
16
|
-
isLoading,
|
|
17
|
-
onLoadMore,
|
|
18
|
-
}) => {
|
|
19
|
-
return (
|
|
20
|
-
<Flex
|
|
21
|
-
width="full"
|
|
22
|
-
direction="column"
|
|
23
|
-
justifyContent="center"
|
|
24
|
-
alignItems="center"
|
|
25
|
-
height={20}
|
|
26
|
-
borderTopColor={colors.fill.light.quaternary}
|
|
27
|
-
>
|
|
28
|
-
{isLoading ? (
|
|
29
|
-
<Spinner size="lg" color={colors.fill.action} />
|
|
30
|
-
) : (
|
|
31
|
-
<IconButton
|
|
32
|
-
aria-label="Fetch more rows"
|
|
33
|
-
icon={<HiOutlineRefresh />}
|
|
34
|
-
fontSize={typography.fontSizes['3xl']}
|
|
35
|
-
bg="transparent"
|
|
36
|
-
shadow="none"
|
|
37
|
-
color={colors.fill.action}
|
|
38
|
-
type="button"
|
|
39
|
-
variant="outline"
|
|
40
|
-
onClick={onLoadMore}
|
|
41
|
-
/>
|
|
42
|
-
)}
|
|
43
|
-
</Flex>
|
|
44
|
-
);
|
|
45
|
-
};
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Flex, IconButton, Spinner } from '@chakra-ui/react';
|
|
3
|
+
import { HiOutlineRefresh } from 'react-icons/hi';
|
|
4
|
+
import colors from '../../../../theme/foundations/colors';
|
|
5
|
+
import typography from '../../../../theme/foundations/typography';
|
|
6
|
+
|
|
7
|
+
interface TableLoadingRowsProps {
|
|
8
|
+
isLoading: boolean;
|
|
9
|
+
onLoadMore: () => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* A loading spinner rendered after the table to indicate more rows are being loaded.
|
|
14
|
+
*/
|
|
15
|
+
export const TableLoadingRows: React.FC<TableLoadingRowsProps> = ({
|
|
16
|
+
isLoading,
|
|
17
|
+
onLoadMore,
|
|
18
|
+
}) => {
|
|
19
|
+
return (
|
|
20
|
+
<Flex
|
|
21
|
+
width="full"
|
|
22
|
+
direction="column"
|
|
23
|
+
justifyContent="center"
|
|
24
|
+
alignItems="center"
|
|
25
|
+
height={20}
|
|
26
|
+
borderTopColor={colors.fill.light.quaternary}
|
|
27
|
+
>
|
|
28
|
+
{isLoading ? (
|
|
29
|
+
<Spinner size="lg" color={colors.fill.action} />
|
|
30
|
+
) : (
|
|
31
|
+
<IconButton
|
|
32
|
+
aria-label="Fetch more rows"
|
|
33
|
+
icon={<HiOutlineRefresh />}
|
|
34
|
+
fontSize={typography.fontSizes['3xl']}
|
|
35
|
+
bg="transparent"
|
|
36
|
+
shadow="none"
|
|
37
|
+
color={colors.fill.action}
|
|
38
|
+
type="button"
|
|
39
|
+
variant="outline"
|
|
40
|
+
onClick={onLoadMore}
|
|
41
|
+
/>
|
|
42
|
+
)}
|
|
43
|
+
</Flex>
|
|
44
|
+
);
|
|
45
|
+
};
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Box, Text } from '@chakra-ui/react';
|
|
3
|
-
import colors from '../../../../../src/theme/foundations/colors';
|
|
4
|
-
|
|
5
|
-
export interface TableTextProps {
|
|
6
|
-
primaryText: string;
|
|
7
|
-
secondaryText?: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* A functional React component utilized to render the `TableText` component
|
|
12
|
-
*/
|
|
13
|
-
export const TableText: React.FC<TableTextProps> = ({
|
|
14
|
-
primaryText,
|
|
15
|
-
secondaryText,
|
|
16
|
-
}) => {
|
|
17
|
-
return (
|
|
18
|
-
<Box>
|
|
19
|
-
<Text color={colors.label.primary.light}>{primaryText}</Text>
|
|
20
|
-
<Text color={colors.label.secondary.light}>{secondaryText}</Text>
|
|
21
|
-
</Box>
|
|
22
|
-
);
|
|
23
|
-
};
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Box, Text } from '@chakra-ui/react';
|
|
3
|
+
import colors from '../../../../../src/theme/foundations/colors';
|
|
4
|
+
|
|
5
|
+
export interface TableTextProps {
|
|
6
|
+
primaryText: string;
|
|
7
|
+
secondaryText?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* A functional React component utilized to render the `TableText` component
|
|
12
|
+
*/
|
|
13
|
+
export const TableText: React.FC<TableTextProps> = ({
|
|
14
|
+
primaryText,
|
|
15
|
+
secondaryText,
|
|
16
|
+
}) => {
|
|
17
|
+
return (
|
|
18
|
+
<Box>
|
|
19
|
+
<Text color={colors.label.primary.light}>{primaryText}</Text>
|
|
20
|
+
<Text color={colors.label.secondary.light}>{secondaryText}</Text>
|
|
21
|
+
</Box>
|
|
22
|
+
);
|
|
23
|
+
};
|
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Table as ChakraTable, Tbody, Td, Tr } from '@chakra-ui/react';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* A React component utilized to render the `EmptyTable` component
|
|
6
|
-
*/
|
|
7
|
-
export const EmptyTable: React.FC = () => {
|
|
8
|
-
const getOpacity = (index: number) => {
|
|
9
|
-
switch (index) {
|
|
10
|
-
case 1:
|
|
11
|
-
return 0.7;
|
|
12
|
-
case 3:
|
|
13
|
-
return 0.6;
|
|
14
|
-
case 5:
|
|
15
|
-
return 0.5;
|
|
16
|
-
case 7:
|
|
17
|
-
return 0.4;
|
|
18
|
-
case 9:
|
|
19
|
-
return 0.3;
|
|
20
|
-
case 11:
|
|
21
|
-
return 0.2;
|
|
22
|
-
case 13:
|
|
23
|
-
return 0.1;
|
|
24
|
-
default:
|
|
25
|
-
return 1;
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
return (
|
|
30
|
-
<ChakraTable
|
|
31
|
-
variant="unstyled"
|
|
32
|
-
width="100%"
|
|
33
|
-
style={{
|
|
34
|
-
borderCollapse: 'separate',
|
|
35
|
-
borderSpacing: '0px',
|
|
36
|
-
}}
|
|
37
|
-
>
|
|
38
|
-
<Tbody>
|
|
39
|
-
{Array.from({ length: 14 }, (_, i) => i + 1).map(i => (
|
|
40
|
-
<Tr key={i}>
|
|
41
|
-
<Td height="26px" opacity={getOpacity(i)}></Td>
|
|
42
|
-
</Tr>
|
|
43
|
-
))}
|
|
44
|
-
</Tbody>
|
|
45
|
-
</ChakraTable>
|
|
46
|
-
);
|
|
47
|
-
};
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Table as ChakraTable, Tbody, Td, Tr } from '@chakra-ui/react';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A React component utilized to render the `EmptyTable` component
|
|
6
|
+
*/
|
|
7
|
+
export const EmptyTable: React.FC = () => {
|
|
8
|
+
const getOpacity = (index: number) => {
|
|
9
|
+
switch (index) {
|
|
10
|
+
case 1:
|
|
11
|
+
return 0.7;
|
|
12
|
+
case 3:
|
|
13
|
+
return 0.6;
|
|
14
|
+
case 5:
|
|
15
|
+
return 0.5;
|
|
16
|
+
case 7:
|
|
17
|
+
return 0.4;
|
|
18
|
+
case 9:
|
|
19
|
+
return 0.3;
|
|
20
|
+
case 11:
|
|
21
|
+
return 0.2;
|
|
22
|
+
case 13:
|
|
23
|
+
return 0.1;
|
|
24
|
+
default:
|
|
25
|
+
return 1;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
return (
|
|
30
|
+
<ChakraTable
|
|
31
|
+
variant="unstyled"
|
|
32
|
+
width="100%"
|
|
33
|
+
style={{
|
|
34
|
+
borderCollapse: 'separate',
|
|
35
|
+
borderSpacing: '0px',
|
|
36
|
+
}}
|
|
37
|
+
>
|
|
38
|
+
<Tbody>
|
|
39
|
+
{Array.from({ length: 14 }, (_, i) => i + 1).map(i => (
|
|
40
|
+
<Tr key={i}>
|
|
41
|
+
<Td height="26px" opacity={getOpacity(i)}></Td>
|
|
42
|
+
</Tr>
|
|
43
|
+
))}
|
|
44
|
+
</Tbody>
|
|
45
|
+
</ChakraTable>
|
|
46
|
+
);
|
|
47
|
+
};
|
|
@@ -1,84 +1,84 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import {
|
|
3
|
-
ReadonlyTableColumns,
|
|
4
|
-
TableBody,
|
|
5
|
-
TableColumns,
|
|
6
|
-
TableHeaders,
|
|
7
|
-
} from './TableTypes';
|
|
8
|
-
import { generateTableColumnsAsConst } from './utils/generateTableColumns';
|
|
9
|
-
|
|
10
|
-
import {
|
|
11
|
-
Table as ChakraTable,
|
|
12
|
-
TableContainer,
|
|
13
|
-
Tbody,
|
|
14
|
-
Td,
|
|
15
|
-
Th,
|
|
16
|
-
Thead,
|
|
17
|
-
Tr,
|
|
18
|
-
} from '@chakra-ui/react';
|
|
19
|
-
import { TableLoadingRows } from './components/loading';
|
|
20
|
-
import colors from '../../theme/foundations/colors';
|
|
21
|
-
import { EmptyTable } from './empty';
|
|
22
|
-
|
|
23
|
-
export interface TableProps<T extends ReadonlyTableColumns> {
|
|
24
|
-
columns: TableColumns;
|
|
25
|
-
headers?: TableHeaders<T>;
|
|
26
|
-
body: TableBody<T>;
|
|
27
|
-
loading?: boolean;
|
|
28
|
-
loadMore?: () => void;
|
|
29
|
-
placeholder?: string;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* A React component utilized to render the `Table` component
|
|
34
|
-
*/
|
|
35
|
-
export function Table<T extends ReadonlyTableColumns>({
|
|
36
|
-
columns,
|
|
37
|
-
headers,
|
|
38
|
-
body,
|
|
39
|
-
loading,
|
|
40
|
-
loadMore,
|
|
41
|
-
}: TableProps<T>) {
|
|
42
|
-
const columnsAsConst = generateTableColumnsAsConst(columns);
|
|
43
|
-
|
|
44
|
-
return (
|
|
45
|
-
<TableContainer border="none" overflowX="auto" bg="white" width="100%">
|
|
46
|
-
{body.length ? (
|
|
47
|
-
<ChakraTable
|
|
48
|
-
variant="unstyled"
|
|
49
|
-
width="100%"
|
|
50
|
-
style={{
|
|
51
|
-
borderCollapse: 'separate',
|
|
52
|
-
borderSpacing: '0px',
|
|
53
|
-
}}
|
|
54
|
-
>
|
|
55
|
-
{headers && (
|
|
56
|
-
<Thead>
|
|
57
|
-
<Tr _odd={{ bg: colors.label.primary.dark }}>
|
|
58
|
-
{columnsAsConst.map((column, idx) => (
|
|
59
|
-
// @ts-ignore
|
|
60
|
-
<Th key={idx}>{headers[column]}</Th>
|
|
61
|
-
))}
|
|
62
|
-
</Tr>
|
|
63
|
-
</Thead>
|
|
64
|
-
)}
|
|
65
|
-
<Tbody>
|
|
66
|
-
{body.map((row, idx) => (
|
|
67
|
-
<Tr key={idx}>
|
|
68
|
-
{columnsAsConst.map((column, idx) => (
|
|
69
|
-
// @ts-ignore
|
|
70
|
-
<Td key={idx}>{row[column]}</Td>
|
|
71
|
-
))}
|
|
72
|
-
</Tr>
|
|
73
|
-
))}
|
|
74
|
-
</Tbody>
|
|
75
|
-
</ChakraTable>
|
|
76
|
-
) : (
|
|
77
|
-
<EmptyTable />
|
|
78
|
-
)}
|
|
79
|
-
{loadMore && loading !== undefined && body.length ? (
|
|
80
|
-
<TableLoadingRows isLoading={loading} onLoadMore={loadMore} />
|
|
81
|
-
) : null}
|
|
82
|
-
</TableContainer>
|
|
83
|
-
);
|
|
84
|
-
}
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
ReadonlyTableColumns,
|
|
4
|
+
TableBody,
|
|
5
|
+
TableColumns,
|
|
6
|
+
TableHeaders,
|
|
7
|
+
} from './TableTypes';
|
|
8
|
+
import { generateTableColumnsAsConst } from './utils/generateTableColumns';
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
Table as ChakraTable,
|
|
12
|
+
TableContainer,
|
|
13
|
+
Tbody,
|
|
14
|
+
Td,
|
|
15
|
+
Th,
|
|
16
|
+
Thead,
|
|
17
|
+
Tr,
|
|
18
|
+
} from '@chakra-ui/react';
|
|
19
|
+
import { TableLoadingRows } from './components/loading';
|
|
20
|
+
import colors from '../../theme/foundations/colors';
|
|
21
|
+
import { EmptyTable } from './empty';
|
|
22
|
+
|
|
23
|
+
export interface TableProps<T extends ReadonlyTableColumns> {
|
|
24
|
+
columns: TableColumns;
|
|
25
|
+
headers?: TableHeaders<T>;
|
|
26
|
+
body: TableBody<T>;
|
|
27
|
+
loading?: boolean;
|
|
28
|
+
loadMore?: () => void;
|
|
29
|
+
placeholder?: string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* A React component utilized to render the `Table` component
|
|
34
|
+
*/
|
|
35
|
+
export function Table<T extends ReadonlyTableColumns>({
|
|
36
|
+
columns,
|
|
37
|
+
headers,
|
|
38
|
+
body,
|
|
39
|
+
loading,
|
|
40
|
+
loadMore,
|
|
41
|
+
}: TableProps<T>) {
|
|
42
|
+
const columnsAsConst = generateTableColumnsAsConst(columns);
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<TableContainer border="none" overflowX="auto" bg="white" width="100%">
|
|
46
|
+
{body.length ? (
|
|
47
|
+
<ChakraTable
|
|
48
|
+
variant="unstyled"
|
|
49
|
+
width="100%"
|
|
50
|
+
style={{
|
|
51
|
+
borderCollapse: 'separate',
|
|
52
|
+
borderSpacing: '0px',
|
|
53
|
+
}}
|
|
54
|
+
>
|
|
55
|
+
{headers && (
|
|
56
|
+
<Thead>
|
|
57
|
+
<Tr _odd={{ bg: colors.label.primary.dark }}>
|
|
58
|
+
{columnsAsConst.map((column, idx) => (
|
|
59
|
+
// @ts-ignore
|
|
60
|
+
<Th key={idx}>{headers[column]}</Th>
|
|
61
|
+
))}
|
|
62
|
+
</Tr>
|
|
63
|
+
</Thead>
|
|
64
|
+
)}
|
|
65
|
+
<Tbody>
|
|
66
|
+
{body.map((row, idx) => (
|
|
67
|
+
<Tr key={idx}>
|
|
68
|
+
{columnsAsConst.map((column, idx) => (
|
|
69
|
+
// @ts-ignore
|
|
70
|
+
<Td key={idx}>{row[column]}</Td>
|
|
71
|
+
))}
|
|
72
|
+
</Tr>
|
|
73
|
+
))}
|
|
74
|
+
</Tbody>
|
|
75
|
+
</ChakraTable>
|
|
76
|
+
) : (
|
|
77
|
+
<EmptyTable />
|
|
78
|
+
)}
|
|
79
|
+
{loadMore && loading !== undefined && body.length ? (
|
|
80
|
+
<TableLoadingRows isLoading={loading} onLoadMore={loadMore} />
|
|
81
|
+
) : null}
|
|
82
|
+
</TableContainer>
|
|
83
|
+
);
|
|
84
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { TableColumns } from '../TableTypes';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* This function is responsible for returning an array as a const, so the generic type `TableBody`
|
|
5
|
-
* may accept it as an argument and use the elements of the array as keys.
|
|
6
|
-
*/
|
|
7
|
-
export function generateTableColumnsAsConst<T extends TableColumns>(arr: T) {
|
|
8
|
-
return [...arr] as const;
|
|
9
|
-
}
|
|
1
|
+
import { TableColumns } from '../TableTypes';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* This function is responsible for returning an array as a const, so the generic type `TableBody`
|
|
5
|
+
* may accept it as an argument and use the elements of the array as keys.
|
|
6
|
+
*/
|
|
7
|
+
export function generateTableColumnsAsConst<T extends TableColumns>(arr: T) {
|
|
8
|
+
return [...arr] as const;
|
|
9
|
+
}
|
|
@@ -1,85 +1,85 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Meta, Story } from '@storybook/react';
|
|
3
|
-
import { Text } from '../text';
|
|
4
|
-
import { Table, TableProps } from '../table';
|
|
5
|
-
import { TableBody, TableHeaders } from '../table/TableTypes';
|
|
6
|
-
import { useMemo, useState } from '@storybook/addons';
|
|
7
|
-
import { TabsWrapper, TabsWrapperProps } from '.';
|
|
8
|
-
|
|
9
|
-
const tableColumns = ['foo', 'bar'];
|
|
10
|
-
|
|
11
|
-
const tableHeaders: TableHeaders<typeof tableColumns> = {
|
|
12
|
-
foo: <Text variant="header">FOO</Text>,
|
|
13
|
-
bar: <Text variant="header">BAR</Text>,
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
const tableBody: TableBody<typeof tableColumns> = [
|
|
17
|
-
{ foo: 'hi', bar: 'hey' },
|
|
18
|
-
{ foo: 'hello', bar: 'howdy' },
|
|
19
|
-
{ foo: 'hiya', bar: 'hola' },
|
|
20
|
-
];
|
|
21
|
-
|
|
22
|
-
const meta: Meta<TabsWrapperProps> = {
|
|
23
|
-
title: 'Table Nav example',
|
|
24
|
-
component: TabsWrapper,
|
|
25
|
-
argTypes: {
|
|
26
|
-
navIndex: {
|
|
27
|
-
control: 'none',
|
|
28
|
-
description: 'The index of the tab - 0th indexed starting on the left',
|
|
29
|
-
},
|
|
30
|
-
setNavIndex: {
|
|
31
|
-
description: 'The handler for setting the index of the tab list',
|
|
32
|
-
},
|
|
33
|
-
navItems: {
|
|
34
|
-
control: 'none',
|
|
35
|
-
description:
|
|
36
|
-
'The list of nav items to be displayed as tabs in the tab list',
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
parameters: {
|
|
40
|
-
controls: { expanded: true },
|
|
41
|
-
},
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
enum Foo {
|
|
45
|
-
ALL = 0,
|
|
46
|
-
GREATER_THAN_THREE = 1,
|
|
47
|
-
LESS_THAN_THREE = 2,
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export default meta;
|
|
51
|
-
const Template: Story<TableProps<typeof tableColumns>> = args => {
|
|
52
|
-
const [index, setIndex] = useState(Foo.ALL);
|
|
53
|
-
|
|
54
|
-
const body = useMemo(() => {
|
|
55
|
-
if (index === Foo.GREATER_THAN_THREE) {
|
|
56
|
-
return tableBody.filter(item => (item.foo as string).length > 3);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (index === Foo.LESS_THAN_THREE) {
|
|
60
|
-
return tableBody.filter(item => (item.foo as string).length < 3);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return tableBody;
|
|
64
|
-
}, [index]);
|
|
65
|
-
|
|
66
|
-
return (
|
|
67
|
-
<TabsWrapper
|
|
68
|
-
navItems={['All', 'Foo > 3', 'Foo < 3']}
|
|
69
|
-
navIndex={index}
|
|
70
|
-
setNavIndex={(index: number) => setIndex(index)}
|
|
71
|
-
>
|
|
72
|
-
<Table
|
|
73
|
-
{...args}
|
|
74
|
-
body={body}
|
|
75
|
-
borderTopRadius={false}
|
|
76
|
-
headers={tableHeaders}
|
|
77
|
-
columns={tableColumns}
|
|
78
|
-
/>
|
|
79
|
-
</TabsWrapper>
|
|
80
|
-
);
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
export const Default = Template.bind({});
|
|
84
|
-
|
|
85
|
-
Default.args = {};
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Meta, Story } from '@storybook/react';
|
|
3
|
+
import { Text } from '../text';
|
|
4
|
+
import { Table, TableProps } from '../table';
|
|
5
|
+
import { TableBody, TableHeaders } from '../table/TableTypes';
|
|
6
|
+
import { useMemo, useState } from '@storybook/addons';
|
|
7
|
+
import { TabsWrapper, TabsWrapperProps } from '.';
|
|
8
|
+
|
|
9
|
+
const tableColumns = ['foo', 'bar'];
|
|
10
|
+
|
|
11
|
+
const tableHeaders: TableHeaders<typeof tableColumns> = {
|
|
12
|
+
foo: <Text variant="header">FOO</Text>,
|
|
13
|
+
bar: <Text variant="header">BAR</Text>,
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const tableBody: TableBody<typeof tableColumns> = [
|
|
17
|
+
{ foo: 'hi', bar: 'hey' },
|
|
18
|
+
{ foo: 'hello', bar: 'howdy' },
|
|
19
|
+
{ foo: 'hiya', bar: 'hola' },
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
const meta: Meta<TabsWrapperProps> = {
|
|
23
|
+
title: 'Table Nav example',
|
|
24
|
+
component: TabsWrapper,
|
|
25
|
+
argTypes: {
|
|
26
|
+
navIndex: {
|
|
27
|
+
control: 'none',
|
|
28
|
+
description: 'The index of the tab - 0th indexed starting on the left',
|
|
29
|
+
},
|
|
30
|
+
setNavIndex: {
|
|
31
|
+
description: 'The handler for setting the index of the tab list',
|
|
32
|
+
},
|
|
33
|
+
navItems: {
|
|
34
|
+
control: 'none',
|
|
35
|
+
description:
|
|
36
|
+
'The list of nav items to be displayed as tabs in the tab list',
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
parameters: {
|
|
40
|
+
controls: { expanded: true },
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
enum Foo {
|
|
45
|
+
ALL = 0,
|
|
46
|
+
GREATER_THAN_THREE = 1,
|
|
47
|
+
LESS_THAN_THREE = 2,
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export default meta;
|
|
51
|
+
const Template: Story<TableProps<typeof tableColumns>> = args => {
|
|
52
|
+
const [index, setIndex] = useState(Foo.ALL);
|
|
53
|
+
|
|
54
|
+
const body = useMemo(() => {
|
|
55
|
+
if (index === Foo.GREATER_THAN_THREE) {
|
|
56
|
+
return tableBody.filter(item => (item.foo as string).length > 3);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (index === Foo.LESS_THAN_THREE) {
|
|
60
|
+
return tableBody.filter(item => (item.foo as string).length < 3);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return tableBody;
|
|
64
|
+
}, [index]);
|
|
65
|
+
|
|
66
|
+
return (
|
|
67
|
+
<TabsWrapper
|
|
68
|
+
navItems={['All', 'Foo > 3', 'Foo < 3']}
|
|
69
|
+
navIndex={index}
|
|
70
|
+
setNavIndex={(index: number) => setIndex(index)}
|
|
71
|
+
>
|
|
72
|
+
<Table
|
|
73
|
+
{...args}
|
|
74
|
+
body={body}
|
|
75
|
+
borderTopRadius={false}
|
|
76
|
+
headers={tableHeaders}
|
|
77
|
+
columns={tableColumns}
|
|
78
|
+
/>
|
|
79
|
+
</TabsWrapper>
|
|
80
|
+
);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export const Default = Template.bind({});
|
|
84
|
+
|
|
85
|
+
Default.args = {};
|
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
import React, { PropsWithChildren, ReactNode } from 'react';
|
|
2
|
-
import { Tab, TabList, Tabs } from '@chakra-ui/react';
|
|
3
|
-
import colors from '../../theme/foundations/colors';
|
|
4
|
-
|
|
5
|
-
export interface TabsWrapperProps extends PropsWithChildren {
|
|
6
|
-
navIndex: number;
|
|
7
|
-
setNavIndex: (index: number) => void;
|
|
8
|
-
navItems: ReactNode[];
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* A functional React component utilized to render the `TableNavWrapper` component
|
|
13
|
-
*/
|
|
14
|
-
export const TabsWrapper: React.FC<TabsWrapperProps> = ({
|
|
15
|
-
children,
|
|
16
|
-
navItems,
|
|
17
|
-
navIndex,
|
|
18
|
-
setNavIndex,
|
|
19
|
-
}) => {
|
|
20
|
-
return (
|
|
21
|
-
<Tabs size="lg" variant="simple" index={navIndex} onChange={setNavIndex}>
|
|
22
|
-
<TabList
|
|
23
|
-
flexDirection={{ base: 'column', sm: 'row' }}
|
|
24
|
-
border="1px"
|
|
25
|
-
borderColor={colors.fill.light.quaternary}
|
|
26
|
-
bg="white"
|
|
27
|
-
borderRadius="md"
|
|
28
|
-
borderBottom={0}
|
|
29
|
-
borderBottomLeftRadius={0}
|
|
30
|
-
borderBottomRightRadius={0}
|
|
31
|
-
>
|
|
32
|
-
{navItems.map((navItem, idx) => (
|
|
33
|
-
<Tab key={idx}>{navItem}</Tab>
|
|
34
|
-
))}
|
|
35
|
-
</TabList>
|
|
36
|
-
{children}
|
|
37
|
-
</Tabs>
|
|
38
|
-
);
|
|
39
|
-
};
|
|
1
|
+
import React, { PropsWithChildren, ReactNode } from 'react';
|
|
2
|
+
import { Tab, TabList, Tabs } from '@chakra-ui/react';
|
|
3
|
+
import colors from '../../theme/foundations/colors';
|
|
4
|
+
|
|
5
|
+
export interface TabsWrapperProps extends PropsWithChildren {
|
|
6
|
+
navIndex: number;
|
|
7
|
+
setNavIndex: (index: number) => void;
|
|
8
|
+
navItems: ReactNode[];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* A functional React component utilized to render the `TableNavWrapper` component
|
|
13
|
+
*/
|
|
14
|
+
export const TabsWrapper: React.FC<TabsWrapperProps> = ({
|
|
15
|
+
children,
|
|
16
|
+
navItems,
|
|
17
|
+
navIndex,
|
|
18
|
+
setNavIndex,
|
|
19
|
+
}) => {
|
|
20
|
+
return (
|
|
21
|
+
<Tabs size="lg" variant="simple" index={navIndex} onChange={setNavIndex}>
|
|
22
|
+
<TabList
|
|
23
|
+
flexDirection={{ base: 'column', sm: 'row' }}
|
|
24
|
+
border="1px"
|
|
25
|
+
borderColor={colors.fill.light.quaternary}
|
|
26
|
+
bg="white"
|
|
27
|
+
borderRadius="md"
|
|
28
|
+
borderBottom={0}
|
|
29
|
+
borderBottomLeftRadius={0}
|
|
30
|
+
borderBottomRightRadius={0}
|
|
31
|
+
>
|
|
32
|
+
{navItems.map((navItem, idx) => (
|
|
33
|
+
<Tab key={idx}>{navItem}</Tab>
|
|
34
|
+
))}
|
|
35
|
+
</TabList>
|
|
36
|
+
{children}
|
|
37
|
+
</Tabs>
|
|
38
|
+
);
|
|
39
|
+
};
|