Skip to content

Commit 8d83764

Browse files
committed
back4app1.0.14.
1 parent be9f498 commit 8d83764

File tree

10 files changed

+67
-195
lines changed

10 files changed

+67
-195
lines changed

Parse-Dashboard/index.html

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<!DOCTYPE html>
2+
<head>
3+
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
4+
<base href="/"/>
5+
<script>
6+
PARSE_DASHBOARD_PATH = "/";
7+
</script>
8+
</head>
9+
<html>
10+
<title>Parse Dashboard</title>
11+
<body>
12+
<div id="browser_mount"></div>
13+
<script src="/bundles/dashboard.bundle.js"></script>
14+
15+
<script type="text/javascript">
16+
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
17+
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
18+
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
19+
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
20+
ga('create', 'UA-66038885-1', 'auto');
21+
ga('send', 'pageview');
22+
setTimeout("ga('send','event','Profitable Engagement','time on page more than 30 seconds')",30000);
23+
</script>
24+
25+
</body>
26+
</html>

src/dashboard/Dashboard.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
* This source code is licensed under the license found in the LICENSE file in
66
* the root directory of this source tree.
77
*/
8+
import AccountManager from 'lib/AccountManager'; // user workaround
89
import AccountOverview from './Account/AccountOverview.react';
910
import AccountView from './AccountView.react';
1011
import AnalyticsOverview from './Analytics/Overview/Overview.react';
@@ -118,7 +119,8 @@ class Dashboard extends React.Component {
118119
}
119120

