Skip to content

Commit

Permalink
Merge pull request #464 from omnifed/463-feat-make-filestatus-component
Browse files Browse the repository at this point in the history
463 feat make filestatus component
  • Loading branch information
caseybaggz committed Sep 11, 2024
2 parents 79fb5c6 + 84ec6e6 commit 9aba71d
Show file tree
Hide file tree
Showing 29 changed files with 1,032 additions and 281 deletions.
3 changes: 2 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,6 @@
],
"prettier.configPath": ".prettierrc",
"prettier.prettierPath": "./node_modules/prettier",
"prettier.singleQuote": true
"prettier.singleQuote": true,
"typescript.tsdk": "node_modules/typescript/lib"
}
51 changes: 51 additions & 0 deletions docs/app/react/file-uploader/components/file-status-preview.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
'use client'

import {
FileStatus,
type FileStatusActions,
processStatus,
} from '@cerberus-design/react'
import { vstack } from '@cerberus/styled-system/patterns'
import { useCallback, type MouseEvent } from 'react'

export function UploadingCardsPreview() {
const handleClick = useCallback(
(status: FileStatusActions, e: MouseEvent<HTMLButtonElement>) =>
console.log(status, e),
[],
)

return (
<div
className={vstack({
maxW: '36rem',
w: '3/4',
})}
>
<FileStatus
file="file.txt"
now={0}
onClick={handleClick}
status={processStatus.TODO}
/>
<FileStatus
file="file.txt"
now={50}
onClick={handleClick}
status={processStatus.PROCESSING}
/>
<FileStatus
file="file.txt"
now={100}
onClick={handleClick}
status={processStatus.DONE}
/>
<FileStatus
file="file.txt"
now={0}
onClick={handleClick}
status={processStatus.ERROR}
/>
</div>
)
}
52 changes: 52 additions & 0 deletions docs/app/react/file-uploader/components/live-preview.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
'use client'

import CodeBuilder from '@/app/components/code-builder/code-builder'
import { builder } from '@/app/components/code-builder/helpers'
import { useCodeBuilder } from '@/app/context/code-builder'
import { FileUploader } from '@cerberus-design/react'

const api = {
heading: builder.Text('heading', 'Upload your files'),
name: builder.Text('name', 'add_uuid'),
accept: builder.Text('accept', '.txt'),
}

export function LivePlayground() {
return (
<CodeBuilder api={api}>
<FileUploadPreview />
</CodeBuilder>
)
}

export function LivePlaygroundWithCode() {
return (
<CodeBuilder
api={api}
code={`import { FileUploader, type FileUploaderProps } from '@cerberus-design/react'
export function MyFileUploader(props: FileUploaderProps) {
return (
<FileUploader
accept={{accept}}
heading={{heading}}
name={{name}}
/>
)
}`}
>
<FileUploadPreview />
</CodeBuilder>
)
}

export function FileUploadPreview() {
const { selectedProps } = useCodeBuilder()
return (
<FileUploader
accept={selectedProps.accept as string}
heading={selectedProps.heading as string}
name={selectedProps.file as string}
/>
)
}
127 changes: 127 additions & 0 deletions docs/app/react/file-uploader/components/status-live-preview.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
'use client'

import CodeBuilder from '@/app/components/code-builder/code-builder'
import { builder } from '@/app/components/code-builder/helpers'
import { useCodeBuilder } from '@/app/context/code-builder'
import { FileStatus, processStatus } from '@cerberus-design/react'

const file = 'file.txt'

const api = {
status: builder.Enum('status', [
processStatus.TODO,
processStatus.PROCESSING,
processStatus.DONE,
processStatus.ERROR,
]),
}

export function FileStatusLivePlayground() {
return (
<CodeBuilder api={api}>
<FileStatusPreview />
</CodeBuilder>
)
}

export function FileStatusLivePlaygroundWithCode() {
return (
<CodeBuilder
api={api}
code={`'use client'
import {
FileStatus,
processStatus,
type FileStatusProps,
} from '@cerberus-design/react'
import { useCallback, type MouseEvent } from 'react'
export function MyFileStatus(props: FileStatusProps) {
const handleClick = useCallback((
status: FileStatusActions,
e: MouseEvent<HTMLButtonElement>
) => {
switch (status) {
case processStatus.TODO:
console.log('TODO', e, 'call props.onClick')
break
case processStatus.PROCESSING:
console.log('PROCESSING', e, 'call props.onClick')
break
case processStatus.DONE:
console.log('DONE', e, 'call props.onClick')
break
case processStatus.ERROR:
console.log('ERROR', e, 'call props.onClick')
break
default:
throw new Error('Unknown status passed into handleClick')
}
}, [])
return (
<FileStatus
file={props.file}
now={props.now}
onClick={handleClick}
status={{status}}
/>
)
}`}
>
<FileStatusPreview />
</CodeBuilder>
)
}

export function FileStatusPreview() {
const { selectedProps } = useCodeBuilder()
switch (selectedProps.status) {
case processStatus.TODO:
return (
<FileStatus
file={file}
now={0}
onClick={() => {}}
status={processStatus.TODO}
/>
)
case processStatus.PROCESSING:
return (
<FileStatus
file={file}
now={50}
onClick={() => {}}
status={processStatus.PROCESSING}
/>
)
case processStatus.DONE:
return (
<FileStatus
file={file}
now={100}
onClick={() => {}}
status={processStatus.DONE}
/>
)
case processStatus.ERROR:
return (
<FileStatus
file={file}
now={0}
onClick={() => {}}
status={processStatus.ERROR}
/>
)
default:
return (
<FileStatus
file={file}
now={100}
onClick={() => {}}
status={processStatus.TODO}
/>
)
}
}
63 changes: 44 additions & 19 deletions docs/app/react/file-uploader/dev.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -6,37 +6,36 @@ recipe: 'label.ts'

