Skip to content

Commit dd6d65d

Browse files
widlestudiollpWidle Studio LLP
andauthored
added component (#21)
Co-authored-by: Widle Studio LLP <widlestudiollp@Widles-Mac-mini.local>
1 parent 8b04b61 commit dd6d65d

7 files changed

Lines changed: 1497 additions & 0 deletions

File tree

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
# Multi File Viewer
2+
3+
A Retool custom component for uploading and previewing multiple files, including images, PDFs, video, audio, text, JSON, CSV, and Excel files.
4+
5+
## What `{{ multiFileViewer1 }}` returns
6+
7+
When you reference the component directly in Retool:
8+
9+
```js
10+
{{ multiFileViewer1 }}
11+
```
12+
13+
it returns the component state object, which looks like this shape:
14+
15+
```js
16+
{
17+
pluginType: "DynamicWidget_MultiFileUploaderAndViewer_MultiFileViewer",
18+
heightType: "auto",
19+
files: [],
20+
selectedFile: {
21+
id: "",
22+
name: "",
23+
url: "",
24+
previewUrl: "",
25+
mimeType: "",
26+
label: "",
27+
kind: "unknown"
28+
},
29+
acceptedKind: "",
30+
collectionUuid: "...",
31+
allowMixedFileTypes: true,
32+
id: "multiFileViewer1"
33+
}
34+
```
35+
36+
Depending on uploads and selection, `files` and `selectedFile` will contain real values.
37+
38+
## Recommended Retool usage
39+
40+
### Get the full component object
41+
42+
```js
43+
{{ multiFileViewer1 }}
44+
```
45+
46+
### Get all uploaded files
47+
48+
```js
49+
{{ multiFileViewer1.files }}
50+
```
51+
52+
### Get the currently selected file
53+
54+
```js
55+
{{ multiFileViewer1.selectedFile }}
56+
```
57+
58+
### Get the selected file name
59+
60+
```js
61+
{{ multiFileViewer1.selectedFile.name }}
62+
```
63+
64+
### Get the selected file MIME type
65+
66+
```js
67+
{{ multiFileViewer1.selectedFile.mimeType }}
68+
```
69+
70+
### Get the selected file preview URL
71+
72+
```js
73+
{{ multiFileViewer1.selectedFile.previewUrl }}
74+
```
75+
76+
### Get the selected file kind
77+
78+
```js
79+
{{ multiFileViewer1.selectedFile.kind }}
80+
```
81+
82+
### Check whether mixed file types are enabled
83+
84+
```js
85+
{{ multiFileViewer1.allowMixedFileTypes }}
86+
```
87+
88+
### Get the accepted upload kind for single-type mode
89+
90+
```js
91+
{{ multiFileViewer1.acceptedKind }}
92+
```
93+
94+
## File object structure
95+
96+
Each item inside `multiFileViewer1.files` follows this shape:
97+
98+
```js
99+
{
100+
id: "file-id",
101+
name: "example.pdf",
102+
url: "blob:...",
103+
previewUrl: "blob:...",
104+
mimeType: "application/pdf",
105+
label: "PDF",
106+
kind: "pdf",
107+
objectUrl: "blob:...",
108+
base64: "..."
109+
}
110+
```
111+
112+
## Selected file object structure
113+
114+
`multiFileViewer1.selectedFile` follows this shape:
115+
116+
```js
117+
{
118+
id: "file-id",
119+
name: "example.pdf",
120+
url: "blob:...",
121+
previewUrl: "blob:...",
122+
mimeType: "application/pdf",
123+
label: "PDF",
124+
kind: "pdf"
125+
}
126+
```
127+
128+
## Common examples
129+
130+
### Send the selected file to a query
131+
132+
```js
133+
{{
134+
{
135+
name: multiFileViewer1.selectedFile.name,
136+
type: multiFileViewer1.selectedFile.mimeType,
137+
kind: multiFileViewer1.selectedFile.kind,
138+
previewUrl: multiFileViewer1.selectedFile.previewUrl
139+
}
140+
}}
141+
```
142+
143+
### Send all files to a query
144+
145+
```js
146+
{{ multiFileViewer1.files }}
147+
```
148+
149+
### Get only file names
150+
151+
```js
152+
{{ multiFileViewer1.files.map(file => file.name) }}
153+
```
154+
155+
### Get only base64 values
156+
157+
```js
158+
{{ multiFileViewer1.files.map(file => file.base64) }}
159+
```
160+
161+
### Get the first uploaded file
162+
163+
```js
164+
{{ multiFileViewer1.files[0] }}
165+
```
166+
167+
## Notes
168+
169+
- `files` is an array of uploaded files.
170+
- `selectedFile` is the file currently chosen in the sidebar.
171+
- `acceptedKind` is used when mixed file uploads are turned off.
172+
- `allowMixedFileTypes` is the checkbox-controlled setting for mixed uploads.
173+
- `heightType: "auto"` means the component is configured to work with auto height in Retool.
174+
- `previewUrl` and `url` are usually blob URLs for local uploaded files.
175+
176+
## Best practice
177+
178+
In most Retool queries and transformers, use nested access instead of the whole object when possible.
179+
180+
Good:
181+
182+
```js
183+
{{ multiFileViewer1.selectedFile }}
184+
{{ multiFileViewer1.files }}
185+
{{ multiFileViewer1.allowMixedFileTypes }}
186+
```
187+
188+
Less useful on its own:
189+
190+
```js
191+
{{ multiFileViewer1 }}
192+
```
193+
194+
because that returns the entire component state wrapper, not just the selected file.
61.5 KB
Loading
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"id": "multi-file-viewer",
3+
"title": "Multi File Viewer",
4+
"author": "@widlestudiollp",
5+
"shortDescription": "A responsive Retool custom component for uploading and previewing images, PDFs, spreadsheets, CSV, text, JSON, audio, video, and office files.",
6+
"tags": [
7+
"File Upload",
8+
"File Preview",
9+
"Retool",
10+
"PDF",
11+
"Spreadsheets",
12+
"Media Viewer"
13+
]
14+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
{
2+
"name": "my-react-app",
3+
"version": "0.1.0",
4+
"private": true,
5+
"dependencies": {
6+
"@tryretool/custom-component-support": "latest",
7+
"react": "^18.2.0",
8+
"react-dom": "^18.2.0",
9+
"xlsx": "^0.18.5"
10+
},
11+
"engines": {
12+
"node": ">=20.0.0"
13+
},
14+
"scripts": {
15+
"dev": "npx retool-ccl dev",
16+
"deploy": "npx retool-ccl deploy",
17+
"test": "vitest"
18+
},
19+
"browserslist": {
20+
"production": [
21+
">0.2%",
22+
"not dead",
23+
"not op_mini all"
24+
],
25+
"development": [
26+
"last 1 chrome version",
27+
"last 1 firefox version",
28+
"last 1 safari version"
29+
]
30+
},
31+
"devDependencies": {
32+
"@types/react": "^18.2.55",
33+
"@typescript-eslint/eslint-plugin": "^7.3.1",
34+
"@typescript-eslint/parser": "^7.3.1",
35+
"eslint": "^8.57.0",
36+
"eslint-plugin-react": "^7.34.1",
37+
"postcss-modules": "^6.0.0",
38+
"prettier": "^3.0.3",
39+
"vitest": "^4.0.17"
40+
},
41+
"retoolCustomComponentLibraryConfig": {
42+
"name": "MultileFileUploaderAndViewer",
43+
"label": "Multile file uploader and viewer",
44+
"description": "We can view multiple files that we uploaded",
45+
"entryPoint": "src/index.tsx",
46+
"outputPath": "dist"
47+
}
48+
}

0 commit comments

Comments
 (0)