120121
componentDidMount() {
121-
get('/parse-dashboard-config.json').then(({ apps, newFeaturesInLatestVersion = [] }) => {
122+
get('/parse-dashboard-config.json').then(({ apps, newFeaturesInLatestVersion = [], user }) => {
123+
AccountManager.setCurrentUser({ user });
122124
this.setState({ newFeaturesInLatestVersion });
123125
let appInfoPromises = apps.map(app => {
124126
if (app.serverURL.startsWith('https://api.parse.com/1')) {
@@ -235,7 +237,7 @@ class Dashboard extends React.Component {
235237
<Route path='push/new' component={PushNew} />
236238
<Route path='push/:pushId' component={PushDetails} />
237239

238-
<Redirect from='analytics' to='/apps/:appId/analytics/overview' />
240+
<Redirect from='analytics' to='/apps/:appId/analytics/performance' />
239241
<Route path='analytics'>
240242
<Route path='overview' component={AnalyticsOverview} />
241243
<Redirect from='explorer' to='/apps/:appId/analytics/explorer/chart' />

src/dashboard/DashboardView.react.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,6 @@ export default class DashboardView extends React.Component {
134134
}*/
135135

136136
//These ones might, but require some endpoints to added to Parse Server
137-
/*
138137
if (features.analytics && features.analytics.retentionAnalysis) {
139138
analyticsSidebarSections.push({
140139
name: 'Retention',
@@ -155,19 +154,23 @@ export default class DashboardView extends React.Component {
155154
link: '/analytics/slow_queries'
156155
});
157156
}
158-
*/
159157

160158
let settingsSections = [];
161159

160+
settingsSections.push({
161+
name: 'General',
162+
link: '/settings/general'
163+
});
164+
162165
// Settings - nothing remotely like this in parse-server yet. Maybe it will arrive soon.
163-
/*
166+
164167
if (features.generalSettings) {
165168
settingsSections.push({
166169
name: 'General',
167170
link: '/settings/general'
168171
});
169172
}
170-
173+
/*
171174
if (features.keysSettings) {
172175
settingsSections.push({
173176
name: 'Security & Keys',

src/dashboard/Settings/AppleCerts.react.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export default class AppleCerts extends React.Component {
3535
}
3636

3737
handleUpload(file) {
38+
console.log('wrong way')
3839
this.context.currentApp.uploadAppleCert(file).then((cert) => {
3940
this.state.certs.unshift(cert);
4041
this.setState({ uploadPending: false });

src/dashboard/Settings/Collaborators.react.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,12 @@ export default class Collaborators extends React.Component {
3636
}
3737

3838
handleAdd(newEmail) {
39+
console.log(1, newEmail);
3940
//TODO: Show some in-progress thing while the collaborator is being validated, or maybe have some sort of
4041
//async validator in the parent form. Currently if you mash the add button, they same collaborator gets added many times.
4142
return this.context.currentApp.validateCollaborator(newEmail).then((response) => {
4243
// lastError logic assumes we only have 1 input field
44+
console.log(2, response);
4345
if (response.success) {
4446
let newCollaborators = this.props.collaborators.concat({ userEmail: newEmail })
4547
this.setState({ lastError: '' });
@@ -55,11 +57,13 @@ export default class Collaborators extends React.Component {
5557
}
5658

5759
handleDelete(collaborator) {
60+
console.log('this.props.collaborators', this.props.collaborators);
5861
let newCollaborators = this.props.collaborators.filter(oldCollaborator => oldCollaborator.userEmail !== collaborator.userEmail);
5962
this.props.onRemove(collaborator, newCollaborators);
6063
}
6164

6265
validateEmail(email) {
66+
console.log('validateEmail', email, AccountManager.currentUser());
6367
// We allow mixed-case emails for Parse accounts
6468
let isExistingCollaborator = !!this.props.collaborators.find(collab => email.toLowerCase() === collab.userEmail.toLowerCase());
6569
return validateEmailFormat(email) &&

src/dashboard/Settings/GeneralSettings.react.js

Lines changed: 4 additions & 185 deletions
Original file line numberDiff line numberDiff line change
@@ -46,53 +46,6 @@ const DEFAULT_SETTINGS_LABEL_WIDTH = 62;
4646

4747
let numJobsFromRequestLimit = (limit) => Math.floor((limit-10)/20);
4848

49-
let CurrentPlan = ({requestLimit}) => {
50-
let costString = requestLimit === 30 ?
51-
'Free' :
52-
'$' + ((requestLimit-30) * 10).toString();
53-
return (
54-
<div>
55-
<div className={cost}>{costString}</div>
56-
<div className={features}>{requestLimit.toString() + ' requests per second'}<br/>{numJobsFromRequestLimit(requestLimit).toString() + ' background job' + (numJobsFromRequestLimit(requestLimit) > 1 ? 's' : '')}</div>
57-
</div>
58-
)};
59-
60-
let CurrentPlanFields = ({
61-
visible,
62-
requestLimit,
63-
setRequestLimit,
64-
}) => visible ? <Fieldset
65-
legend='Current Plan'
66-
description={'Adjust your pricing and your app\u2019s request limit'}>
67-
<Field
68-
labelWidth={40}
69-
label={<Label
70-
text='Scale your app'
71-
description='This will take effect as soon as you save your changes.' />}
72-
input={<Range
73-
min={0}
74-
max={600}
75-
step={10}
76-
color='#169CEE'
77-
value={requestLimit}
78-
track={true}
79-
units={value => {
80-
let numJobs = numJobsFromRequestLimit(value);
81-
return value + 'req/s & ' + numJobs + ' job' + (numJobs == 1 ? '' : 's')
82-
}}
83-
width={220}
84-
onChange={limit => {
85-
if (limit < 30) {
86-
limit = 30;
87-
}
88-
setRequestLimit(limit);
89-
}} />} />
90-
<Field
91-
labelWidth={DEFAULT_SETTINGS_LABEL_WIDTH}
92-
label={<Label text='Your plan' />}
93-
input={<CurrentPlan requestLimit={requestLimit} />} />
94-
</Fieldset> : <noscript/>;
95-
9649
let AppInformationFields = ({
9750
appName,
9851
setAppName,
@@ -115,61 +68,17 @@ let AppInformationFields = ({
11568
labelWidth={DEFAULT_SETTINGS_LABEL_WIDTH}
11669
label={<Label text='App name' />}
11770
input={<TextInput
118-
value={appName}
119-
onChange={setAppName} />
71+
value={appName} />
12072
} />
12173
<Field
12274
labelWidth={58}
12375
label={<Label
12476
text='In production?'
125-
description='Flip this switch when you launch. This will help us track your traffic and allow us to properly scale your app.' />}
77+
description='(On back4app, this switch is temporarily disabled)' />}
12678
input={<Toggle
12779
value={inProduction}
128-
type={Toggle.Types.YES_NO}
129-
onChange={setInProduction} />
80+
type={Toggle.Types.YES_NO} />
13081
} />
131-
{ inProduction ? <div>
132-
<Field
133-
labelWidth={DEFAULT_SETTINGS_LABEL_WIDTH}
134-
label={<Label text='iTunes App Store URL' />}
135-
input={<TextInput
136-
value={iTunesURL}
137-
placeholder='Where is it?'
138-
onChange={setiTunesURL} />
139-
} />
140-
<Field
141-
labelWidth={DEFAULT_SETTINGS_LABEL_WIDTH}
142-
label={<Label text='Google Play Store URL' />}
143-
input={<TextInput
144-
value={googlePlayURL}
145-
placeholder='Where is it?'
146-
onChange={setGooglePlayURL} />
147-
} />
148-
<Field
149-
labelWidth={DEFAULT_SETTINGS_LABEL_WIDTH}
150-
label={<Label text='Windows App Store URL' />}
151-
input={<TextInput
152-
value={windowsAppStoreURL}
153-
placeholder='Where is it?'
154-
onChange={setWindowsAppStoreURL} />
155-
} />
156-
<Field
157-
labelWidth={DEFAULT_SETTINGS_LABEL_WIDTH}
158-
label={<Label text='Web App URL' />}
159-
input={<TextInput
160-
value={webAppURL}
161-
placeholder='Where is it?'
162-
onChange={setWebAppURL} />
163-
} />
164-
<Field
165-
labelWidth={DEFAULT_SETTINGS_LABEL_WIDTH}
166-
label={<Label text='Other URL' />}
167-
input={<TextInput
168-
value={otherURL}
169-
placeholder='Where is it?'
170-
onChange={setOtherURL} />
171-
} />
172-
</div> : null }
17382
</Fieldset>;
17483

17584
let CollaboratorsFields = ({
@@ -490,42 +399,7 @@ export default class GeneralSettings extends DashboardView {
490399
{this.state.migrationWarnings.map(warning => <FormNote key={warning}show={true} color='orange'>{warning}</FormNote>)}
491400
</FormModal>
492401

493-
let transferAppModal = <FormModal
494-
title='Transfer App Ownership'
495-
subtitle='This is an irreversible action!'
496-
icon='users-solid'
497-
iconSize={30}
498-
type={Modal.Types.DANGER}
499-
open={this.state.showTransferAppModal}
500-
submitText='Transfer ownership'
501-
inProgressText={'Transferring\u2026'}
502-
enabled={
503-
(this.state.password.length > 0 || !AccountManager.currentUser().has_password)
504-
&& this.state.transferNewOwner.length > 0
505-
}
506-
onSubmit={() => AppsManager.transferApp(this.context.currentApp.slug, this.state.transferNewOwner, this.state.password)}
507-
onClose={() => this.setState({showTransferAppModal: false})}
508-
onSuccess={({ message }) => this.setState({transferAppSuccessMessage: message})}
509-
clearFields={() => this.setState({
510-
password: '',
511-
transferNewOwner: '',
512-
})}>
513-
<Field
514-
labelWidth={60}
515-
label={<Label
516-
text='Choose new owner'
517-
description='The new owner must already be a collaborator.' />
518-
}
519-
input={<Dropdown
520-
fixed={true}
521-
value={this.state.transferNewOwner}
522-
onChange={(collaborator) => this.setState({transferNewOwner: collaborator})}>
523-
{((this.props.initialFields||{}).collaborators||[]).map(collaborator =>
524-
<DropdownOption key={collaborator.id.toString()} value={collaborator.userEmail}>{collaborator.userEmail}</DropdownOption>
525-
)}
526-
</Dropdown>} />
527-
{AccountManager.currentUser().has_password ? passwordField : null}
528-
</FormModal>;
402+
529403

530404
let deleteAppModal = <FormModal
531405
title='Delete App'
@@ -681,10 +555,6 @@ export default class GeneralSettings extends DashboardView {
681555
renderForm={({ changes, fields, setField, resetFields }) => {
682556
let isCollaborator = AccountManager.currentUser().email !== this.props.initialFields.owner_email;
683557
return <div className={styles.settings_page}>
684-
<CurrentPlanFields
685-
visible={!isCollaborator}
686-
requestLimit={fields.requestLimit}
687-
setRequestLimit={setField.bind(this, 'requestLimit')}/>
688558
<AppInformationFields
689559
appName={fields.appName}
690560
setAppName={setField.bind(this, 'appName')}
@@ -706,59 +576,8 @@ export default class GeneralSettings extends DashboardView {
706576
viewerEmail={AccountManager.currentUser().email}
707577
addCollaborator={setCollaborators.bind(undefined, setField)}
708578
removeCollaborator={setCollaborators.bind(undefined, setField)}/>
709-
<ManageAppFields
710-
mongoURL={fields.mongoURL}
711-
changeConnectionString={() => this.setState({showChangeConnectionStringModal: true})}
712-
isCollaborator={isCollaborator}
713-
hasCollaborators={initialFields.collaborators.length > 0}
714-
startMigration={() => this.setState({showMigrateAppModal: true})}
715-
hasInProgressMigration={!!this.context.currentApp.migration}
716-
appSlug={this.context.currentApp.slug}
717-
cleanUpFiles={() => this.context.currentApp.cleanUpFiles().then(result => {
718-
this.setState({
719-
cleanupFilesMessage: result.notice,
720-
cleanupNoteColor: 'orange',
721-
});
722-
}).fail((e) => {
723-
this.setState({
724-
cleanupFilesMessage: e.error,
725-
cleanupNoteColor: 'red',
726-
});
727-
})}
728-
cleanUpFilesMessage={this.state.cleanupFilesMessage}
729-
cleanUpMessageColor={this.state.cleanupNoteColor}
730-
exportData={() => this.context.currentApp.exportData().then((result) => {
731-
this.setState({
732-
exportDataMessage: result.notice,
733-
exportDataColor: 'orange',
734-
});
735-
}).fail((e) => {
736-
this.setState({
737-
exportDataMessage: e.error,
738-
exportDataColor: 'red',
739-
});
740-
})}
741-
exportDataMessage={this.state.exportDataMessage}
742-
exportMessageColor={this.state.exportDataColor}
743-
cloneApp={() => this.setState({
744-
showCloneAppModal: true,
745-
cloneAppMessage: '',
746-
})}
747-
cloneAppMessage={this.state.cloneAppMessage}
748-
transferApp={() => this.setState({
749-
showTransferAppModal: true,
750-
transferAppSuccessMessage: '',
751-
})}
752-
transferAppMessage={this.state.transferAppSuccessMessage}
753-
deleteApp={() => this.setState({showDeleteAppModal: true})}/>
754579
</div>;
755580
}} />
756-
{migrateAppModal}
757-
{transferAppModal}
758-
{deleteAppModal}
759-
{cloneAppModal}
760-
{collaboratorRemovedWarningModal}
761-
{changeConnectionStringModal}
762581
<Toolbar section='Settings' subsection='General' />
763582
</div>;
764583
}

src/dashboard/Settings/SettingsData.react.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@ export default class SettingsData extends React.Component {
1818
}
1919

2020
componentDidMount() {
21+
console.log('componentDidMount')
2122
this.context.currentApp.fetchSettingsFields().then(({ fields }) => {
2223
this.setState({ fields });
2324
});
2425
}
2526

2627
componentWillReceiveProps(props, context) {
28+
console.log('componentWillReceiveProps')
2729
if (this.context !== context) {
2830
this.setState({ fields: undefined });
2931
context.currentApp.fetchSettingsFields().then(({ fields }) => {
@@ -33,6 +35,7 @@ export default class SettingsData extends React.Component {
3335
}
3436

3537
saveChanges(changes) {
38+
console.log('saveChanges')
3639
let promise = this.context.currentApp.saveSettingsFields(changes)
3740
promise.then(({successes, failures}) => {
3841
let newFields = {...this.state.fields, ...successes};
@@ -43,6 +46,7 @@ export default class SettingsData extends React.Component {
4346

4447
render() {
4548
let child = React.Children.only(this.props.children);
49+
console.log('render this.state', this.state)
4650
return React.cloneElement(
4751
child,
4852
{

src/lib/AJAX.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export function request(method, url, body, abortable = false, withCredentials =
3636
xhr.withCredentials = withCredentials;
3737
let p = new Promise();
3838
xhr.onerror = (e) => {
39+
console.log(e);
3940
p.reject({
4041
success: false,
4142
message: 'Network Error',

0 commit comments

Comments
 (0)