parse-dashboard-analytics 1.0.6 → 1.0.8
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/app.js +102 -2
- package/Parse-Dashboard/parse-dashboard-config.json +8 -5
- package/Parse-Dashboard/public/analytics.html +9 -8
- package/Parse-Dashboard/public/bundles/dashboard.bundle.js +1 -1
- package/Parse-Dashboard/public/custom-remote-analytics.html +710 -0
- package/Parse-Dashboard/public/simple-analytics.html +294 -0
- package/package.json +4 -1
package/Parse-Dashboard/app.js
CHANGED
|
@@ -1093,16 +1093,116 @@ You have direct access to the Parse database through function calls, so you can
|
|
|
1093
1093
|
`);
|
|
1094
1094
|
});
|
|
1095
1095
|
|
|
1096
|
-
// Analytics dashboard
|
|
1096
|
+
// Analytics dashboard routes - Only serve custom analytics if analyticsPage is configured
|
|
1097
1097
|
app.get('/apps/*/analytics_dashboard', function(req, res) {
|
|
1098
|
+
console.log('🎯 Analytics dashboard route hit:', req.path, req.url);
|
|
1099
|
+
|
|
1098
1100
|
if (users && (!req.user || !req.user.isAuthenticated)) {
|
|
1101
|
+
console.log('🔒 User not authenticated, redirecting to login');
|
|
1099
1102
|
const redirect = req.url.replace('/login', '');
|
|
1100
1103
|
if (redirect.length > 1) {
|
|
1101
1104
|
return res.redirect(`${mountPath}login?redirect=${redirect}`);
|
|
1102
1105
|
}
|
|
1103
1106
|
return res.redirect(`${mountPath}login`);
|
|
1104
1107
|
}
|
|
1105
|
-
|
|
1108
|
+
|
|
1109
|
+
// Extract app ID from URL
|
|
1110
|
+
const appIdMatch = req.path.match(/\/apps\/([^\/]+)\/analytics_dashboard/);
|
|
1111
|
+
const appId = appIdMatch ? appIdMatch[1] : null;
|
|
1112
|
+
console.log('📱 Extracted app ID:', appId);
|
|
1113
|
+
|
|
1114
|
+
// Find the app configuration
|
|
1115
|
+
let customAnalyticsPath = null;
|
|
1116
|
+
if (appId && config.apps) {
|
|
1117
|
+
const app = config.apps.find(app => app.appId === appId || app.appNameForURL === appId || app.appName === appId);
|
|
1118
|
+
console.log('🔍 Found app config:', app ? 'YES' : 'NO', app ? app.analyticsPage : 'N/A');
|
|
1119
|
+
if (app && app.analyticsPage) {
|
|
1120
|
+
customAnalyticsPath = app.analyticsPage;
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
// Only serve custom analytics page if analyticsPage is configured
|
|
1125
|
+
if (customAnalyticsPath) {
|
|
1126
|
+
console.log('✅ Using custom analytics path:', customAnalyticsPath);
|
|
1127
|
+
if (customAnalyticsPath.startsWith('/')) {
|
|
1128
|
+
// It's a URL path, serve from public directory
|
|
1129
|
+
const publicPath = path.join(__dirname, 'public', customAnalyticsPath);
|
|
1130
|
+
console.log('📁 Serving from public directory:', publicPath);
|
|
1131
|
+
if (fs.existsSync(publicPath)) {
|
|
1132
|
+
return res.sendFile(publicPath);
|
|
1133
|
+
} else {
|
|
1134
|
+
console.warn(`Custom analytics page not found in public directory: ${publicPath}, falling back to React component`);
|
|
1135
|
+
}
|
|
1136
|
+
} else {
|
|
1137
|
+
// It's an absolute file path
|
|
1138
|
+
console.log('📁 Serving from absolute path:', customAnalyticsPath);
|
|
1139
|
+
if (fs.existsSync(customAnalyticsPath)) {
|
|
1140
|
+
return res.sendFile(path.resolve(customAnalyticsPath));
|
|
1141
|
+
} else {
|
|
1142
|
+
console.warn(`Custom analytics page not found: ${customAnalyticsPath}, falling back to React component`);
|
|
1143
|
+
}
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1147
|
+
// No custom analytics page configured or file not found - let React component handle it
|
|
1148
|
+
console.log('🔄 No custom analyticsPage configured, falling through to React component');
|
|
1149
|
+
return; // This will fall through to the catch-all route for React routing
|
|
1150
|
+
});
|
|
1151
|
+
|
|
1152
|
+
// Alternative analytics dashboard route (with slash instead of underscore)
|
|
1153
|
+
app.get('/apps/*/analytics/dashboard', function(req, res) {
|
|
1154
|
+
console.log('🎯 Alternative analytics route hit:', req.path, req.url);
|
|
1155
|
+
|
|
1156
|
+
if (users && (!req.user || !req.user.isAuthenticated)) {
|
|
1157
|
+
console.log('🔒 User not authenticated, redirecting to login');
|
|
1158
|
+
const redirect = req.url.replace('/login', '');
|
|
1159
|
+
if (redirect.length > 1) {
|
|
1160
|
+
return res.redirect(`${mountPath}login?redirect=${redirect}`);
|
|
1161
|
+
}
|
|
1162
|
+
return res.redirect(`${mountPath}login`);
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1165
|
+
// Extract app ID from URL
|
|
1166
|
+
const appIdMatch = req.path.match(/\/apps\/([^\/]+)\/analytics\/dashboard/);
|
|
1167
|
+
const appId = appIdMatch ? appIdMatch[1] : null;
|
|
1168
|
+
console.log('📱 Extracted app ID:', appId);
|
|
1169
|
+
|
|
1170
|
+
// Find the app configuration
|
|
1171
|
+
let customAnalyticsPath = null;
|
|
1172
|
+
if (appId && config.apps) {
|
|
1173
|
+
const app = config.apps.find(app => app.appId === appId || app.appNameForURL === appId || app.appName === appId);
|
|
1174
|
+
console.log('🔍 Found app config:', app ? 'YES' : 'NO', app ? app.analyticsPage : 'N/A');
|
|
1175
|
+
if (app && app.analyticsPage) {
|
|
1176
|
+
customAnalyticsPath = app.analyticsPage;
|
|
1177
|
+
}
|
|
1178
|
+
}
|
|
1179
|
+
|
|
1180
|
+
// Only serve custom analytics page if analyticsPage is configured
|
|
1181
|
+
if (customAnalyticsPath) {
|
|
1182
|
+
console.log('✅ Using custom analytics path:', customAnalyticsPath);
|
|
1183
|
+
if (customAnalyticsPath.startsWith('/')) {
|
|
1184
|
+
// It's a URL path, serve from public directory
|
|
1185
|
+
const publicPath = path.join(__dirname, 'public', customAnalyticsPath);
|
|
1186
|
+
console.log('📁 Serving from public directory:', publicPath);
|
|
1187
|
+
if (fs.existsSync(publicPath)) {
|
|
1188
|
+
return res.sendFile(publicPath);
|
|
1189
|
+
} else {
|
|
1190
|
+
console.warn(`Custom analytics page not found in public directory: ${publicPath}, falling back to React component`);
|
|
1191
|
+
}
|
|
1192
|
+
} else {
|
|
1193
|
+
// It's an absolute file path
|
|
1194
|
+
console.log('📁 Serving from absolute path:', customAnalyticsPath);
|
|
1195
|
+
if (fs.existsSync(customAnalyticsPath)) {
|
|
1196
|
+
return res.sendFile(path.resolve(customAnalyticsPath));
|
|
1197
|
+
} else {
|
|
1198
|
+
console.warn(`Custom analytics page not found: ${customAnalyticsPath}, falling back to React component`);
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1202
|
+
|
|
1203
|
+
// No custom analytics page configured or file not found - let React component handle it
|
|
1204
|
+
console.log('🔄 No custom analyticsPage configured, falling through to React component');
|
|
1205
|
+
return; // This will fall through to the catch-all route for React routing
|
|
1106
1206
|
});
|
|
1107
1207
|
|
|
1108
1208
|
// For every other request, go to index.html. Let client-side handle the rest.
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"apps": [
|
|
3
3
|
{
|
|
4
|
-
"serverURL": "http://localhost:
|
|
5
|
-
"appId": "
|
|
6
|
-
"masterKey": "
|
|
4
|
+
"serverURL": "http://localhost:1339/parse",
|
|
5
|
+
"appId": "analytics-demo-app",
|
|
6
|
+
"masterKey": "your-master-key-here",
|
|
7
7
|
"appName": "Parse Dashboard Analytics Demo",
|
|
8
|
-
"appNameForURL": "
|
|
8
|
+
"appNameForURL": "analytics-demo-app",
|
|
9
9
|
"iconName": "",
|
|
10
10
|
"primaryBackgroundColor": "#169CEE",
|
|
11
|
-
"secondaryBackgroundColor": "#0F5B8A"
|
|
11
|
+
"secondaryBackgroundColor": "#0F5B8A",
|
|
12
|
+
"analytics": {
|
|
13
|
+
"endpoint": "http://localhost:1339"
|
|
14
|
+
}
|
|
12
15
|
}
|
|
13
16
|
],
|
|
14
17
|
"users": [
|
|
@@ -150,21 +150,22 @@
|
|
|
150
150
|
</a>
|
|
151
151
|
|
|
152
152
|
<div class="analytics-header">
|
|
153
|
-
<h1
|
|
154
|
-
<p
|
|
153
|
+
<h1>🔧 MODIFIED Analytics Dashboard - TEST VERSION</h1>
|
|
154
|
+
<p>⚠️ This is the DEFAULT analytics.html file - NOT the custom one!</p>
|
|
155
|
+
<p style="color: red; font-weight: bold;">If you see this, the custom analyticsPage config is not working properly.</p>
|
|
155
156
|
</div>
|
|
156
157
|
|
|
157
158
|
<div class="metrics-grid">
|
|
158
159
|
<div class="metric-card">
|
|
159
|
-
<div class="metric-value"
|
|
160
|
-
<div class="metric-label">
|
|
161
|
-
<div class="metric-change
|
|
160
|
+
<div class="metric-value">🚨 WRONG FILE 🚨</div>
|
|
161
|
+
<div class="metric-label">This is analytics.html</div>
|
|
162
|
+
<div class="metric-change negative">Should be simple-analytics.html</div>
|
|
162
163
|
</div>
|
|
163
164
|
|
|
164
165
|
<div class="metric-card">
|
|
165
|
-
<div class="metric-value"
|
|
166
|
-
<div class="metric-label">
|
|
167
|
-
<div class="metric-change
|
|
166
|
+
<div class="metric-value">❌ CONFIG ISSUE</div>
|
|
167
|
+
<div class="metric-label">analyticsPage not working</div>
|
|
168
|
+
<div class="metric-change negative">Check configuration</div>
|
|
168
169
|
</div>
|
|
169
170
|
|
|
170
171
|
<div class="metric-card">
|