diff --git a/apps/web/src/app/app.tsx b/apps/web/src/app/app.tsx index 273f78098..fc62118e6 100644 --- a/apps/web/src/app/app.tsx +++ b/apps/web/src/app/app.tsx @@ -1,10 +1,11 @@ import { WebShellFeature } from '@kin-kinetic/web/shell/feature' import { SaasProvider } from '@saas-ui/react' - +import { Toaster } from '@kin-kinetic/web/ui/toaster' export function App() { return ( + ) } diff --git a/libs/web/ui/copy/src/lib/web-ui-copy.tsx b/libs/web/ui/copy/src/lib/web-ui-copy.tsx index 976696298..6cf645ad6 100644 --- a/libs/web/ui/copy/src/lib/web-ui-copy.tsx +++ b/libs/web/ui/copy/src/lib/web-ui-copy.tsx @@ -1,33 +1,32 @@ -import { Button, Text, Tooltip, useClipboard, useToast } from '@chakra-ui/react' +import { Tooltip } from '@kin-kinetic/web/ui/tooltip' +import { Button, Text, useClipboard } from '@chakra-ui/react' +import { toaster } from '@kin-kinetic/web/ui/toaster' import { IconCopy } from '@tabler/icons' import { ReactNode } from 'react' export interface WebUiCopyProps { - disabled?: boolean + isDisabled?: boolean label?: ReactNode size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' text?: string } -export function WebUiCopy({ disabled, label, size = 'sm', text = '' }: WebUiCopyProps) { +export function WebUiCopy({ isDisabled, label, size = 'sm', text = '' }: WebUiCopyProps) { const { onCopy } = useClipboard(text) - const toast = useToast() const handleCopy = () => { onCopy() - toast({ - status: 'info', - title: `Copied ${text.length} characters to clipboard`, - duration: 2000, - isClosable: true, + toaster.create({ + type: 'info', + description: `Copied ${text.length} characters to clipboard`, }) } return ( - - + + - {label ? typeof label === 'string' ? {label} : label : null} + {label && (typeof label === 'string' ? {label} : label)} ) diff --git a/libs/web/ui/table/src/lib/web-ui-table-paginator.tsx b/libs/web/ui/table/src/lib/web-ui-table-paginator.tsx index 36a605f39..2b1e28b5d 100644 --- a/libs/web/ui/table/src/lib/web-ui-table-paginator.tsx +++ b/libs/web/ui/table/src/lib/web-ui-table-paginator.tsx @@ -8,7 +8,6 @@ import { } from '@ajna/pagination' import { Flex, SimpleGrid } from '@chakra-ui/react' import { WebUiTablePaginatorPageSize } from './web-ui-table-paginator-page.size' - export function WebUiTablePaginator({ currentPage, setPage, @@ -38,7 +37,7 @@ export function WebUiTablePaginator({ bg: 'primary.500', }} key={`pagination_page_${page}`} - page={page} + page={page as any} /> ))} diff --git a/libs/web/ui/table/src/lib/web-ui-table.tsx b/libs/web/ui/table/src/lib/web-ui-table.tsx index 39a4dd6e3..d3c77b7ae 100644 --- a/libs/web/ui/table/src/lib/web-ui-table.tsx +++ b/libs/web/ui/table/src/lib/web-ui-table.tsx @@ -1,4 +1,5 @@ -import { Table, TableContainer, Tbody, Td, Tfoot, Th, Thead, Tr, useColorModeValue } from '@chakra-ui/react' +import { Table } from '@chakra-ui/react' +import { useColorModeValue } from '@chakra-ui/system' import { ReactNode } from 'react' import { useNavigate } from 'react-router-dom' @@ -33,45 +34,45 @@ export function WebUiTable - - - columns={columns} /> - - - {data.map((item: T) => ( - navigate(item.id || '')} - key={item.id} - _hover={{ - background: rowBgColor, - cursor: 'pointer', - }} - > - {columns.map((field) => ( - - {field.render ? field.render(item) : (item[field.key as string] as ReactNode)} - - ))} - - ))} - - - columns={columns} /> - - - + + + columns={columns} /> + + + + {data.map((item: T) => ( + navigate(item.id || '')} + key={item.id} + _hover={{ + bg: rowBgColor, + cursor: 'pointer', + }} + > + {columns.map((field) => ( + + {field.render ? field.render(item) : (item[field.key as string] as ReactNode)} + + ))} + + ))} + + + + columns={columns} /> + + ) } function WebUiTableHeader({ columns }: { columns: WebUiTableColumn[] }) { return ( - + {columns?.map((field) => ( - + {field.label} - + ))} - + ) } diff --git a/libs/web/ui/toaster/.babelrc b/libs/web/ui/toaster/.babelrc new file mode 100644 index 000000000..ccae900be --- /dev/null +++ b/libs/web/ui/toaster/.babelrc @@ -0,0 +1,12 @@ +{ + "presets": [ + [ + "@nrwl/react/babel", + { + "runtime": "automatic", + "useBuiltIns": "usage" + } + ] + ], + "plugins": [] +} diff --git a/libs/web/ui/toaster/.eslintrc.json b/libs/web/ui/toaster/.eslintrc.json new file mode 100644 index 000000000..3cd642175 --- /dev/null +++ b/libs/web/ui/toaster/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["plugin:@nrwl/nx/react", "../../../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/libs/web/ui/toaster/README.md b/libs/web/ui/toaster/README.md new file mode 100644 index 000000000..e9c6c63bf --- /dev/null +++ b/libs/web/ui/toaster/README.md @@ -0,0 +1,7 @@ +# web-ui-toaster + +This library was generated with [Nx](https://nx.dev). + +## Running unit tests + +Run `nx test web-ui-toaster` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/libs/web/ui/toaster/jest.config.ts b/libs/web/ui/toaster/jest.config.ts new file mode 100644 index 000000000..37665d7c5 --- /dev/null +++ b/libs/web/ui/toaster/jest.config.ts @@ -0,0 +1,11 @@ +/* eslint-disable */ +export default { + displayName: 'web-ui-toaster', + preset: '../../../../jest.preset.js', + transform: { + '^(?!.*\\.(js|jsx|ts|tsx|css|json)$)': '@nrwl/react/plugins/jest', + '^.+\\.[tj]sx?$': ['babel-jest', { presets: ['@nrwl/react/babel'] }], + }, + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], + coverageDirectory: '../../../../coverage/libs/web/ui/toaster', +} diff --git a/libs/web/ui/toaster/project.json b/libs/web/ui/toaster/project.json new file mode 100644 index 000000000..96a696a2e --- /dev/null +++ b/libs/web/ui/toaster/project.json @@ -0,0 +1,24 @@ +{ + "name": "web-ui-toaster", + "$schema": "../../../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "libs/web/ui/toaster/src", + "projectType": "library", + "tags": [], + "targets": { + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["libs/web/ui/toaster/**/*.{ts,tsx,js,jsx}"] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "libs/web/ui/toaster/jest.config.ts", + "passWithNoTests": true + } + } + } +} diff --git a/libs/web/ui/toaster/src/index.ts b/libs/web/ui/toaster/src/index.ts new file mode 100644 index 000000000..086e92487 --- /dev/null +++ b/libs/web/ui/toaster/src/index.ts @@ -0,0 +1 @@ +export * from './lib/web-ui-toaster' diff --git a/libs/web/ui/toaster/src/lib/web-ui-toaster.spec.tsx b/libs/web/ui/toaster/src/lib/web-ui-toaster.spec.tsx new file mode 100644 index 000000000..ceb47f819 --- /dev/null +++ b/libs/web/ui/toaster/src/lib/web-ui-toaster.spec.tsx @@ -0,0 +1,10 @@ +import { render } from '@testing-library/react' + +import WebUiToaster from './web-ui-toaster' + +describe('WebUiToaster', () => { + it('should render successfully', () => { + const { baseElement } = render() + expect(baseElement).toBeTruthy() + }) +}) diff --git a/libs/web/ui/toaster/src/lib/web-ui-toaster.tsx b/libs/web/ui/toaster/src/lib/web-ui-toaster.tsx new file mode 100644 index 000000000..f1c78ee88 --- /dev/null +++ b/libs/web/ui/toaster/src/lib/web-ui-toaster.tsx @@ -0,0 +1,26 @@ +import { Toaster as ChakraToaster, Portal, Spinner, Stack, Toast, createToaster } from '@chakra-ui/react' + +export const toaster = createToaster({ + placement: 'bottom-end', + pauseOnPageIdle: true, +}) + +export const Toaster = () => { + return ( + + + {(toast: any) => ( + + {toast.type === 'loading' ? : } + + {toast.title && {toast.title}} + {toast.description && {toast.description}} + + {toast.action && {toast.action.label}} + {toast.closable && } + + )} + + + ) +} diff --git a/libs/web/ui/toaster/tsconfig.json b/libs/web/ui/toaster/tsconfig.json new file mode 100644 index 000000000..c88d07dad --- /dev/null +++ b/libs/web/ui/toaster/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": false, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ], + "extends": "../../../../tsconfig.base.json" +} diff --git a/libs/web/ui/toaster/tsconfig.lib.json b/libs/web/ui/toaster/tsconfig.lib.json new file mode 100644 index 000000000..e485a7b54 --- /dev/null +++ b/libs/web/ui/toaster/tsconfig.lib.json @@ -0,0 +1,23 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "types": ["node"] + }, + "files": [ + "../../../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../../../node_modules/@nrwl/react/typings/image.d.ts" + ], + "exclude": [ + "jest.config.ts", + "src/**/*.spec.ts", + "src/**/*.test.ts", + "src/**/*.spec.tsx", + "src/**/*.test.tsx", + "src/**/*.spec.js", + "src/**/*.test.js", + "src/**/*.spec.jsx", + "src/**/*.test.jsx" + ], + "include": ["src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"] +} diff --git a/libs/web/ui/toaster/tsconfig.spec.json b/libs/web/ui/toaster/tsconfig.spec.json new file mode 100644 index 000000000..103368636 --- /dev/null +++ b/libs/web/ui/toaster/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.test.tsx", + "src/**/*.spec.tsx", + "src/**/*.test.js", + "src/**/*.spec.js", + "src/**/*.test.jsx", + "src/**/*.spec.jsx", + "src/**/*.d.ts" + ] +} diff --git a/libs/web/ui/tooltip/src/index.ts b/libs/web/ui/tooltip/src/index.ts index 22d526548..6c14f45ce 100644 --- a/libs/web/ui/tooltip/src/index.ts +++ b/libs/web/ui/tooltip/src/index.ts @@ -1 +1,2 @@ +export * from './lib/tooltip/tooltip' export * from './lib/web-ui-tooltip' diff --git a/libs/web/ui/tooltip/src/lib/tooltip/tooltip.spec.tsx b/libs/web/ui/tooltip/src/lib/tooltip/tooltip.spec.tsx new file mode 100644 index 000000000..7917ce24e --- /dev/null +++ b/libs/web/ui/tooltip/src/lib/tooltip/tooltip.spec.tsx @@ -0,0 +1,10 @@ +import { render } from '@testing-library/react' + +import Tooltip from './tooltip' + +describe('Tooltip', () => { + it('should render successfully', () => { + const { baseElement } = render() + expect(baseElement).toBeTruthy() + }) +}) diff --git a/libs/web/ui/tooltip/src/lib/tooltip/tooltip.tsx b/libs/web/ui/tooltip/src/lib/tooltip/tooltip.tsx new file mode 100644 index 000000000..582e1103b --- /dev/null +++ b/libs/web/ui/tooltip/src/lib/tooltip/tooltip.tsx @@ -0,0 +1,35 @@ +import { Tooltip as ChakraTooltip, Portal } from '@chakra-ui/react' +import * as React from 'react' + +export interface TooltipProps extends ChakraTooltip.RootProps { + showArrow?: boolean + portalled?: boolean + portalRef?: React.RefObject + content: React.ReactNode + contentProps?: ChakraTooltip.ContentProps + disabled?: boolean +} + +export const Tooltip = React.forwardRef(function Tooltip(props, ref) { + const { showArrow, children, disabled, portalled = true, content, contentProps, portalRef, ...rest } = props + + if (disabled) return <>{children}> + + return ( + + {children} + + + + {showArrow && ( + + + + )} + {content} + + + + + ) +}) diff --git a/libs/web/ui/tooltip/src/lib/web-ui-tooltip.tsx b/libs/web/ui/tooltip/src/lib/web-ui-tooltip.tsx index 71e21e1f5..01b6bc7f4 100644 --- a/libs/web/ui/tooltip/src/lib/web-ui-tooltip.tsx +++ b/libs/web/ui/tooltip/src/lib/web-ui-tooltip.tsx @@ -1,4 +1,4 @@ -import { Tooltip } from '@chakra-ui/react' +import { Tooltip } from '@kin-kinetic/web/ui/tooltip' import { ReactNode } from 'react' export interface WebUiTooltipProps { diff --git a/nx.json b/nx.json index b9edb4ed9..1abd55039 100644 --- a/nx.json +++ b/nx.json @@ -27,7 +27,8 @@ }, "library": { "style": "css", - "linter": "eslint" + "linter": "eslint", + "unitTestRunner": "jest" } } }, diff --git a/package.json b/package.json index 5a06a6edb..aaecdfea2 100644 --- a/package.json +++ b/package.json @@ -45,15 +45,14 @@ "dependencies": { "@ajna/pagination": "^1.4.19", "@chakra-ui/icons": "^2.0.13", - "@chakra-ui/react": "^2.4.3", + "@chakra-ui/react": "^3.19.1", "@chakra-ui/styled-system": "^2.4.0", "@chakra-ui/system": "^2.3.4", "@chakra-ui/theme": "^2.2.2", "@chakra-ui/theme-tools": "^2.0.14", "@choc-ui/chakra-autocomplete": "^5.1.4", "@choc-ui/paginator": "^3.4.0", - "@emotion/react": "11.10.5", - "@emotion/styled": "11.10.5", + "@emotion/react": "^11.14.0", "@heroicons/react": "^2.0.13", "@nestjs/apollo": "^10.1.7", "@nestjs/axios": "^0.1.0", @@ -103,7 +102,6 @@ "dexie-react-hooks": "^1.1.1", "express": "^4.18.2", "final-form": "^4.20.7", - "framer-motion": "^6", "fs-extra": "^11.1.0", "graphql": "^16.6.0", "graphql-scalars": "^1.20.1", diff --git a/tsconfig.base.json b/tsconfig.base.json index 4371795f5..0706b8ebe 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -86,6 +86,7 @@ "@kin-kinetic/web/ui/loader": ["libs/web/ui/loader/src/index.ts"], "@kin-kinetic/web/ui/page": ["libs/web/ui/page/src/index.ts"], "@kin-kinetic/web/ui/table": ["libs/web/ui/table/src/index.ts"], + "@kin-kinetic/web/ui/toaster": ["libs/web/ui/toaster/src/index.ts"], "@kin-kinetic/web/ui/tooltip": ["libs/web/ui/tooltip/src/index.ts"], "@kin-kinetic/web/util/sdk": ["libs/web/util/sdk/src/index.ts"] }