import CodePreview from '@/app/components/CodePreview'
import {
BasicFileUploader
} from '@/app/react/file-uploader/components/file-uploader-preview'
LivePlaygroundWithCode
} from '@/app/react/file-uploader/components/live-preview'
import {
FileStatusLivePlaygroundWithCode
} from '@/app/react/file-uploader/components/status-live-preview'

```ts
import { FileUploader } from '@cerberus-design/react'
import { FileUploader, FileStatus, processStatus } from '@cerberus-design/react'
```

## Usage
## Uploading Files

<CodePreview preview={<BasicFileUploader />}>
```tsx title="file-uploader.tsx" {5,6}
import { FileUploader } from '@cerberus-design/react'
To allow users to upload files, use the `FileUploader` component.

function BasicFileUploader() {
return (
<FileUploader
accept=".csv,.docx"
heading="Upload Files"
name="basic-example"
/>
)
}
```
</CodePreview>
<LivePlaygroundWithCode />

## File Status

If you choose to process the file, you can use the `FileStatus` component to display the status of the job.

<FileStatusLivePlaygroundWithCode />

## Customizing

To customize the FileUploader, we recommend extending the `fileUploader` slot recipe in your panda config.
To customize the FileUploader or FileStatus, we recommend extending the `fileUploader` or the `fileStatus` slot recipe in your panda config.

## API

### FileUploader

```ts showLineNumbers=false
export interface FileUploaderProps
extends InputHTMLAttributes<HTMLInputElement> {
Expand All @@ -47,6 +46,24 @@ export interface FileUploaderProps
define function FileUploader(props: FileUploaderProps): ReactNode
```

### FileStatus

```ts showLineNumbers=false
export type FileStatusKey = (typeof processStatus)[keyof typeof processStatus]
export type FileStatusActions = 'cancel' | 'retry' | 'delete'
export interface FileBaseStatusProps
extends Omit<HTMLAttributes<HTMLDivElement>, 'onClick'> {
file: string
now: number
status: processStatus
onClick: (status: FileStatusActions, e: MouseEvent<HTMLButtonElement>) => void
}
export type FileStatusProps = FileBaseStatusProps & FileStatusVariantProps
define function FileStatus(props: FileStatusProps): ReactNode
```

### Props

The `FileUploader` component accepts the following props:
Expand All @@ -55,3 +72,11 @@ The `FileUploader` component accepts the following props:
| -------- | ------- | ------------------------------------------------------------- |
| heading | | The heading for the file uploader |
| name | | The unique name of the file uploader |

The `FileStatus` component accepts the following props:

| Name | Default | Description |
| -------- | ------- | ------------------------------------------------------------- |
| file | | The name of the file being processed |
| now | | The current progress of the file upload |
| status | 'todo' | The status of the file upload |
16 changes: 13 additions & 3 deletions docs/app/react/file-uploader/overview.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,11 @@ a11y: 'forms'
import CodePreview from '@/app/components/CodePreview'
import OverviewList from '@/app/components/OverviewList'
import {
BasicFileUploader
} from '@/app/react/file-uploader/components/file-uploader-preview'
LivePlayground
} from '@/app/react/file-uploader/components/live-preview'
import {
UploadingCardsPreview
} from '@/app/react/file-uploader/components/file-status-preview'

<OverviewList rules={[
'Labels should be used to describe the file types that can be uploaded',
Expand All @@ -18,7 +21,14 @@ import {

## Example

<CodePreview preview={<BasicFileUploader />} />
<LivePlayground />

## Processing Uploads

Cerberus provides some visual feedback when you would like to show the status of a file upload.

<CodePreview preview={<UploadingCardsPreview />} />


## Resources

Expand Down
5 changes: 3 additions & 2 deletions docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,9 @@
"@mdx-js/loader": "^3.0.1",
"@mdx-js/react": "^3.0.1",
"@next/mdx": "^14.2.3",
"@pandacss/dev": "^0.45.0",
"@pandacss/preset-panda": "^0.45.0",
"@pandacss/dev": "^0.46.0",
"@pandacss/preset-panda": "^0.46.0",
"@pandacss/types": "^0.46.0",
"@shikijs/rehype": "^1.5.1",
"@shikijs/transformers": "^1.5.1",
"@shikijs/twoslash": "^1.5.1",
Expand Down
8 changes: 5 additions & 3 deletions docs/panda.config.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { defineConfig } from '@pandacss/dev'
import { defineConfig, type Config } from '@pandacss/dev'
import pandaPreset from '@pandacss/preset-panda'
import { cerberusPreset, cerberusConfig } from '@cerberus-design/panda-preset'

export default defineConfig({
const config: Config = {
...cerberusConfig,

include: [
Expand All @@ -13,4 +13,6 @@ export default defineConfig({
exclude: [],

presets: [pandaPreset, cerberusPreset],
})
}

export default defineConfig(config)
Loading

0 comments on commit 9aba71d

Please sign in to comment.