parse-dashboard-analytics 7.4.0 → 7.4.1

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.
@@ -162,7 +162,13 @@ module.exports = (options) => {
162
162
  if (allowInsecureHTTP || trustProxy || dev) {app.enable('trust proxy');}
163
163
 
164
164
  config.data.trustProxy = trustProxy;
165
- const dashboardOptions = { allowInsecureHTTP, cookieSessionSecret, dev, cookieSessionMaxAge };
165
+ const dashboardOptions = {
166
+ allowInsecureHTTP,
167
+ cookieSessionSecret,
168
+ dev,
169
+ cookieSessionMaxAge,
170
+ cookieSessionStore: config.data.cookieSessionStore
171
+ };
166
172
  app.use(mountPath, parseDashboard(config.data, dashboardOptions));
167
173
  let server;
168
174
  if(!configSSLKey || !configSSLCert){
package/README.md CHANGED
@@ -170,11 +170,14 @@ After starting the dashboard, you can visit http://localhost:4040 in your browse
170
170
  ## Compatibility
171
171
 
172
172
  ### Parse Server
173
- Parse Dashboard is compatible with the following Parse Server versions.
173
+ Parse Dashboard is compatible with the following versions of Parse Server.
174
174
 
175
- | Parse Dashboard Version | Parse Server Version | Compatible |
176
- |-------------------------|----------------------|------------|
177
- | >=1.0 | >= 2.1.4 | ✅ Yes |
175
+ | Parse Dashboard | Parse Server |
176
+ |-----------------|------------------|
177
+ | >= 1.0.0 | >= 2.1.4 < 7.0.0 |
178
+ | >= 8.0.0 | >= 7.0.0 |
179
+
180
+ Parse Dashboard automatically checks the Parse Server version when connecting and displays a warning if the server version does not meet the minimum required version. The required Parse Server version is defined in the `supportedParseServerVersion` field in `package.json`.
178
181
 
179
182
  ### Node.js
180
183
  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.
@@ -189,32 +192,130 @@ Parse Dashboard is continuously tested with the most recent releases of Node.js
189
192
 
190
193
  ### Options
191
194
 
192
- | Parameter | Type | Optional | Default | Example | Description |
193
- |----------------------------------------|---------------------|----------|---------|--------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
194
- | `apps` | Array&lt;Object&gt; | no | - | `[{ ... }, { ... }]` | The apps that are configured for the dashboard. |
195
- | `apps.appId` | String | yes | - | `"myAppId"` | The Application ID for your Parse Server instance. |
196
- | `apps.masterKey` | String \| Function | yes | - | `"exampleMasterKey"`, `() => "exampleMasterKey"` | The master key for full access to Parse Server. It can be provided directly as a String or as a Function returning a String. |
197
- | `apps.masterKeyTtl` | Number | no | - | `3600` | Time-to-live (TTL) for the master key in seconds. This defines how long the master key is cached before the `masterKey` function is re-triggered. |
198
- | `apps.serverURL` | String | yes | - | `"http://localhost:1337/parse"` | The URL where your Parse Server is running. |
199
- | `apps.appName` | String | no | - | `"MyApp"` | The display name of the app in the dashboard. |
200
- | `infoPanel` | Array&lt;Object&gt; | yes | - | `[{ ... }, { ... }]` | The [info panel](#info-panel) configuration. |
201
- | `infoPanel[*].title` | String | no | - | `User Details` | The panel title. |
202
- | `infoPanel[*].classes` | Array&lt;String&gt; | no | - | `["_User"]` | The classes for which the info panel should be displayed. |
203
- | `infoPanel[*].cloudCodeFunction` | String | no | - | `getUserDetails` | The Cloud Code Function which received the selected object in the data browser and returns the response to be displayed in the info panel. |
204
- | `infoPanel[*].prefetchObjects` | Number | yes | `0` | `2` | Number of next rows to prefetch when browsing sequential rows. For example, `2` means the next 2 rows will be fetched in advance. |
205
- | `infoPanel[*].prefetchStale` | Number | yes | `0` | `10` | Duration in seconds after which prefetched data is discarded as stale. |
206
- | `apps.scripts` | Array&lt;Object&gt; | yes | `[]` | `[{ ... }, { ... }]` | The scripts that can be executed for that app. |
207
- | `apps.scripts.title` | String | no | - | `'Delete User'` | The title that will be displayed in the data browser context menu and the script run confirmation dialog. |
208
- | `apps.scripts.classes` | Array&lt;String&gt; | no | - | `['_User']` | The classes of Parse Objects for which the scripts can be executed. |
209
- | `apps.scripts.cloudCodeFunction` | String | no | - | `'deleteUser'` | The name of the Parse Cloud Function to execute. |
210
- | `apps.scripts.executionBatchSize` | Integer | yes | `1` | `10` | The batch size with which a script should be executed on all selected objects. For example, with 50 objects selected, a batch size of 10 means the script will run on 10 objects in parallel, running a total of 5 batches in serial. |
211
- | `apps.scripts.showConfirmationDialog` | Bool | yes | `false` | `true` | Is `true` if a confirmation dialog should be displayed before the script is executed, `false` if the script should be executed immediately. |
212
- | `apps.scripts.confirmationDialogStyle` | String | yes | `info` | `critical` | The style of the confirmation dialog. Valid values: `info` (blue style), `critical` (red style). |
213
- | `apps.cloudConfigHistoryLimit` | Integer | yes | `100` | `100` | The number of historic values that should be saved in the Cloud Config change history. Valid values: `0`...`Number.MAX_SAFE_INTEGER`. |
195
+ 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
+
197
+ #### Root Configuration Keys
198
+
199
+ | Key | Type | Required | Default | CLI | Env Variable | Example | Description | Links to Details |
200
+ |-----|------|----------|---------|-----|--------------|---------|-------------|------------------|
201
+ | `apps` | Array&lt;Object&gt; | Yes | - | - | `PARSE_DASHBOARD_CONFIG` | `[{...}]` | Array of Parse Server apps to manage | [App Configuration](#app-configuration-apps-array) |
202
+ | `users` | Array&lt;Object&gt; | No | - | - | - | `[{...}]` | User accounts for dashboard authentication | [User Configuration](#user-configuration-users) |
203
+ | `useEncryptedPasswords` | Boolean | No | `false` | - | - | `true` | Use bcrypt hashes instead of plain text passwords | - |
204
+ | `trustProxy` | Boolean \| Number | No | `false` | `--trustProxy` | `PARSE_DASHBOARD_TRUST_PROXY` | `1` | Trust X-Forwarded-* headers when behind proxy | - |
205
+ | `iconsFolder` | String | No | - | - | - | `"icons"` | Folder for app icons (relative or absolute path) | - |
206
+ | `agent` | Object | No | - | - | `PARSE_DASHBOARD_AGENT` (JSON) | `{...}` | AI agent configuration | [AI Agent Configuration](#ai-agent) |
207
+ | `enableResourceCache` | Boolean | No | `false` | - | - | `true` | Enable browser caching of dashboard resources | - |
208
+
209
+
210
+ ##### App Configuration (`apps` array)
211
+
212
+ | Parameter | Type | Optional | Default | CLI | Env Variable | Example | Description |
213
+ | -------------------------- | ------------------- | -------- | --------- | -------------------- | ------------------------------------ | --------------------------------- | ------------------------------------------------------------------------------------------------------------ |
214
+ | `appId` | String | no | - | `--appId` | `PARSE_DASHBOARD_APP_ID` | `"myAppId"` | The Application ID for your Parse Server instance. |
215
+ | `masterKey` | String \| Function | no | - | `--masterKey` | `PARSE_DASHBOARD_MASTER_KEY` | `"key"` or `() => "key"` | Master key for full access. Can be a String or Function returning a String. |
216
+ | `serverURL` | String | no | - | `--serverURL` | `PARSE_DASHBOARD_SERVER_URL` | `"http://localhost:1337/parse"` | The URL where your Parse Server is running. |
217
+ | `appName` | String | yes | `appId` | `--appName` | `PARSE_DASHBOARD_APP_NAME` | `"MyApp"` | Display name of the app. |
218
+ | `masterKeyTtl` | Number | yes | - | `--masterKeyTtl` | - | `3600` | TTL for master key cache in seconds (only when masterKey is a function). |
219
+ | `readOnlyMasterKey` | String | yes | - | - | - | `"myReadOnlyKey"` | Read-only master key that prevents mutations. |
220
+ | `clientKey` | String | yes | - | - | - | `"myClientKey"` | Client key for Parse SDK (legacy, mostly unused). |
221
+ | `javascriptKey` | String | yes | - | - | - | `"myJsKey"` | JavaScript key for Parse SDK (legacy, mostly unused). |
222
+ | `restKey` | String | yes | - | - | - | `"myRestKey"` | REST API key for server-side REST applications. |
223
+ | `windowsKey` | String | yes | - | - | - | `"myWindowsKey"` | Windows SDK key (legacy, mostly unused). |
224
+ | `webhookKey` | String | yes | - | - | - | `"myWebhookKey"` | Webhook key for Cloud Code Webhooks. |
225
+ | `fileKey` | String | yes | - | - | - | `"myFileKey"` | File key used for file migrations. |
226
+ | `graphQLServerURL` | String | yes | - | `--graphQLServerURL` | `PARSE_DASHBOARD_GRAPHQL_SERVER_URL` | `"http://localhost:1337/graphql"` | The URL where your Parse GraphQL Server is running. |
227
+ | `appNameForURL` | String | yes | `appName` | - | - | `"my-app"` | URL-friendly name used in dashboard URLs. |
228
+ | `production` | Boolean | yes | `false` | - | - | `true` | Mark as production environment. |
229
+ | `iconName` | String | yes | - | - | - | `"icon.png"` | Filename of app icon (requires global `iconsFolder`). |
230
+ | `primaryBackgroundColor` | String | yes | - | - | - | `"#FFA500"` | Primary background color (CSS value). |
231
+ | `secondaryBackgroundColor` | String | yes | - | - | - | `"#FF4500"` | Secondary background color (CSS value). |
232
+ | `supportedPushLocales` | Array&lt;String&gt; | yes | - | - | - | `["en","fr"]` | Supported locales for push notifications. |
233
+ | `preventSchemaEdits` | Boolean | yes | `false` | - | - | `true` | Prevent schema modifications through the dashboard. |
234
+ | `columnPreference` | Object | yes | - | - | - | `{"_User":[...]}` | Column visibility/sorting/filtering preferences. See [column preferences details](#prevent-columns-sorting). |
235
+ | `classPreference` | Object | yes | - | - | - | `{"_Role":{...}}` | Persistent filters for all users. See [persistent filters details](#persistent-filters). |
236
+ | `enableSecurityChecks` | Boolean | yes | `false` | - | - | `true` | Enable security checks under App Settings > Security. |
237
+ | `cloudConfigHistoryLimit` | Integer | yes | `100` | - | - | `200` | Number of historic Cloud Config values (0 to Number.MAX_SAFE_INTEGER). |
238
+ | `config` | Object | yes | - | - | - | `{...}` | Settings for storing dashboard config on server. |
239
+ | `config.className` | String | yes | - | - | - | `"DashboardConfig"` | Table name for dashboard configuration. |
240
+ | `scripts` | Array&lt;Object&gt; | yes | `[]` | - | - | `[{...}]` | Scripts for this app. See [scripts table below](#scripts). |
241
+ | `infoPanel` | Array&lt;Object&gt; | yes | - | - | - | `[{...}]` | Info panel config. See [info panel table below](#info-panel). |
242
+
243
+ ##### Column Preference Configuration (`apps[].columnPreference.<className>[]`)
244
+
245
+ Each class in `columnPreference` can have an array of column configurations:
246
+
247
+ | Parameter | Type | Optional | Default | Example | Description |
248
+ | ------------------|---------|----------|---------|---------------|----------------------------------------------------|
249
+ | `name` | String | no | - | `"createdAt"` | Column/field name. |
250
+ | `visible` | Boolean | yes | `true` | `false` | Whether the column is visible in the data browser. |
251
+ | `preventSort` | Boolean | yes | `false` | `true` | Prevent this column from being sortable. |
252
+ | `filterSortToTop` | Boolean | yes | `false` | `true` | Sort this column to the top in filter popup. |
253
+
254
+ ##### Scripts Configuration (`apps[].scripts[]`)
255
+
256
+ | Parameter | Type | Optional | Default | Example | Description |
257
+ | --------------------------|--------------------------------------------|----------|---------|-----------------|---------------------------------------------------|
258
+ | `title` | String | no | - | `"Delete User"` | Title in context menu and confirmation dialog. |
259
+ | `classes` | Array&lt;String&gt; \| Array&lt;Object&gt; | no | - | `["_User"]` | Classes for which script can run. |
260
+ | `cloudCodeFunction` | String | no | - | `"deleteUser"` | Parse Cloud Function name to execute. |
261
+ | `executionBatchSize` | Integer | yes | `1` | `10` | Batch size for multiple objects (runs in serial). |
262
+ | `showConfirmationDialog` | Boolean | yes | `false` | `true` | Show confirmation dialog before execution. |
263
+ | `confirmationDialogStyle` | String | yes | `info` | `critical` | Dialog style: `info` (blue) or `critical` (red). |
264
+
265
+ ##### Info Panel Configuration (`apps[].infoPanel[]`)
266
+
267
+ | Parameter | Type | Optional | Default | Example | Description |
268
+ | --------------------|---------------------|----------|---------|--------------------|-----------------------------------------------|
269
+ | `title` | String | no | - | `"User Details"` | Panel title. |
270
+ | `classes` | Array&lt;String&gt; | no | - | `["_User"]` | Classes for which panel is displayed. |
271
+ | `cloudCodeFunction` | String | no | - | `"getUserDetails"` | Cloud Function receiving selected object. |
272
+ | `prefetchObjects` | Number | yes | `0` | `2` | Number of next rows to prefetch. |
273
+ | `prefetchStale` | Number | yes | `0` | `10` | Seconds after which prefetched data is stale. |
274
+ | `prefetchImage` | Boolean | yes | `true` | `false` | Whether to prefetch image content. |
275
+ | `prefetchVideo` | Boolean | yes | `true` | `false` | Whether to prefetch video content. |
276
+ | `prefetchAudio` | Boolean | yes | `true` | `false` | Whether to prefetch audio content. |
277
+
278
+
279
+ ##### User Configuration (`users[]`)
280
+
281
+ | Parameter | Type | Optional | Default | CLI | Env Variable | Example | Description |
282
+ | ------------------|---------------------|----------|----------|------------------|---------------------------------|----------------------|----------------------------------------|
283
+ | `user` | String | no | - | `--userId` | `PARSE_DASHBOARD_USER_ID` | `"admin"` | Username for authentication. |
284
+ | `pass` | String | no | - | `--userPassword` | `PARSE_DASHBOARD_USER_PASSWORD` | `"pass"` | Password (plain or bcrypt hash). |
285
+ | `mfa` | String | yes | - | - | - | `"JBSWY3DPEHPK3PXP"` | MFA secret for TOTP. |
286
+ | `mfaAlgorithm` | String | yes | `"SHA1"` | - | - | `"SHA256"` | TOTP algorithm for MFA. |
287
+ | `mfaDigits` | Number | yes | `6` | - | - | `8` | Number of digits in MFA code. |
288
+ | `mfaPeriod` | Number | yes | `30` | - | - | `60` | MFA code validity period in seconds. |
289
+ | `readOnly` | Boolean | yes | `false` | - | - | `true` | Read-only access to all their apps. |
290
+ | `apps` | Array&lt;Object&gt; | yes | - | - | - | `[{...}]` | Apps user can access (all if omitted). |
291
+ | `apps[].appId` | String | no | - | - | - | `"myAppId"` | App ID user can access. |
292
+ | `apps[].readOnly` | Boolean | yes | `false` | - | - | `true` | Read-only access to this specific app. |
293
+
294
+ #### CLI & Server Options
295
+
296
+ | Parameter | Type | Optional | Default | CLI | Env Variable | Example | Description |
297
+ | ----------------------|---------|----------|--------------|-------------------------|------------------------------------------|-----------------| -------------------------------------------------|
298
+ | `host` | String | yes | `"0.0.0.0"` | `--host` | `HOST` | `"127.0.0.1"` | Host address to bind server. |
299
+ | `port` | Number | yes | `4040` | `--port` | `PORT` | `8080` | Port for dashboard server. |
300
+ | `mountPath` | String | yes | `"/"` | `--mountPath` | `MOUNT_PATH` | `"/dashboard"` | Mount path for application. |
301
+ | `allowInsecureHTTP` | Boolean | yes | `false` | `--allowInsecureHTTP` | `PARSE_DASHBOARD_ALLOW_INSECURE_HTTP` | `true` | Allow HTTP (use behind HTTPS proxy). |
302
+ | `sslKey` | String | yes | - | `--sslKey` | `PARSE_DASHBOARD_SSL_KEY` | `"/path/key"` | Path to SSL private key for HTTPS. |
303
+ | `sslCert` | String | yes | - | `--sslCert` | `PARSE_DASHBOARD_SSL_CERT` | `"/path/cert"` | Path to SSL certificate for HTTPS. |
304
+ | `cookieSessionSecret` | String | yes | Random | `--cookieSessionSecret` | `PARSE_DASHBOARD_COOKIE_SESSION_SECRET` | `"secret"` | Secret for session cookies (for multi-server). |
305
+ | `cookieSessionMaxAge` | Number | yes | Session-only | `--cookieSessionMaxAge` | `PARSE_DASHBOARD_COOKIE_SESSION_MAX_AGE` | `3600` | Session cookie expiration (seconds). |
306
+ | `dev` | Boolean | yes | `false` | `--dev` | - | - | Development mode (**DO NOT use in production**). |
307
+ | `config` | String | yes | - | `--config` | - | `"config.json"` | Path to JSON configuration file. |
308
+
309
+ #### Helper CLI Commands
310
+
311
+ | Command | Description |
312
+ | ---------------|---------------------------------------------------------------------|
313
+ | `--createUser` | Interactive tool to generate secure user passwords and MFA secrets. |
314
+ | `--createMFA` | Interactive tool to generate MFA secrets for existing users. |
214
315
 
215
316
  ### File
216
317
 
217
- You can also start the dashboard from the command line with a config file. To do this, create a new file called `parse-dashboard-config.json` inside your local Parse Dashboard directory hierarchy. The file should match the following format:
318
+ You can also start the dashboard from the command line with a config file. To do this, create a new file called `parse-dashboard-config.json` inside your local Parse Dashboard directory hierarchy. The file should match the following format:
218
319
 
219
320
  ```json
220
321
  {
@@ -749,6 +850,55 @@ If you create a new user by running `parse-dashboard --createUser`, you will be
749
850
 
750
851
  Parse Dashboard follows the industry standard and supports the common OTP algorithm `SHA-1` by default, to be compatible with most authenticator apps. If you have specific security requirements regarding TOTP characteristics (algorithm, digit length, time period) you can customize them by using the guided configuration mentioned above.
751
852
 
853
+ ### Running Multiple Dashboard Replicas
854
+
855
+ When deploying Parse Dashboard with multiple replicas behind a load balancer, you need to use a shared session store to ensure that CSRF tokens and user sessions work correctly across all replicas. Without a shared session store, login attempts may fail with "CSRF token validation failed" errors when requests are distributed across different replicas.
856
+
857
+ #### Using a Custom Session Store
858
+
859
+ Parse Dashboard supports using any session store compatible with [express-session](https://github.com/expressjs/session). The `sessionStore` option must be configured programmatically when initializing the dashboard.
860
+
861
+ **Suggested Session Stores:**
862
+
863
+ - [connect-redis](https://www.npmjs.com/package/connect-redis) - Redis session store
864
+ - [connect-mongo](https://www.npmjs.com/package/connect-mongo) - MongoDB session store
865
+ - [connect-pg-simple](https://www.npmjs.com/package/connect-pg-simple) - PostgreSQL session store
866
+ - [memorystore](https://www.npmjs.com/package/memorystore) - Memory session store with TTL support
867
+
868
+ **Example using connect-redis:**
869
+
870
+ ```js
871
+ const express = require('express');
872
+ const ParseDashboard = require('parse-dashboard');
873
+ const { createClient } = require('redis');
874
+ const RedisStore = require('connect-redis').default;
875
+
876
+ // Instantiate Redis client
877
+ const redisClient = createClient({ url: 'redis://localhost:6379' });
878
+ redisClient.connect();
879
+
880
+ // Instantiate Redis session store
881
+ const cookieSessionStore = new RedisStore({ client: redisClient });
882
+
883
+ // Configure dashboard with session store
884
+ const dashboard = new ParseDashboard({
885
+ apps: [...],
886
+ users: [...],
887
+ }, {
888
+ cookieSessionStore,
889
+ cookieSessionSecret: 'your-secret-key',
890
+ });
891
+
892
+ **Important Notes:**
893
+
894
+ - The `cookieSessionSecret` option must be set to the same value across all replicas to ensure session cookies work correctly.
895
+ - If `cookieSessionStore` is not provided, Parse Dashboard will use the default in-memory session store, which only works for single-instance deployments.
896
+ - For production deployments with multiple replicas, always configure a shared session store.
897
+
898
+ #### Alternative: Using Sticky Sessions
899
+
900
+ If you cannot use a shared session store, you can configure your load balancer to use sticky sessions (session affinity), which ensures that requests from the same user are always routed to the same replica. However, using a shared session store is the recommended approach as it provides better reliability and scalability.
901
+
752
902
  ### Separating App Access Based on User Identity
753
903
  If you have configured your dashboard to manage multiple applications, you can restrict the management of apps based on user identity.
754
904
 
@@ -969,7 +1119,10 @@ The following example dashboard configuration shows an info panel for the `_User
969
1119
  "classes": ["_User"],
970
1120
  "cloudCodeFunction": "getUserDetails",
971
1121
  "prefetchObjects": 2,
972
- "prefetchStale": 10
1122
+ "prefetchStale": 10,
1123
+ "prefetchImage": true,
1124
+ "prefetchVideo": true,
1125
+ "prefetchAudio": true
973
1126
  }
974
1127
  ]
975
1128
  }
@@ -1270,13 +1423,18 @@ Example:
1270
1423
 
1271
1424
  To reduce the time for info panel data to appear, data can be prefetched.
1272
1425
 
1273
- | Parameter | Type | Optional | Default | Example | Description |
1274
- |--------------------------------|--------|----------|---------|---------|-----------------------------------------------------------------------------------------------------------------------------------|
1275
- | `infoPanel[*].prefetchObjects` | Number | yes | `0` | `2` | Number of next rows to prefetch when browsing sequential rows. For example, `2` means the next 2 rows will be fetched in advance. |
1276
- | `infoPanel[*].prefetchStale` | Number | yes | `0` | `10` | Duration in seconds after which prefetched data is discarded as stale. |
1426
+ | Parameter | Type | Optional | Default | Example | Description |
1427
+ |--------------------------------|---------|----------|---------|---------|-----------------------------------------------------------------------------------------------------------------------------------|
1428
+ | `infoPanel[*].prefetchObjects` | Number | yes | `0` | `2` | Number of navigation steps to prefetch ahead when browsing sequential rows. For example, `2` means data for the next 2 navigation steps will be fetched in advance. When using multi-panel mode with batch navigation enabled, each navigation step corresponds to a full batch of panels, so the total number of prefetched objects will be `prefetchObjects × panelCount`. |
1429
+ | `infoPanel[*].prefetchStale` | Number | yes | `0` | `10` | Duration in seconds after which prefetched data is discarded as stale. |
1430
+ | `infoPanel[*].prefetchImage` | Boolean | yes | `true` | `false` | Whether to prefetch image content when prefetching objects. Only applies when `prefetchObjects` is enabled. |
1431
+ | `infoPanel[*].prefetchVideo` | Boolean | yes | `true` | `false` | Whether to prefetch video content when prefetching objects. Only applies when `prefetchObjects` is enabled. |
1432
+ | `infoPanel[*].prefetchAudio` | Boolean | yes | `true` | `false` | Whether to prefetch audio content when prefetching objects. Only applies when `prefetchObjects` is enabled. |
1277
1433
 
1278
1434
  Prefetching is particularly useful when navigating through lists of objects. To optimize performance and avoid unnecessary data loading, prefetching is triggered only after the user has moved through 3 consecutive rows using the keyboard down-arrow key or by mouse click.
1279
1435
 
1436
+ 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
+
1280
1438
  ### Freeze Columns
1281
1439
 
1282
1440
  ▶️ *Core > Browser > Freeze column*
@@ -1522,4 +1680,4 @@ As of April 5, 2017, Parse, LLC has transferred this code to the parse-community
1522
1680
 
1523
1681
  [license-svg]: https://img.shields.io/badge/license-BSD-lightgrey.svg
1524
1682
  [license-link]: LICENSE
1525
- [open-collective-link]: https://opencollective.com/parse-server
1683
+ [open-collective-link]: https://opencollective.com/parse-server
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "parse-dashboard-analytics",
3
- "version": "7.4.0",
3
+ "version": "7.4.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/pastordee/parse-dashboard"
@@ -22,6 +22,7 @@
22
22
  "Relation Editor",
23
23
  "Enhanced Analytics Dashboard"
24
24
  ],
25
+ "supportedParseServerVersion": ">=7.0.0",
25
26
  "keywords": [
26
27
  "parse",
27
28
  "dashboard",
@@ -43,15 +44,15 @@
43
44
  "@babel/runtime": "7.27.4",
44
45
  "@babel/runtime-corejs3": "7.28.3",
45
46
  "bcryptjs": "3.0.2",
46
- "body-parser": "2.2.0",
47
+ "body-parser": "2.2.1",
47
48
  "commander": "13.1.0",
48
49
  "connect-flash": "0.1.1",
49
- "cookie-session": "2.1.1",
50
50
  "copy-to-clipboard": "3.3.3",
51
51
  "core-js": "3.42.0",
52
52
  "cors": "^2.8.5",
53
53
  "csurf": "1.11.0",
54
- "express": "^4.21.2",
54
+ "express": "4.21.2",
55
+ "express-session": "1.18.2",
55
56
  "fast-deep-equal": "3.1.3",
56
57
  "graphiql": "2.0.8",
57
58
  "graphql": "16.11.0",
@@ -62,9 +63,8 @@
62
63
  "node-fetch": "3.3.2",
63
64
  "otpauth": "8.0.3",
64
65
  "package-json": "7.0.0",
65
- "parse": "3.5.1",
66
- "parse-server": "^8.2.3",
67
- "passport": "0.5.3",
66
+ "parse": "7.1.2",
67
+ "passport": "0.7.0",
68
68
  "passport-local": "1.0.0",
69
69
  "prismjs": "1.30.0",
70
70
  "prop-types": "15.8.1",
@@ -88,7 +88,7 @@
88
88
  "@babel/eslint-parser": "7.28.0",
89
89
  "@babel/plugin-proposal-decorators": "7.27.1",
90
90
  "@babel/plugin-transform-runtime": "7.28.0",
91
- "@babel/preset-env": "7.27.2",
91
+ "@babel/preset-env": "7.28.5",
92
92
  "@babel/preset-react": "7.27.1",
93
93
  "@eslint/compat": "1.3.1",
94
94
  "@saithodev/semantic-release-backmerge": "4.0.1",