parse-dashboard-analytics 7.4.1 → 7.4.4
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/Parse-Dashboard/Authentication.js +9 -4
- package/Parse-Dashboard/CLI/mfa.js +11 -5
- package/Parse-Dashboard/app.js +89 -20
- package/Parse-Dashboard/browser-control/BrowserControlAPI.js +468 -0
- package/Parse-Dashboard/browser-control/BrowserEventStream.js +294 -0
- package/Parse-Dashboard/browser-control/BrowserSessionManager.js +304 -0
- package/Parse-Dashboard/browser-control/README.md +852 -0
- package/Parse-Dashboard/browser-control/ServerOrchestrator.js +334 -0
- package/Parse-Dashboard/browser-control/index.js +27 -0
- package/Parse-Dashboard/browser-control/setup.js +405 -0
- package/Parse-Dashboard/public/bundles/120.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/183.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/19.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/221.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/372.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/448.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/573.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/578.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/584.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/629.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/643.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/647.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/701.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/729.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/75.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/753.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/817.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/844.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/862.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/866.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/874.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/881.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/929.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/950.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/97.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/976.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/dashboard.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/dashboard.bundle.js.LICENSE.txt +27 -33
- package/Parse-Dashboard/public/bundles/login.bundle.js +1 -1
- package/Parse-Dashboard/public/bundles/sprites.svg +294 -154
- package/Parse-Dashboard/server.js +33 -2
- package/README.md +475 -117
- package/package.json +68 -53
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
[](https://github.com/parse-community/parse-dashboard/actions?query=workflow%3Aci+branch%3Arelease)
|
|
7
7
|
[](https://snyk.io/test/github/parse-community/parse-dashboard)
|
|
8
8
|
|
|
9
|
-
[](https://nodejs.org/)
|
|
10
10
|
[](https://github.com/parse-community/parse-dashboard/releases)
|
|
11
11
|
|
|
12
12
|
[](https://www.npmjs.com/package/parse-dashboard)
|
|
@@ -77,6 +77,14 @@ npx parse-dashboard --config your-config.json
|
|
|
77
77
|
- [Node.js](#nodejs)
|
|
78
78
|
- [Configuring Parse Dashboard](#configuring-parse-dashboard)
|
|
79
79
|
- [Options](#options)
|
|
80
|
+
- [Root Options](#root-options)
|
|
81
|
+
- [App Options](#app-options)
|
|
82
|
+
- [Column Options](#column-options)
|
|
83
|
+
- [Script Options](#script-options)
|
|
84
|
+
- [Info Panel Options](#info-panel-options)
|
|
85
|
+
- [User Options](#user-options)
|
|
86
|
+
- [CLI \& Server Options](#cli--server-options)
|
|
87
|
+
- [Helper CLI Commands](#helper-cli-commands)
|
|
80
88
|
- [File](#file)
|
|
81
89
|
- [Environment variables](#environment-variables)
|
|
82
90
|
- [Multiple apps](#multiple-apps)
|
|
@@ -89,16 +97,21 @@ npx parse-dashboard --config your-config.json
|
|
|
89
97
|
- [Prevent columns sorting](#prevent-columns-sorting)
|
|
90
98
|
- [Custom order in the filter popup](#custom-order-in-the-filter-popup)
|
|
91
99
|
- [Persistent Filters](#persistent-filters)
|
|
92
|
-
- [
|
|
100
|
+
- [Keyboard Shortcuts](#keyboard-shortcuts)
|
|
93
101
|
- [Resource Cache](#resource-cache)
|
|
94
102
|
- [Running as Express Middleware](#running-as-express-middleware)
|
|
103
|
+
- [Browser Control API (Development Only)](#browser-control-api-development-only)
|
|
104
|
+
- [⚠️ Security Requirements](#️-security-requirements)
|
|
105
|
+
- [Configuration](#configuration)
|
|
106
|
+
- [Usage](#usage)
|
|
95
107
|
- [Deploying Parse Dashboard](#deploying-parse-dashboard)
|
|
96
108
|
- [Preparing for Deployment](#preparing-for-deployment)
|
|
97
109
|
- [Security Considerations](#security-considerations)
|
|
98
110
|
- [Security Checks](#security-checks)
|
|
99
111
|
- [Configuring Basic Authentication](#configuring-basic-authentication)
|
|
100
112
|
- [Multi-Factor Authentication (One-Time Password)](#multi-factor-authentication-one-time-password)
|
|
101
|
-
- [
|
|
113
|
+
- [Running Multiple Dashboard Replicas](#running-multiple-dashboard-replicas)
|
|
114
|
+
- [Using a Custom Session Store](#using-a-custom-session-store)
|
|
102
115
|
- [Use Read-Only masterKey](#use-read-only-masterkey)
|
|
103
116
|
- [Making an app read-only for all users](#making-an-app-read-only-for-all-users)
|
|
104
117
|
- [Makings users read-only](#makings-users-read-only)
|
|
@@ -119,14 +132,31 @@ npx parse-dashboard --config your-config.json
|
|
|
119
132
|
- [Audio Item](#audio-item)
|
|
120
133
|
- [Button Item](#button-item)
|
|
121
134
|
- [Panel Item](#panel-item)
|
|
135
|
+
- [Auto-Scroll](#auto-scroll)
|
|
122
136
|
- [Prefetching](#prefetching)
|
|
137
|
+
- [Scripts](#scripts)
|
|
138
|
+
- [Script Response Form](#script-response-form)
|
|
139
|
+
- [Response Fields](#response-fields)
|
|
140
|
+
- [Form Elements](#form-elements)
|
|
141
|
+
- [Drop-Down](#drop-down)
|
|
142
|
+
- [Checkbox](#checkbox)
|
|
143
|
+
- [Toggle](#toggle)
|
|
144
|
+
- [Text Input](#text-input)
|
|
145
|
+
- [Graph](#graph)
|
|
146
|
+
- [Calculated Values](#calculated-values)
|
|
147
|
+
- [Formula Operator](#formula-operator)
|
|
148
|
+
- [Arithmetic Operators](#arithmetic-operators)
|
|
149
|
+
- [Comparison Operators](#comparison-operators)
|
|
150
|
+
- [Conditional Operator](#conditional-operator)
|
|
151
|
+
- [Math Functions](#math-functions)
|
|
123
152
|
- [Freeze Columns](#freeze-columns)
|
|
124
153
|
- [Browse as User](#browse-as-user)
|
|
125
154
|
- [Change Pointer Key](#change-pointer-key)
|
|
126
155
|
- [Limitations](#limitations)
|
|
127
|
-
- [
|
|
156
|
+
- [Data Export](#data-export)
|
|
157
|
+
- [Data Import](#data-import)
|
|
128
158
|
- [AI Agent](#ai-agent)
|
|
129
|
-
- [Configuration](#configuration)
|
|
159
|
+
- [Configuration](#configuration-1)
|
|
130
160
|
- [Providers](#providers)
|
|
131
161
|
- [OpenAI](#openai)
|
|
132
162
|
- [Views](#views)
|
|
@@ -137,6 +167,7 @@ npx parse-dashboard --config your-config.json
|
|
|
137
167
|
- [Pointer](#pointer)
|
|
138
168
|
- [Link](#link)
|
|
139
169
|
- [Image](#image)
|
|
170
|
+
- [Video](#video)
|
|
140
171
|
- [Contributing](#contributing)
|
|
141
172
|
|
|
142
173
|
# Getting Started
|
|
@@ -182,11 +213,11 @@ Parse Dashboard automatically checks the Parse Server version when connecting an
|
|
|
182
213
|
### Node.js
|
|
183
214
|
Parse Dashboard is continuously tested with the most recent releases of Node.js to ensure compatibility. We follow the [Node.js Long Term Support plan](https://github.com/nodejs/Release) and only test against versions that are officially supported and have not reached their end-of-life date.
|
|
184
215
|
|
|
185
|
-
| Version |
|
|
216
|
+
| Version | Minimum version | End-of-Life | Compatible |
|
|
186
217
|
|------------|----------------|-------------|------------|
|
|
187
|
-
| Node.js 18 | 18.20.4 | May 2025 | ✅ Yes |
|
|
188
218
|
| Node.js 20 | 20.18.0 | April 2026 | ✅ Yes |
|
|
189
219
|
| Node.js 22 | 22.9.0 | April 2027 | ✅ Yes |
|
|
220
|
+
| Node.js 24 | 24.0.0 | April 2028 | ✅ Yes |
|
|
190
221
|
|
|
191
222
|
## Configuring Parse Dashboard
|
|
192
223
|
|
|
@@ -194,12 +225,12 @@ Parse Dashboard is continuously tested with the most recent releases of Node.js
|
|
|
194
225
|
|
|
195
226
|
This section provides a comprehensive reference for all Parse Dashboard configuration options that can be used in the configuration file, via CLI arguments, or as environment variables.
|
|
196
227
|
|
|
197
|
-
#### Root
|
|
228
|
+
#### Root Options
|
|
198
229
|
|
|
199
230
|
| Key | Type | Required | Default | CLI | Env Variable | Example | Description | Links to Details |
|
|
200
231
|
|-----|------|----------|---------|-----|--------------|---------|-------------|------------------|
|
|
201
|
-
| `apps` | Array<Object> | Yes | - | - | `PARSE_DASHBOARD_CONFIG` | `[{...}]` | Array of Parse Server apps to manage | [App
|
|
202
|
-
| `users` | Array<Object> | No | - | - | - | `[{...}]` | User accounts for dashboard authentication | [User Configuration](#user-
|
|
232
|
+
| `apps` | Array<Object> | Yes | - | - | `PARSE_DASHBOARD_CONFIG` | `[{...}]` | Array of Parse Server apps to manage | [App Options](#app-options) |
|
|
233
|
+
| `users` | Array<Object> | No | - | - | - | `[{...}]` | User accounts for dashboard authentication | [User Configuration](#user-options) |
|
|
203
234
|
| `useEncryptedPasswords` | Boolean | No | `false` | - | - | `true` | Use bcrypt hashes instead of plain text passwords | - |
|
|
204
235
|
| `trustProxy` | Boolean \| Number | No | `false` | `--trustProxy` | `PARSE_DASHBOARD_TRUST_PROXY` | `1` | Trust X-Forwarded-* headers when behind proxy | - |
|
|
205
236
|
| `iconsFolder` | String | No | - | - | - | `"icons"` | Folder for app icons (relative or absolute path) | - |
|
|
@@ -207,7 +238,7 @@ This section provides a comprehensive reference for all Parse Dashboard configur
|
|
|
207
238
|
| `enableResourceCache` | Boolean | No | `false` | - | - | `true` | Enable browser caching of dashboard resources | - |
|
|
208
239
|
|
|
209
240
|
|
|
210
|
-
##### App
|
|
241
|
+
##### App Options
|
|
211
242
|
|
|
212
243
|
| Parameter | Type | Optional | Default | CLI | Env Variable | Example | Description |
|
|
213
244
|
| -------------------------- | ------------------- | -------- | --------- | -------------------- | ------------------------------------ | --------------------------------- | ------------------------------------------------------------------------------------------------------------ |
|
|
@@ -240,7 +271,7 @@ This section provides a comprehensive reference for all Parse Dashboard configur
|
|
|
240
271
|
| `scripts` | Array<Object> | yes | `[]` | - | - | `[{...}]` | Scripts for this app. See [scripts table below](#scripts). |
|
|
241
272
|
| `infoPanel` | Array<Object> | yes | - | - | - | `[{...}]` | Info panel config. See [info panel table below](#info-panel). |
|
|
242
273
|
|
|
243
|
-
##### Column
|
|
274
|
+
##### Column Options
|
|
244
275
|
|
|
245
276
|
Each class in `columnPreference` can have an array of column configurations:
|
|
246
277
|
|
|
@@ -251,7 +282,7 @@ Each class in `columnPreference` can have an array of column configurations:
|
|
|
251
282
|
| `preventSort` | Boolean | yes | `false` | `true` | Prevent this column from being sortable. |
|
|
252
283
|
| `filterSortToTop` | Boolean | yes | `false` | `true` | Sort this column to the top in filter popup. |
|
|
253
284
|
|
|
254
|
-
#####
|
|
285
|
+
##### Script Options
|
|
255
286
|
|
|
256
287
|
| Parameter | Type | Optional | Default | Example | Description |
|
|
257
288
|
| --------------------------|--------------------------------------------|----------|---------|-----------------|---------------------------------------------------|
|
|
@@ -262,7 +293,7 @@ Each class in `columnPreference` can have an array of column configurations:
|
|
|
262
293
|
| `showConfirmationDialog` | Boolean | yes | `false` | `true` | Show confirmation dialog before execution. |
|
|
263
294
|
| `confirmationDialogStyle` | String | yes | `info` | `critical` | Dialog style: `info` (blue) or `critical` (red). |
|
|
264
295
|
|
|
265
|
-
##### Info Panel
|
|
296
|
+
##### Info Panel Options
|
|
266
297
|
|
|
267
298
|
| Parameter | Type | Optional | Default | Example | Description |
|
|
268
299
|
| --------------------|---------------------|----------|---------|--------------------|-----------------------------------------------|
|
|
@@ -276,7 +307,7 @@ Each class in `columnPreference` can have an array of column configurations:
|
|
|
276
307
|
| `prefetchAudio` | Boolean | yes | `true` | `false` | Whether to prefetch audio content. |
|
|
277
308
|
|
|
278
309
|
|
|
279
|
-
##### User
|
|
310
|
+
##### User Options
|
|
280
311
|
|
|
281
312
|
| Parameter | Type | Optional | Default | CLI | Env Variable | Example | Description |
|
|
282
313
|
| ------------------|---------------------|----------|----------|------------------|---------------------------------|----------------------|----------------------------------------|
|
|
@@ -304,6 +335,7 @@ Each class in `columnPreference` can have an array of column configurations:
|
|
|
304
335
|
| `cookieSessionSecret` | String | yes | Random | `--cookieSessionSecret` | `PARSE_DASHBOARD_COOKIE_SESSION_SECRET` | `"secret"` | Secret for session cookies (for multi-server). |
|
|
305
336
|
| `cookieSessionMaxAge` | Number | yes | Session-only | `--cookieSessionMaxAge` | `PARSE_DASHBOARD_COOKIE_SESSION_MAX_AGE` | `3600` | Session cookie expiration (seconds). |
|
|
306
337
|
| `dev` | Boolean | yes | `false` | `--dev` | - | - | Development mode (**DO NOT use in production**). |
|
|
338
|
+
| `browserControl` | Boolean | yes | `false` | - | `PARSE_DASHBOARD_BROWSER_CONTROL` | `true` | Enable Browser Control API (dev only, **NEVER in production**). See [Browser Control](Parse-Dashboard/browser-control/). |
|
|
307
339
|
| `config` | String | yes | - | `--config` | - | `"config.json"` | Path to JSON configuration file. |
|
|
308
340
|
|
|
309
341
|
#### Helper CLI Commands
|
|
@@ -566,109 +598,11 @@ For example:
|
|
|
566
598
|
|
|
567
599
|
You can conveniently create a filter definition without having to write it by hand by first saving a filter in the data browser, then exporting the filter definition under *App Settings > Export Class Preferences*.
|
|
568
600
|
|
|
569
|
-
###
|
|
570
|
-
|
|
571
|
-
You can specify scripts to execute Cloud Functions with the `scripts` option:
|
|
572
|
-
|
|
573
|
-
```json
|
|
574
|
-
"apps": [
|
|
575
|
-
{
|
|
576
|
-
"scripts": [
|
|
577
|
-
{
|
|
578
|
-
"title": "Delete Account",
|
|
579
|
-
"classes": ["_User"],
|
|
580
|
-
"cloudCodeFunction": "deleteAccount",
|
|
581
|
-
"showConfirmationDialog": true,
|
|
582
|
-
"confirmationDialogStyle": "critical"
|
|
583
|
-
}
|
|
584
|
-
]
|
|
585
|
-
}
|
|
586
|
-
]
|
|
587
|
-
```
|
|
588
|
-
|
|
589
|
-
You can also specify custom fields with the `scrips` option:
|
|
590
|
-
|
|
591
|
-
```json
|
|
592
|
-
"apps": [
|
|
593
|
-
{
|
|
594
|
-
"scripts": [
|
|
595
|
-
{
|
|
596
|
-
"title": "Delete account",
|
|
597
|
-
"classes": [
|
|
598
|
-
{
|
|
599
|
-
"name": "_User",
|
|
600
|
-
"fields": [
|
|
601
|
-
{ "name": "createdAt", "validator": "value => value > new Date(\"2025\")" }
|
|
602
|
-
]
|
|
603
|
-
}
|
|
604
|
-
],
|
|
605
|
-
"cloudCodeFunction": "deleteAccount"
|
|
606
|
-
}
|
|
607
|
-
]
|
|
608
|
-
}
|
|
609
|
-
]
|
|
610
|
-
|
|
611
|
-
```
|
|
612
|
-
|
|
613
|
-
Next, define the Cloud Function in Parse Server that will be called. The object that has been selected in the data browser will be made available as a request parameter:
|
|
614
|
-
|
|
615
|
-
```js
|
|
616
|
-
Parse.Cloud.define('deleteAccount', async (req) => {
|
|
617
|
-
req.params.object.set('deleted', true);
|
|
618
|
-
await req.params.object.save(null, {useMasterKey: true});
|
|
619
|
-
}, {
|
|
620
|
-
requireMaster: true
|
|
621
|
-
});
|
|
622
|
-
```
|
|
623
|
-
|
|
624
|
-
The field which the script was invoked on can be accessed by `selectedField`:
|
|
625
|
-
|
|
626
|
-
```js
|
|
627
|
-
Parse.Cloud.define('deleteAccount', async (req) => {
|
|
628
|
-
if (req.params.selectedField !== 'objectId') {
|
|
629
|
-
throw new Parse.Error(Parse.Error.SCRIPT_FAILED, 'Deleting accounts is only available on the objectId field.');
|
|
630
|
-
}
|
|
631
|
-
req.params.object.set('deleted', true);
|
|
632
|
-
await req.params.object.save(null, {useMasterKey: true});
|
|
633
|
-
}, {
|
|
634
|
-
requireMaster: true
|
|
635
|
-
});
|
|
636
|
-
```
|
|
637
|
-
|
|
638
|
-
⚠️ Depending on your Parse Server version you may need to set the Parse Server option `encodeParseObjectInCloudFunction` to `true` so that the selected object in the data browser is made available in the Cloud Function as an instance of `Parse.Object`. If the option is not set, is set to `false`, or you are using an older version of Parse Server, the object is made available as a plain JavaScript object and needs to be converted from a JSON object to a `Parse.Object` instance with `req.params.object = Parse.Object.fromJSON(req.params.object);`, before you can call any `Parse.Object` properties and methods on it.
|
|
639
|
-
|
|
640
|
-
For older versions of Parse Server:
|
|
641
|
-
|
|
642
|
-
<details>
|
|
643
|
-
<summary>Parse Server >=4.4.0 <6.2.0</summary>
|
|
644
|
-
|
|
645
|
-
```js
|
|
646
|
-
Parse.Cloud.define('deleteAccount', async (req) => {
|
|
647
|
-
req.params.object = Parse.Object.fromJSON(req.params.object);
|
|
648
|
-
req.params.object.set('deleted', true);
|
|
649
|
-
await req.params.object.save(null, {useMasterKey: true});
|
|
650
|
-
}, {
|
|
651
|
-
requireMaster: true
|
|
652
|
-
});
|
|
653
|
-
```
|
|
654
|
-
|
|
655
|
-
</details>
|
|
601
|
+
### Keyboard Shortcuts
|
|
656
602
|
|
|
657
|
-
|
|
658
|
-
<summary>Parse Server >=2.1.4 <4.4.0</summary>
|
|
659
|
-
|
|
660
|
-
```js
|
|
661
|
-
Parse.Cloud.define('deleteAccount', async (req) => {
|
|
662
|
-
if (!req.master || !req.params.object) {
|
|
663
|
-
throw 'Unauthorized';
|
|
664
|
-
}
|
|
665
|
-
req.params.object = Parse.Object.fromJSON(req.params.object);
|
|
666
|
-
req.params.object.set('deleted', true);
|
|
667
|
-
await req.params.object.save(null, {useMasterKey: true});
|
|
668
|
-
});
|
|
669
|
-
```
|
|
603
|
+
Configure custom keyboard shortcuts for dashboard actions in **App Settings > Keyboard Shortcuts**.
|
|
670
604
|
|
|
671
|
-
|
|
605
|
+
Delete a shortcut key to disable the shortcut.
|
|
672
606
|
|
|
673
607
|
### Resource Cache
|
|
674
608
|
|
|
@@ -758,6 +692,47 @@ var httpServer = require('http').createServer(app);
|
|
|
758
692
|
httpServer.listen(4040);
|
|
759
693
|
```
|
|
760
694
|
|
|
695
|
+
## Browser Control API (Development Only)
|
|
696
|
+
|
|
697
|
+
The Browser Control API allows AI agents to interact with Parse Dashboard through an automated browser during feature implementation and debugging. This is a **development-only tool** designed for real-time verification during active development.
|
|
698
|
+
|
|
699
|
+
### ⚠️ Security Requirements
|
|
700
|
+
|
|
701
|
+
The Browser Control API uses **defense-in-depth** with multiple security layers:
|
|
702
|
+
|
|
703
|
+
1. **Config-level opt-in** (Required)
|
|
704
|
+
- Must set `"browserControl": true` in your config file
|
|
705
|
+
- Prevents accidental enablement via environment variables
|
|
706
|
+
|
|
707
|
+
2. **Production environment blocking**
|
|
708
|
+
- Automatically disabled when `NODE_ENV=production`
|
|
709
|
+
- Cannot be overridden, even with explicit flags
|
|
710
|
+
|
|
711
|
+
3. **Development-only deployment**
|
|
712
|
+
- Only accessible in `dev` mode or with `PARSE_DASHBOARD_BROWSER_CONTROL=true`
|
|
713
|
+
|
|
714
|
+
### Configuration
|
|
715
|
+
|
|
716
|
+
Add to your `parse-dashboard-config.json`:
|
|
717
|
+
|
|
718
|
+
```json
|
|
719
|
+
{
|
|
720
|
+
"browserControl": true,
|
|
721
|
+
"apps": [...],
|
|
722
|
+
"users": [...]
|
|
723
|
+
}
|
|
724
|
+
```
|
|
725
|
+
|
|
726
|
+
**⚠️ CRITICAL**: Never deploy with `browserControl: true` in production. Remove this field or set to `false` before deploying.
|
|
727
|
+
|
|
728
|
+
### Usage
|
|
729
|
+
|
|
730
|
+
```bash
|
|
731
|
+
npm run browser-control
|
|
732
|
+
```
|
|
733
|
+
|
|
734
|
+
For complete documentation, API reference, and examples, see the [Browser Control README](Parse-Dashboard/browser-control/README.md).
|
|
735
|
+
|
|
761
736
|
# Deploying Parse Dashboard
|
|
762
737
|
|
|
763
738
|
## Preparing for Deployment
|
|
@@ -1419,6 +1394,26 @@ Example:
|
|
|
1419
1394
|
}
|
|
1420
1395
|
```
|
|
1421
1396
|
|
|
1397
|
+
#### Auto-Scroll
|
|
1398
|
+
|
|
1399
|
+
▶️ *Core > Browser > Settings > Info Panel > Auto-scroll*
|
|
1400
|
+
|
|
1401
|
+
The info panel supports automatic scrolling, which is useful for hands-free browsing of panel content, for example to conveniently browse through large sets of data.
|
|
1402
|
+
|
|
1403
|
+
**How to use:**
|
|
1404
|
+
|
|
1405
|
+
1. Enable auto-scroll via *Settings > Info Panel > Auto-scroll*.
|
|
1406
|
+
2. Hold the **Command** (⌘) key while scrolling in the panel to record the scroll amount.
|
|
1407
|
+
3. Release the Command key after pausing for the desired interval between scrolls.
|
|
1408
|
+
4. Auto-scrolling begins automatically, repeating the recorded scroll amount and pause interval.
|
|
1409
|
+
|
|
1410
|
+
**Controls:**
|
|
1411
|
+
|
|
1412
|
+
- **Escape key**: Stop auto-scrolling.
|
|
1413
|
+
- **Command key**: Stop current auto-scroll and start recording a new scroll pattern.
|
|
1414
|
+
- **Manual scroll**: Temporarily pauses auto-scrolling, which resumes after inactivity.
|
|
1415
|
+
- **Auto-scroll button**: Click the highlighted "Auto-scroll" button in the toolbar to stop.
|
|
1416
|
+
|
|
1422
1417
|
#### Prefetching
|
|
1423
1418
|
|
|
1424
1419
|
To reduce the time for info panel data to appear, data can be prefetched.
|
|
@@ -1435,6 +1430,330 @@ Prefetching is particularly useful when navigating through lists of objects. To
|
|
|
1435
1430
|
|
|
1436
1431
|
When `prefetchObjects` is enabled, media content (images, videos, and audio) in the info panel can also be prefetched to improve loading performance. By default, all media types are prefetched, but you can selectively disable prefetching for specific media types using the `prefetchImage`, `prefetchVideo`, and `prefetchAudio` options.
|
|
1437
1432
|
|
|
1433
|
+
### Scripts
|
|
1434
|
+
|
|
1435
|
+
You can specify scripts to execute Cloud Functions with the `scripts` option:
|
|
1436
|
+
|
|
1437
|
+
```json
|
|
1438
|
+
"apps": [
|
|
1439
|
+
{
|
|
1440
|
+
"scripts": [
|
|
1441
|
+
{
|
|
1442
|
+
"title": "Delete Account",
|
|
1443
|
+
"classes": ["_User"],
|
|
1444
|
+
"cloudCodeFunction": "deleteAccount",
|
|
1445
|
+
"showConfirmationDialog": true,
|
|
1446
|
+
"confirmationDialogStyle": "critical"
|
|
1447
|
+
}
|
|
1448
|
+
]
|
|
1449
|
+
}
|
|
1450
|
+
]
|
|
1451
|
+
```
|
|
1452
|
+
|
|
1453
|
+
You can also specify custom fields with the `scripts` option:
|
|
1454
|
+
|
|
1455
|
+
```json
|
|
1456
|
+
"apps": [
|
|
1457
|
+
{
|
|
1458
|
+
"scripts": [
|
|
1459
|
+
{
|
|
1460
|
+
"title": "Delete account",
|
|
1461
|
+
"classes": [
|
|
1462
|
+
{
|
|
1463
|
+
"name": "_User",
|
|
1464
|
+
"fields": [
|
|
1465
|
+
{ "name": "createdAt", "validator": "value => value > new Date(\"2025\")" }
|
|
1466
|
+
]
|
|
1467
|
+
}
|
|
1468
|
+
],
|
|
1469
|
+
"cloudCodeFunction": "deleteAccount"
|
|
1470
|
+
}
|
|
1471
|
+
]
|
|
1472
|
+
}
|
|
1473
|
+
]
|
|
1474
|
+
|
|
1475
|
+
```
|
|
1476
|
+
|
|
1477
|
+
Next, define the Cloud Function in Parse Server that will be called. The object that has been selected in the data browser will be made available as a request parameter:
|
|
1478
|
+
|
|
1479
|
+
```js
|
|
1480
|
+
Parse.Cloud.define('deleteAccount', async (req) => {
|
|
1481
|
+
req.params.object.set('deleted', true);
|
|
1482
|
+
await req.params.object.save(null, {useMasterKey: true});
|
|
1483
|
+
}, {
|
|
1484
|
+
requireMaster: true
|
|
1485
|
+
});
|
|
1486
|
+
```
|
|
1487
|
+
|
|
1488
|
+
The field which the script was invoked on can be accessed by `selectedField`:
|
|
1489
|
+
|
|
1490
|
+
```js
|
|
1491
|
+
Parse.Cloud.define('deleteAccount', async (req) => {
|
|
1492
|
+
if (req.params.selectedField !== 'objectId') {
|
|
1493
|
+
throw new Parse.Error(Parse.Error.SCRIPT_FAILED, 'Deleting accounts is only available on the objectId field.');
|
|
1494
|
+
}
|
|
1495
|
+
req.params.object.set('deleted', true);
|
|
1496
|
+
await req.params.object.save(null, {useMasterKey: true});
|
|
1497
|
+
}, {
|
|
1498
|
+
requireMaster: true
|
|
1499
|
+
});
|
|
1500
|
+
```
|
|
1501
|
+
|
|
1502
|
+
⚠️ Depending on your Parse Server version you may need to set the Parse Server option `encodeParseObjectInCloudFunction` to `true` so that the selected object in the data browser is made available in the Cloud Function as an instance of `Parse.Object`. If the option is not set, is set to `false`, or you are using an older version of Parse Server, the object is made available as a plain JavaScript object and needs to be converted from a JSON object to a `Parse.Object` instance with `req.params.object = Parse.Object.fromJSON(req.params.object);`, before you can call any `Parse.Object` properties and methods on it.
|
|
1503
|
+
|
|
1504
|
+
For older versions of Parse Server:
|
|
1505
|
+
|
|
1506
|
+
<details>
|
|
1507
|
+
<summary>Parse Server >=4.4.0 <6.2.0</summary>
|
|
1508
|
+
|
|
1509
|
+
```js
|
|
1510
|
+
Parse.Cloud.define('deleteAccount', async (req) => {
|
|
1511
|
+
req.params.object = Parse.Object.fromJSON(req.params.object);
|
|
1512
|
+
req.params.object.set('deleted', true);
|
|
1513
|
+
await req.params.object.save(null, {useMasterKey: true});
|
|
1514
|
+
}, {
|
|
1515
|
+
requireMaster: true
|
|
1516
|
+
});
|
|
1517
|
+
```
|
|
1518
|
+
|
|
1519
|
+
</details>
|
|
1520
|
+
|
|
1521
|
+
<details>
|
|
1522
|
+
<summary>Parse Server >=2.1.4 <4.4.0</summary>
|
|
1523
|
+
|
|
1524
|
+
```js
|
|
1525
|
+
Parse.Cloud.define('deleteAccount', async (req) => {
|
|
1526
|
+
if (!req.master || !req.params.object) {
|
|
1527
|
+
throw 'Unauthorized';
|
|
1528
|
+
}
|
|
1529
|
+
req.params.object = Parse.Object.fromJSON(req.params.object);
|
|
1530
|
+
req.params.object.set('deleted', true);
|
|
1531
|
+
await req.params.object.save(null, {useMasterKey: true});
|
|
1532
|
+
});
|
|
1533
|
+
```
|
|
1534
|
+
|
|
1535
|
+
</details>
|
|
1536
|
+
|
|
1537
|
+
#### Script Response Form
|
|
1538
|
+
|
|
1539
|
+
A Cloud Function invoked by a script can return a structured response that shows a modal dialog with form elements. When the user submits the form, the values are sent to a callback Cloud Function specified in the response.
|
|
1540
|
+
|
|
1541
|
+
Return a `ScriptResponse` from the Cloud Function:
|
|
1542
|
+
|
|
1543
|
+
```js
|
|
1544
|
+
Parse.Cloud.define('assignRole', async (req) => {
|
|
1545
|
+
return {
|
|
1546
|
+
__type: 'ScriptResponse',
|
|
1547
|
+
payload: {
|
|
1548
|
+
requestId: '123-456-789'
|
|
1549
|
+
},
|
|
1550
|
+
form: {
|
|
1551
|
+
title: 'Assign Role',
|
|
1552
|
+
icon: 'gears',
|
|
1553
|
+
cloudCodeFunction: 'assignRoleCallback',
|
|
1554
|
+
elements: [
|
|
1555
|
+
{
|
|
1556
|
+
element: 'dropDown',
|
|
1557
|
+
name: 'role',
|
|
1558
|
+
label: 'Role',
|
|
1559
|
+
items: [
|
|
1560
|
+
{ title: 'Admin', value: 'admin' },
|
|
1561
|
+
{ title: 'User', value: 'user' }
|
|
1562
|
+
]
|
|
1563
|
+
}
|
|
1564
|
+
]
|
|
1565
|
+
}
|
|
1566
|
+
};
|
|
1567
|
+
}, {
|
|
1568
|
+
requireMaster: true
|
|
1569
|
+
});
|
|
1570
|
+
```
|
|
1571
|
+
|
|
1572
|
+
Then define the callback Cloud Function that receives the form data:
|
|
1573
|
+
|
|
1574
|
+
```js
|
|
1575
|
+
Parse.Cloud.define('assignRoleCallback', async (req) => {
|
|
1576
|
+
const { object, payload, formData } = req.params;
|
|
1577
|
+
const role = formData.role;
|
|
1578
|
+
object.set('role', role);
|
|
1579
|
+
await object.save(null, { useMasterKey: true });
|
|
1580
|
+
return `Assigned role "${role}" to ${object.id} (request ${payload.requestId}).`;
|
|
1581
|
+
}, {
|
|
1582
|
+
requireMaster: true
|
|
1583
|
+
});
|
|
1584
|
+
```
|
|
1585
|
+
|
|
1586
|
+
> [!NOTE]
|
|
1587
|
+
> When executing a script on multiple selected rows, the Cloud Function is called for the first object. If the response is a `ScriptResponse`, the modal is shown once. On submission, the callback Cloud Function is called for all selected objects.
|
|
1588
|
+
|
|
1589
|
+
##### Response Fields
|
|
1590
|
+
|
|
1591
|
+
| Field | Type | Optional | Default | Description |
|
|
1592
|
+
|---|---|---|---|---|
|
|
1593
|
+
| `__type` | `String` | No | - | Must be `"ScriptResponse"` to indicate a structured response. |
|
|
1594
|
+
| `payload` | `Object` | Yes | - | Pass-through data forwarded to the callback Cloud Function. |
|
|
1595
|
+
| `form.title` | `String` | Yes | `"Script"` | The modal title. |
|
|
1596
|
+
| `form.icon` | `String` | Yes | `"gears"` | The modal icon. |
|
|
1597
|
+
| `form.cloudCodeFunction` | `String` | Yes | Script `cloudCodeFunction` | The callback Cloud Function to invoke on form submission. |
|
|
1598
|
+
| `form.elements` | `Array` | No | - | The form elements to display in the modal. |
|
|
1599
|
+
|
|
1600
|
+
##### Form Elements
|
|
1601
|
+
|
|
1602
|
+
| Parameter | Value | Optional | Description |
|
|
1603
|
+
|-----------|--------|----------|----------------------------------|
|
|
1604
|
+
| `elements` | `Array` | No | The form elements. Elements are rendered in the order they are defined. |
|
|
1605
|
+
|
|
1606
|
+
###### Drop-Down
|
|
1607
|
+
|
|
1608
|
+
A drop-down to select a single item from a list.
|
|
1609
|
+
|
|
1610
|
+
| Parameter | Value | Optional | Description |
|
|
1611
|
+
|-----------|--------|----------|----------------------------------|
|
|
1612
|
+
| `element` | `String` | No | Must be `"dropDown"`. |
|
|
1613
|
+
| `name` | `String` | No | The key used in `formData`. |
|
|
1614
|
+
| `label` | `String` | No | The display label shown next to the dropdown. |
|
|
1615
|
+
| `description` | `String` | Yes | Secondary text below the label. |
|
|
1616
|
+
| `items` | `Array` | No | The selectable options. |
|
|
1617
|
+
| `items[].title` | `String` | No | The display text of the option. |
|
|
1618
|
+
| `items[].value` | `String` | No | The value of the option. |
|
|
1619
|
+
|
|
1620
|
+
###### Checkbox
|
|
1621
|
+
|
|
1622
|
+
A checkbox for boolean input.
|
|
1623
|
+
|
|
1624
|
+
| Parameter | Value | Optional | Default | Description |
|
|
1625
|
+
|-----------|--------|----------|---------|----------------------------------|
|
|
1626
|
+
| `element` | `String` | No | - | Must be `"checkbox"`. |
|
|
1627
|
+
| `name` | `String` | No | - | The key used in `formData`. |
|
|
1628
|
+
| `label` | `String` | No | - | The display label. |
|
|
1629
|
+
| `description` | `String` | Yes | - | Secondary text below the label. |
|
|
1630
|
+
| `default` | `Boolean`| Yes | `false` | The initial checked state. |
|
|
1631
|
+
|
|
1632
|
+
###### Toggle
|
|
1633
|
+
|
|
1634
|
+
A toggle switch for boolean input.
|
|
1635
|
+
|
|
1636
|
+
| Parameter | Value | Optional | Default | Description |
|
|
1637
|
+
|-------------|----------|----------|---------|----------------------------------|
|
|
1638
|
+
| `element` | `String` | No | - | Must be `"toggle"`. |
|
|
1639
|
+
| `name` | `String` | No | - | The key used in `formData`. |
|
|
1640
|
+
| `label` | `String` | No | - | The display label. |
|
|
1641
|
+
| `description` | `String` | Yes | - | Secondary text below the label. |
|
|
1642
|
+
| `default` | `Boolean`| Yes | `false` | The initial toggle state. |
|
|
1643
|
+
| `labelTrue` | `String` | Yes | `"Yes"` | Label for the `true` side. |
|
|
1644
|
+
| `labelFalse` | `String` | Yes | `"No"` | Label for the `false` side. |
|
|
1645
|
+
|
|
1646
|
+
###### Text Input
|
|
1647
|
+
|
|
1648
|
+
A single-line text input.
|
|
1649
|
+
|
|
1650
|
+
| Parameter | Value | Optional | Default | Description |
|
|
1651
|
+
|-------------|----------|----------|---------|----------------------------------|
|
|
1652
|
+
| `element` | `String` | No | - | Must be `"textInput"`. |
|
|
1653
|
+
| `name` | `String` | No | - | The key used in `formData`. |
|
|
1654
|
+
| `label` | `String` | No | - | The display label. |
|
|
1655
|
+
| `description` | `String` | Yes | - | Secondary text below the label. |
|
|
1656
|
+
| `placeholder` | `String` | Yes | `""` | Placeholder text. |
|
|
1657
|
+
| `default` | `String` | Yes | `""` | The initial value. |
|
|
1658
|
+
|
|
1659
|
+
### Graph
|
|
1660
|
+
|
|
1661
|
+
▶️ *Core > Browser > Graph*
|
|
1662
|
+
|
|
1663
|
+
The data browser includes a graph feature that allows you to visualize data in pie charts, bar charts, or line charts. You can configure calculated values to display aggregated or computed data.
|
|
1664
|
+
|
|
1665
|
+
#### Calculated Values
|
|
1666
|
+
|
|
1667
|
+
Calculated values allow you to derive new values from your data. The following operators are available:
|
|
1668
|
+
|
|
1669
|
+
| Operator | Description |
|
|
1670
|
+
|----------|-------------|
|
|
1671
|
+
| Sum | Sum of all values in the selected field |
|
|
1672
|
+
| Percent | Percentage of numerator relative to denominator |
|
|
1673
|
+
| Average | Average of all values in the selected field |
|
|
1674
|
+
| Difference | Difference between two fields |
|
|
1675
|
+
| Ratio | Ratio of numerator to denominator |
|
|
1676
|
+
| Formula | Custom formula using mathematical expressions |
|
|
1677
|
+
|
|
1678
|
+
**Naming Rules:**
|
|
1679
|
+
Calculated value names must follow Parse field naming conventions:
|
|
1680
|
+
- Start with a letter or underscore
|
|
1681
|
+
- Contain only letters, numbers, and underscores
|
|
1682
|
+
- No spaces or special characters
|
|
1683
|
+
|
|
1684
|
+
#### Formula Operator
|
|
1685
|
+
|
|
1686
|
+
The Formula operator allows you to define custom calculations using a safe expression syntax. You can reference field values directly by their names.
|
|
1687
|
+
|
|
1688
|
+
**Syntax:**
|
|
1689
|
+
- Use field names directly as variables (e.g., `price`, `quantity`)
|
|
1690
|
+
- Reference previous calculated values by name (e.g., `profit`, `total_cost`)
|
|
1691
|
+
- Optionally prefix field names with `$` (e.g., `$price`, `$quantity`)
|
|
1692
|
+
|
|
1693
|
+
> [!TIP]
|
|
1694
|
+
> If a field name conflicts with a reserved function name (like `round`, `min`, `max`), prefix it with `$` to reference the field. For example, use `$round` to reference a field named "round": `round($round, 2)`.
|
|
1695
|
+
|
|
1696
|
+
**Example formulas:**
|
|
1697
|
+
```
|
|
1698
|
+
price * quantity # Multiply two fields
|
|
1699
|
+
round(revenue / cost * 100, 2) # Calculate percentage with rounding
|
|
1700
|
+
max(value, 0) # Floor at 0 (no negatives)
|
|
1701
|
+
min(value, 100) # Cap at 100
|
|
1702
|
+
score > 50 ? score : 0 # Conditional logic
|
|
1703
|
+
round((revenue - cost) / revenue * 100, 1) # Profit margin calculation
|
|
1704
|
+
```
|
|
1705
|
+
|
|
1706
|
+
##### Arithmetic Operators
|
|
1707
|
+
|
|
1708
|
+
| Operator | Description | Example |
|
|
1709
|
+
|----------|-------------|---------|
|
|
1710
|
+
| `+` | Addition | `price + tax` |
|
|
1711
|
+
| `-` | Subtraction | `revenue - cost` |
|
|
1712
|
+
| `*` | Multiplication | `price * quantity` |
|
|
1713
|
+
| `/` | Division | `total / count` |
|
|
1714
|
+
| `%` | Modulo (remainder) | `value % 10` |
|
|
1715
|
+
| `^` | Power | `base ^ 2` |
|
|
1716
|
+
| `()` | Grouping | `(a + b) * c` |
|
|
1717
|
+
|
|
1718
|
+
##### Comparison Operators
|
|
1719
|
+
|
|
1720
|
+
Comparison operators return `1` for true and `0` for false.
|
|
1721
|
+
|
|
1722
|
+
| Operator | Description | Example |
|
|
1723
|
+
|----------|-------------|---------|
|
|
1724
|
+
| `>` | Greater than | `value > 100` |
|
|
1725
|
+
| `<` | Less than | `value < 0` |
|
|
1726
|
+
| `>=` | Greater than or equal | `value >= 50` |
|
|
1727
|
+
| `<=` | Less than or equal | `value <= 100` |
|
|
1728
|
+
| `==` | Equal | `status == 1` |
|
|
1729
|
+
| `!=` | Not equal | `status != 0` |
|
|
1730
|
+
|
|
1731
|
+
##### Conditional Operator
|
|
1732
|
+
|
|
1733
|
+
| Operator | Description | Example |
|
|
1734
|
+
|----------|-------------|---------|
|
|
1735
|
+
| `? :` | Ternary conditional | `value > 0 ? value : 0` |
|
|
1736
|
+
|
|
1737
|
+
##### Math Functions
|
|
1738
|
+
|
|
1739
|
+
| Function | Description | Example |
|
|
1740
|
+
|----------|-------------|---------|
|
|
1741
|
+
| `round(value)` | Round to nearest integer | `round(3.7)` → `4` |
|
|
1742
|
+
| `round(value, decimals)` | Round to decimal places | `round(3.14159, 2)` → `3.14` |
|
|
1743
|
+
| `floor(value)` | Round down | `floor(3.7)` → `3` |
|
|
1744
|
+
| `ceil(value)` | Round up | `ceil(3.2)` → `4` |
|
|
1745
|
+
| `trunc(value)` | Truncate decimal part | `trunc(3.7)` → `3` |
|
|
1746
|
+
| `abs(value)` | Absolute value | `abs(-5)` → `5` |
|
|
1747
|
+
| `sign(value)` | Sign of number (-1, 0, 1) | `sign(-5)` → `-1` |
|
|
1748
|
+
| `min(a, b, ...)` | Minimum value | `min(10, 5, 8)` → `5` |
|
|
1749
|
+
| `max(a, b, ...)` | Maximum value | `max(10, 5, 8)` → `10` |
|
|
1750
|
+
| `sqrt(value)` | Square root | `sqrt(16)` → `4` |
|
|
1751
|
+
| `cbrt(value)` | Cube root | `cbrt(27)` → `3` |
|
|
1752
|
+
| `exp(value)` | Exponential (e^x) | `exp(1)` → `2.718...` |
|
|
1753
|
+
| `log(value)` | Natural logarithm | `log(2.718)` → `1` |
|
|
1754
|
+
| `log10(value)` | Base-10 logarithm | `log10(100)` → `2` |
|
|
1755
|
+
| `log2(value)` | Base-2 logarithm | `log2(8)` → `3` |
|
|
1756
|
+
|
|
1438
1757
|
### Freeze Columns
|
|
1439
1758
|
|
|
1440
1759
|
▶️ *Core > Browser > Freeze column*
|
|
@@ -1463,7 +1782,7 @@ This feature allows you to change how a pointer is represented in the browser. B
|
|
|
1463
1782
|
|
|
1464
1783
|
> ⚠️ For each custom pointer key in each row, a server request is triggered to resolve the custom pointer key. For example, if the browser shows a class with 50 rows and each row contains 3 custom pointer keys, a total of 150 separate server requests are triggered.
|
|
1465
1784
|
|
|
1466
|
-
###
|
|
1785
|
+
### Data Export
|
|
1467
1786
|
|
|
1468
1787
|
▶️ *Core > Browser > Export*
|
|
1469
1788
|
|
|
@@ -1471,6 +1790,27 @@ This feature will take either selected rows or all rows of an individual class a
|
|
|
1471
1790
|
|
|
1472
1791
|
> ⚠️ There is currently a 10,000 row limit when exporting all data. If more than 10,000 rows are present in the class, the CSV file will only contain 10,000 rows.
|
|
1473
1792
|
|
|
1793
|
+
### Data Import
|
|
1794
|
+
|
|
1795
|
+
▶️ *Core > Browser > Data > Import*
|
|
1796
|
+
|
|
1797
|
+
Import data into a class from a JSON or CSV file. The file format is the same as the export format, so you can export data from one class and import it into another.
|
|
1798
|
+
|
|
1799
|
+
- **JSON** — An array of objects, e.g. `[{ "name": "Alice", "score": 100 }, ...]`. Typed fields such as `Pointer`, `Date`, `GeoPoint`, and `File` are expected in Parse `_toFullJSON()` format.
|
|
1800
|
+
- **CSV** — Comma-separated with a header row. Column types are reconstructed from the class schema.
|
|
1801
|
+
|
|
1802
|
+
The import dialog provides the following options:
|
|
1803
|
+
|
|
1804
|
+
| Option | Description |
|
|
1805
|
+
|---|---|
|
|
1806
|
+
| Preserve object IDs | Use `objectId` values from the file instead of generating new ones. Requires the server option `allowCustomObjectId`. |
|
|
1807
|
+
| Preserve timestamps | Use `createdAt` / `updatedAt` from the file. Requires `apps[].maintenanceKey` in the dashboard config. |
|
|
1808
|
+
| Duplicate handling | When preserving object IDs: overwrite, skip, or fail on duplicates. |
|
|
1809
|
+
| Unknown columns | Auto-create new columns, ignore them, or fail on unknown columns. |
|
|
1810
|
+
| Continue on errors | Skip failing rows and continue, or stop on the first error. |
|
|
1811
|
+
|
|
1812
|
+
> ⚠️ Disabling *Preserve object IDs* means new object IDs are generated. Any `Pointer` or `Relation` fields that reference objects within the same import file will not resolve correctly.
|
|
1813
|
+
|
|
1474
1814
|
## AI Agent
|
|
1475
1815
|
|
|
1476
1816
|
The Parse Dashboard includes an AI agent that can help manage your Parse Server data through natural language commands. The agent can perform operations like creating classes, adding data, querying records, and more.
|
|
@@ -1670,6 +2010,24 @@ Example:
|
|
|
1670
2010
|
> [!Warning]
|
|
1671
2011
|
> The URL will be directly invoked by the browser when trying to display the image. For security reasons, make sure you either control the full URL, including the image file name, or sanitize the URL before returning it to the dashboard. URLs containing `javascript:` or `<script` will be blocked automatically and replaced with a placeholder.
|
|
1672
2012
|
|
|
2013
|
+
#### Video
|
|
2014
|
+
|
|
2015
|
+
Videos are rendered directly in the output table with a `<video>` tag that includes playback controls. The content mode is always "scale to fit", meaning that the video maintains its aspect ratio within the specified dimensions.
|
|
2016
|
+
|
|
2017
|
+
Example:
|
|
2018
|
+
|
|
2019
|
+
```json
|
|
2020
|
+
{
|
|
2021
|
+
"__type": "Video",
|
|
2022
|
+
"url": "https://example.com/video.mp4",
|
|
2023
|
+
"width": "320",
|
|
2024
|
+
"height": "240"
|
|
2025
|
+
}
|
|
2026
|
+
```
|
|
2027
|
+
|
|
2028
|
+
> [!Warning]
|
|
2029
|
+
> The URL will be directly invoked by the browser when trying to display the video. For security reasons, make sure you either control the full URL, including the video file name, or sanitize the URL before returning it to the dashboard. URLs containing `javascript:` or `<script` will be blocked automatically and replaced with a placeholder.
|
|
2030
|
+
|
|
1673
2031
|
# Contributing
|
|
1674
2032
|
|
|
1675
2033
|
We really want Parse to be yours, to see it grow and thrive in the open source community. Please see the [Contributing to Parse Dashboard guide](CONTRIBUTING.md).
|