diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/components/settings/account/AccountDashboard.js | 86 | ||||
-rw-r--r-- | src/components/settings/navigation/SettingsNavigation.js | 28 | ||||
-rw-r--r-- | src/components/settings/services/EditServiceForm.js | 2 | ||||
-rw-r--r-- | src/components/settings/user/EditUserForm.js | 8 | ||||
-rw-r--r-- | src/components/ui/Input.js | 1 | ||||
-rw-r--r-- | src/containers/settings/EditServiceScreen.js | 6 | ||||
-rw-r--r-- | src/containers/settings/EditUserScreen.js | 1 | ||||
-rw-r--r-- | src/models/User.js | 21 | ||||
-rw-r--r-- | src/styles/badge.scss | 6 |
9 files changed, 121 insertions, 38 deletions
diff --git a/src/components/settings/account/AccountDashboard.js b/src/components/settings/account/AccountDashboard.js index 4992f0913..e6ccdaac7 100644 --- a/src/components/settings/account/AccountDashboard.js +++ b/src/components/settings/account/AccountDashboard.js | |||
@@ -44,6 +44,10 @@ const messages = defineMessages({ | |||
44 | id: 'settings.account.accountType.premium', | 44 | id: 'settings.account.accountType.premium', |
45 | defaultMessage: '!!!Premium Supporter Account', | 45 | defaultMessage: '!!!Premium Supporter Account', |
46 | }, | 46 | }, |
47 | accountTypeEnterprise: { | ||
48 | id: 'settings.account.accountType.enterprise', | ||
49 | defaultMessage: '!!!Enterprise Account', | ||
50 | }, | ||
47 | accountEditButton: { | 51 | accountEditButton: { |
48 | id: 'settings.account.account.editButton', | 52 | id: 'settings.account.account.editButton', |
49 | defaultMessage: '!!!Edit Account', | 53 | defaultMessage: '!!!Edit Account', |
@@ -167,17 +171,21 @@ export default class AccountDashboard extends Component { | |||
167 | </h2> | 171 | </h2> |
168 | {user.organization && `${user.organization}, `} | 172 | {user.organization && `${user.organization}, `} |
169 | {user.email}<br /> | 173 | {user.email}<br /> |
170 | {!user.isPremium && ( | 174 | {!user.isEnterprise && !user.isPremium && ( |
171 | <span className="badge badge">{intl.formatMessage(messages.accountTypeBasic)}</span> | 175 | <span className="badge badge">{intl.formatMessage(messages.accountTypeBasic)}</span> |
172 | )} | 176 | )} |
173 | {user.isPremium && ( | 177 | {user.isPremium && ( |
174 | <span className="badge badge--premium">{intl.formatMessage(messages.accountTypePremium)}</span> | 178 | <span className="badge badge--premium">{intl.formatMessage(messages.accountTypePremium)}</span> |
175 | )} | 179 | )} |
180 | {user.isEnterprise && ( | ||
181 | <span className="badge badge--success">{intl.formatMessage(messages.accountTypeEnterprise)}</span> | ||
182 | )} | ||
176 | </div> | 183 | </div> |
177 | <Link to="/settings/user/edit" className="button"> | 184 | {!user.isSSO && ( |
178 | {intl.formatMessage(messages.accountEditButton)} | 185 | <Link to="/settings/user/edit" className="button"> |
179 | </Link> | 186 | {intl.formatMessage(messages.accountEditButton)} |
180 | 187 | </Link> | |
188 | )} | ||
181 | {user.emailValidated} | 189 | {user.emailValidated} |
182 | </div> | 190 | </div> |
183 | </div> | 191 | </div> |
@@ -230,6 +238,33 @@ export default class AccountDashboard extends Component { | |||
230 | ) | 238 | ) |
231 | )} | 239 | )} |
232 | 240 | ||
241 | {user.isEnterprise && ( | ||
242 | <div className="account"> | ||
243 | <div className="account__box"> | ||
244 | <h2>{user.company.name}</h2> | ||
245 | <p> | ||
246 | Technical contact: | ||
247 | <Link | ||
248 | className="link" | ||
249 | target="_blank" | ||
250 | to={`mailto:${user.company.contact.technical}?subject=Franz`} | ||
251 | > | ||
252 | {user.company.contact.technical} | ||
253 | </Link> | ||
254 | <br /> | ||
255 | General contact: | ||
256 | <Link | ||
257 | className="link" | ||
258 | target="_blank" | ||
259 | to={`mailto:${user.company.contact.default}?subject=Franz`} | ||
260 | > | ||
261 | {user.company.contact.default} | ||
262 | </Link> | ||
263 | </p> | ||
264 | </div> | ||
265 | </div> | ||
266 | )} | ||
267 | |||
233 | {user.isMiner && ( | 268 | {user.isMiner && ( |
234 | <div className="account franz-form"> | 269 | <div className="account franz-form"> |
235 | <div className="account__box account__box"> | 270 | <div className="account__box account__box"> |
@@ -244,7 +279,7 @@ export default class AccountDashboard extends Component { | |||
244 | </div> | 279 | </div> |
245 | )} | 280 | )} |
246 | 281 | ||
247 | {!user.isPremium && ( | 282 | {!user.isEnterprise && !user.isPremium && ( |
248 | isLoadingPlans ? ( | 283 | isLoadingPlans ? ( |
249 | <Loader /> | 284 | <Loader /> |
250 | ) : ( | 285 | ) : ( |
@@ -259,28 +294,29 @@ export default class AccountDashboard extends Component { | |||
259 | ) | 294 | ) |
260 | )} | 295 | )} |
261 | 296 | ||
262 | <div className="account franz-form"> | 297 | {!user.isEnterprise && ( |
263 | <div className="account__box"> | 298 | <div className="account franz-form"> |
264 | <h2>{intl.formatMessage(messages.headlineDangerZone)}</h2> | 299 | <div className="account__box"> |
265 | {!isDeleteAccountSuccessful && ( | 300 | <h2>{intl.formatMessage(messages.headlineDangerZone)}</h2> |
266 | <div className="account__subscription"> | 301 | {!isDeleteAccountSuccessful && ( |
267 | <p>{intl.formatMessage(messages.deleteInfo)}</p> | 302 | <div className="account__subscription"> |
268 | <Button | 303 | <p>{intl.formatMessage(messages.deleteInfo)}</p> |
269 | label={intl.formatMessage(messages.deleteAccount)} | 304 | <Button |
270 | buttonType="danger" | 305 | label={intl.formatMessage(messages.deleteAccount)} |
271 | onClick={() => deleteAccount()} | 306 | buttonType="danger" |
272 | loaded={!isLoadingDeleteAccount} | 307 | onClick={() => deleteAccount()} |
273 | /> | 308 | loaded={!isLoadingDeleteAccount} |
274 | </div> | 309 | /> |
275 | )} | 310 | </div> |
276 | {isDeleteAccountSuccessful && ( | 311 | )} |
277 | <p>{intl.formatMessage(messages.deleteEmailSent)}</p> | 312 | {isDeleteAccountSuccessful && ( |
278 | )} | 313 | <p>{intl.formatMessage(messages.deleteEmailSent)}</p> |
314 | )} | ||
315 | </div> | ||
279 | </div> | 316 | </div> |
280 | </div> | 317 | )} |
281 | </div> | 318 | </div> |
282 | )} | 319 | )} |
283 | |||
284 | </div> | 320 | </div> |
285 | <ReactTooltip place="right" type="dark" effect="solid" /> | 321 | <ReactTooltip place="right" type="dark" effect="solid" /> |
286 | </div> | 322 | </div> |
diff --git a/src/components/settings/navigation/SettingsNavigation.js b/src/components/settings/navigation/SettingsNavigation.js index 66539f324..620f09189 100644 --- a/src/components/settings/navigation/SettingsNavigation.js +++ b/src/components/settings/navigation/SettingsNavigation.js | |||
@@ -1,6 +1,7 @@ | |||
1 | import React, { Component } from 'react'; | 1 | import React, { Component } from 'react'; |
2 | import PropTypes from 'prop-types'; | 2 | import PropTypes from 'prop-types'; |
3 | import { defineMessages, intlShape } from 'react-intl'; | 3 | import { defineMessages, intlShape } from 'react-intl'; |
4 | import { inject, observer } from 'mobx-react'; | ||
4 | 5 | ||
5 | import Link from '../../ui/Link'; | 6 | import Link from '../../ui/Link'; |
6 | 7 | ||
@@ -31,6 +32,7 @@ const messages = defineMessages({ | |||
31 | }, | 32 | }, |
32 | }); | 33 | }); |
33 | 34 | ||
35 | @inject('stores') @observer | ||
34 | export default class SettingsNavigation extends Component { | 36 | export default class SettingsNavigation extends Component { |
35 | static propTypes = { | 37 | static propTypes = { |
36 | serviceCount: PropTypes.number.isRequired, | 38 | serviceCount: PropTypes.number.isRequired, |
@@ -42,17 +44,20 @@ export default class SettingsNavigation extends Component { | |||
42 | 44 | ||
43 | render() { | 45 | render() { |
44 | const { serviceCount } = this.props; | 46 | const { serviceCount } = this.props; |
47 | const { data: user } = this.props.stores.user; | ||
45 | const { intl } = this.context; | 48 | const { intl } = this.context; |
46 | 49 | ||
47 | return ( | 50 | return ( |
48 | <div className="settings-navigation"> | 51 | <div className="settings-navigation"> |
49 | <Link | 52 | {user.clientSettings && user.clientSettings.userCanManageServices && ( |
50 | to="/settings/recipes" | 53 | <Link |
51 | className="settings-navigation__link" | 54 | to="/settings/recipes" |
52 | activeClassName="is-active" | 55 | className="settings-navigation__link" |
53 | > | 56 | activeClassName="is-active" |
54 | {intl.formatMessage(messages.availableServices)} | 57 | > |
55 | </Link> | 58 | {intl.formatMessage(messages.availableServices)} |
59 | </Link> | ||
60 | )} | ||
56 | <Link | 61 | <Link |
57 | to="/settings/services" | 62 | to="/settings/services" |
58 | className="settings-navigation__link" | 63 | className="settings-navigation__link" |
@@ -92,3 +97,12 @@ export default class SettingsNavigation extends Component { | |||
92 | ); | 97 | ); |
93 | } | 98 | } |
94 | } | 99 | } |
100 | |||
101 | SettingsNavigation.wrappedComponent.propTypes = { | ||
102 | stores: PropTypes.shape({ | ||
103 | user: PropTypes.shape({ | ||
104 | data: PropTypes.object.isRequired, | ||
105 | }).isRequired, | ||
106 | }).isRequired, | ||
107 | }; | ||
108 | |||
diff --git a/src/components/settings/services/EditServiceForm.js b/src/components/settings/services/EditServiceForm.js index f6f2df2f3..e23dfa9f6 100644 --- a/src/components/settings/services/EditServiceForm.js +++ b/src/components/settings/services/EditServiceForm.js | |||
@@ -324,7 +324,7 @@ export default class EditServiceForm extends Component { | |||
324 | </div> | 324 | </div> |
325 | <div className="settings__controls"> | 325 | <div className="settings__controls"> |
326 | {/* Delete Button */} | 326 | {/* Delete Button */} |
327 | {action === 'edit' && deleteButton} | 327 | {action === 'edit' && user.clientSettings.userCanManageServices && deleteButton} |
328 | 328 | ||
329 | {/* Save Button */} | 329 | {/* Save Button */} |
330 | {isSaving || isValidatingCustomUrl ? ( | 330 | {isSaving || isValidatingCustomUrl ? ( |
diff --git a/src/components/settings/user/EditUserForm.js b/src/components/settings/user/EditUserForm.js index f36887fc2..1ac8be80f 100644 --- a/src/components/settings/user/EditUserForm.js +++ b/src/components/settings/user/EditUserForm.js | |||
@@ -46,6 +46,7 @@ export default class EditServiceForm extends Component { | |||
46 | form: PropTypes.instanceOf(Form).isRequired, | 46 | form: PropTypes.instanceOf(Form).isRequired, |
47 | onSubmit: PropTypes.func.isRequired, | 47 | onSubmit: PropTypes.func.isRequired, |
48 | isSaving: PropTypes.bool.isRequired, | 48 | isSaving: PropTypes.bool.isRequired, |
49 | isEnterprise: PropTypes.bool.isRequired, | ||
49 | }; | 50 | }; |
50 | 51 | ||
51 | static defaultProps = { | 52 | static defaultProps = { |
@@ -72,6 +73,7 @@ export default class EditServiceForm extends Component { | |||
72 | // user, | 73 | // user, |
73 | status, | 74 | status, |
74 | form, | 75 | form, |
76 | isEnterprise, | ||
75 | isSaving, | 77 | isSaving, |
76 | } = this.props; | 78 | } = this.props; |
77 | const { intl } = this.context; | 79 | const { intl } = this.context; |
@@ -105,8 +107,10 @@ export default class EditServiceForm extends Component { | |||
105 | <Input field={form.$('lastname')} /> | 107 | <Input field={form.$('lastname')} /> |
106 | </div> | 108 | </div> |
107 | <Input field={form.$('email')} /> | 109 | <Input field={form.$('email')} /> |
108 | <Radio field={form.$('accountType')} /> | 110 | {!isEnterprise && ( |
109 | {form.$('accountType').value === 'company' && ( | 111 | <Radio field={form.$('accountType')} /> |
112 | )} | ||
113 | {!isEnterprise && form.$('accountType').value === 'company' && ( | ||
110 | <Input field={form.$('organization')} /> | 114 | <Input field={form.$('organization')} /> |
111 | )} | 115 | )} |
112 | <h2>{intl.formatMessage(messages.headlinePassword)}</h2> | 116 | <h2>{intl.formatMessage(messages.headlinePassword)}</h2> |
diff --git a/src/components/ui/Input.js b/src/components/ui/Input.js index 0bb9f23bf..69c95702b 100644 --- a/src/components/ui/Input.js +++ b/src/components/ui/Input.js | |||
@@ -97,6 +97,7 @@ export default class Input extends Component { | |||
97 | onBlur={field.onBlur} | 97 | onBlur={field.onBlur} |
98 | onFocus={field.onFocus} | 98 | onFocus={field.onFocus} |
99 | ref={(element) => { this.inputElement = element; }} | 99 | ref={(element) => { this.inputElement = element; }} |
100 | disabled={field.disabled} | ||
100 | /> | 101 | /> |
101 | {suffix && ( | 102 | {suffix && ( |
102 | <span className="franz-form__input-suffix">{suffix}</span> | 103 | <span className="franz-form__input-suffix">{suffix}</span> |
diff --git a/src/containers/settings/EditServiceScreen.js b/src/containers/settings/EditServiceScreen.js index 00e888cc4..9084b9889 100644 --- a/src/containers/settings/EditServiceScreen.js +++ b/src/containers/settings/EditServiceScreen.js | |||
@@ -77,7 +77,7 @@ export default class EditServiceScreen extends Component { | |||
77 | } | 77 | } |
78 | } | 78 | } |
79 | 79 | ||
80 | prepareForm(recipe, service) { | 80 | prepareForm(recipe, service, userCanManageService) { |
81 | const { intl } = this.context; | 81 | const { intl } = this.context; |
82 | const config = { | 82 | const config = { |
83 | fields: { | 83 | fields: { |
@@ -118,6 +118,7 @@ export default class EditServiceScreen extends Component { | |||
118 | if (recipe.hasTeamId) { | 118 | if (recipe.hasTeamId) { |
119 | Object.assign(config.fields, { | 119 | Object.assign(config.fields, { |
120 | team: { | 120 | team: { |
121 | disabled: !userCanManageService, | ||
121 | label: intl.formatMessage(messages.team), | 122 | label: intl.formatMessage(messages.team), |
122 | placeholder: intl.formatMessage(messages.team), | 123 | placeholder: intl.formatMessage(messages.team), |
123 | value: service.team, | 124 | value: service.team, |
@@ -129,6 +130,7 @@ export default class EditServiceScreen extends Component { | |||
129 | if (recipe.hasCustomUrl) { | 130 | if (recipe.hasCustomUrl) { |
130 | Object.assign(config.fields, { | 131 | Object.assign(config.fields, { |
131 | customUrl: { | 132 | customUrl: { |
133 | disabled: !userCanManageService, | ||
132 | label: intl.formatMessage(messages.customUrl), | 134 | label: intl.formatMessage(messages.customUrl), |
133 | placeholder: 'https://', | 135 | placeholder: 'https://', |
134 | value: service.customUrl, | 136 | value: service.customUrl, |
@@ -215,7 +217,7 @@ export default class EditServiceScreen extends Component { | |||
215 | ); | 217 | ); |
216 | } | 218 | } |
217 | 219 | ||
218 | const form = this.prepareForm(recipe, service); | 220 | const form = this.prepareForm(recipe, service, user.data.clientSettings.userCanManageServices); |
219 | 221 | ||
220 | return ( | 222 | return ( |
221 | <EditServiceForm | 223 | <EditServiceForm |
diff --git a/src/containers/settings/EditUserScreen.js b/src/containers/settings/EditUserScreen.js index dda8ce513..a67fa7fb5 100644 --- a/src/containers/settings/EditUserScreen.js +++ b/src/containers/settings/EditUserScreen.js | |||
@@ -145,6 +145,7 @@ export default class EditUserScreen extends Component { | |||
145 | // user={user.data} | 145 | // user={user.data} |
146 | status={user.actionStatus} | 146 | status={user.actionStatus} |
147 | form={form} | 147 | form={form} |
148 | isEnterprise={user.data.isEnterprise} | ||
148 | isSaving={user.updateUserInfoRequest.isExecuting} | 149 | isSaving={user.updateUserInfoRequest.isExecuting} |
149 | onSubmit={d => this.onSubmit(d)} | 150 | onSubmit={d => this.onSubmit(d)} |
150 | /> | 151 | /> |
diff --git a/src/models/User.js b/src/models/User.js index 2e5df4795..2eb48394f 100644 --- a/src/models/User.js +++ b/src/models/User.js | |||
@@ -1,4 +1,4 @@ | |||
1 | import { observable } from 'mobx'; | 1 | import { observable, computed } from 'mobx'; |
2 | 2 | ||
3 | export default class User { | 3 | export default class User { |
4 | id = null; | 4 | id = null; |
@@ -15,6 +15,17 @@ export default class User { | |||
15 | @observable donor = {}; | 15 | @observable donor = {}; |
16 | @observable isDonor = false; | 16 | @observable isDonor = false; |
17 | @observable isMiner = false; | 17 | @observable isMiner = false; |
18 | @observable isSSO = false; | ||
19 | @observable clientSettings = { | ||
20 | userCanManageServices: true, | ||
21 | }; | ||
22 | @observable company = { | ||
23 | name: 'Happle Apps', | ||
24 | contact: { | ||
25 | technical: 'technical@company.com', | ||
26 | default: 'default@company.com', | ||
27 | }, | ||
28 | }; | ||
18 | 29 | ||
19 | constructor(data) { | 30 | constructor(data) { |
20 | if (!data.id) { | 31 | if (!data.id) { |
@@ -33,5 +44,13 @@ export default class User { | |||
33 | this.isDonor = data.isDonor || this.isDonor; | 44 | this.isDonor = data.isDonor || this.isDonor; |
34 | this.isSubscriptionOwner = data.isSubscriptionOwner || this.isSubscriptionOwner; | 45 | this.isSubscriptionOwner = data.isSubscriptionOwner || this.isSubscriptionOwner; |
35 | this.isMiner = data.isMiner || this.isMiner; | 46 | this.isMiner = data.isMiner || this.isMiner; |
47 | this.isSSO = data.isSSO || this.isSSO; | ||
48 | this.clientSettings = data.clientSettings || this.clientSettings; | ||
49 | this.company = data.company || this.company; | ||
50 | } | ||
51 | |||
52 | @computed get isEnterprise() { | ||
53 | // return false | ||
54 | return this.company.name !== undefined; | ||
36 | } | 55 | } |
37 | } | 56 | } |
diff --git a/src/styles/badge.scss b/src/styles/badge.scss index d7dfaf783..18a653118 100644 --- a/src/styles/badge.scss +++ b/src/styles/badge.scss | |||
@@ -12,4 +12,10 @@ | |||
12 | background: $theme-brand-primary; | 12 | background: $theme-brand-primary; |
13 | color: #FFF; | 13 | color: #FFF; |
14 | } | 14 | } |
15 | |||
16 | &.badge--success { | ||
17 | background: $theme-brand-success; | ||
18 | color: #FFF; | ||
19 | } | ||
20 | |||
15 | } | 21 | } |