aboutsummaryrefslogtreecommitdiffstats
path: root/src/components
diff options
context:
space:
mode:
Diffstat (limited to 'src/components')
-rw-r--r--src/components/layout/Sidebar.js2
-rw-r--r--src/components/services/tabs/TabBarSortableList.js110
-rw-r--r--src/components/settings/services/EditServiceForm.js6
3 files changed, 74 insertions, 44 deletions
diff --git a/src/components/layout/Sidebar.js b/src/components/layout/Sidebar.js
index 4aee1ec60..6a5c0f365 100644
--- a/src/components/layout/Sidebar.js
+++ b/src/components/layout/Sidebar.js
@@ -52,7 +52,7 @@ export default class Sidebar extends Component {
52 <button 52 <button
53 onClick={openSettings} 53 onClick={openSettings}
54 className="sidebar__settings-button" 54 className="sidebar__settings-button"
55 data-tip={`Settings (${ctrlKey}+,)`} 55 data-tip={`${intl.formatMessage(messages.settings)} (${ctrlKey}+,)`}
56 > 56 >
57 {isPremiumUser && ( 57 {isPremiumUser && (
58 <span className="emoji"> 58 <span className="emoji">
diff --git a/src/components/services/tabs/TabBarSortableList.js b/src/components/services/tabs/TabBarSortableList.js
index c0a68d1a5..e5ae36419 100644
--- a/src/components/services/tabs/TabBarSortableList.js
+++ b/src/components/services/tabs/TabBarSortableList.js
@@ -1,44 +1,78 @@
1import React from 'react'; 1import React, { Component } from 'react';
2import { observer } from 'mobx-react'; 2import { observer, PropTypes as MobxPropTypes } from 'mobx-react';
3import PropTypes from 'prop-types';
3import { SortableContainer } from 'react-sortable-hoc'; 4import { SortableContainer } from 'react-sortable-hoc';
5import { defineMessages, intlShape } from 'react-intl';
4 6
5import TabItem from './TabItem'; 7import TabItem from './TabItem';
6import { ctrlKey } from '../../../environment'; 8import { ctrlKey } from '../../../environment';
7 9
8export default SortableContainer(observer(({ 10const messages = defineMessages({
9 services, 11 addNewService: {
10 setActive, 12 id: 'sidebar.addNewService',
11 reload, 13 defaultMessage: '!!!Add new service',
12 toggleNotifications, 14 },
13 deleteService, 15});
14 disableService, 16
15 openSettings, 17@observer
16}) => ( 18class TabBarSortableList extends Component {
17 <ul 19 static propTypes = {
18 className="tabs" 20 services: MobxPropTypes.arrayOrObservableArray.isRequired,
19 > 21 setActive: PropTypes.func.isRequired,
20 {services.map((service, index) => ( 22 openSettings: PropTypes.func.isRequired,
21 <TabItem 23 reload: PropTypes.func.isRequired,
22 key={service.id} 24 toggleNotifications: PropTypes.func.isRequired,
23 clickHandler={() => setActive({ serviceId: service.id })} 25 deleteService: PropTypes.func.isRequired,
24 service={service} 26 disableService: PropTypes.func.isRequired,
25 index={index} 27 }
26 shortcutIndex={index + 1} 28
27 reload={() => reload({ serviceId: service.id })} 29 static contextTypes = {
28 toggleNotifications={() => toggleNotifications({ serviceId: service.id })} 30 intl: intlShape,
29 deleteService={() => deleteService({ serviceId: service.id })} 31 };
30 disableService={() => disableService({ serviceId: service.id })} 32
31 openSettings={openSettings} 33 render() {
32 /> 34 const {
33 ))} 35 services,
34 <li> 36 setActive,
35 <button 37 reload,
36 className="sidebar__add-service" 38 toggleNotifications,
37 onClick={() => openSettings({ path: 'recipes' })} 39 deleteService,
38 data-tip={`Add new service (${ctrlKey}+N)`} 40 disableService,
41 openSettings,
42 } = this.props;
43
44 const { intl } = this.context;
45
46 return (
47 <ul
48 className="tabs"
39 > 49 >
40 <span className="mdi mdi-plus" /> 50 {services.map((service, index) => (
41 </button> 51 <TabItem
42 </li> 52 key={service.id}
43 </ul> 53 clickHandler={() => setActive({ serviceId: service.id })}
44))); 54 service={service}
55 index={index}
56 shortcutIndex={index + 1}
57 reload={() => reload({ serviceId: service.id })}
58 toggleNotifications={() => toggleNotifications({ serviceId: service.id })}
59 deleteService={() => deleteService({ serviceId: service.id })}
60 disableService={() => disableService({ serviceId: service.id })}
61 openSettings={openSettings}
62 />
63 ))}
64 <li>
65 <button
66 className="sidebar__add-service"
67 onClick={() => openSettings({ path: 'recipes' })}
68 data-tip={`${intl.formatMessage(messages.addNewService)} (${ctrlKey}+N)`}
69 >
70 <span className="mdi mdi-plus" />
71 </button>
72 </li>
73 </ul>
74 );
75 }
76}
77
78export default SortableContainer(TabBarSortableList);
diff --git a/src/components/settings/services/EditServiceForm.js b/src/components/settings/services/EditServiceForm.js
index fac0f6b9a..9b359a78e 100644
--- a/src/components/settings/services/EditServiceForm.js
+++ b/src/components/settings/services/EditServiceForm.js
@@ -69,10 +69,6 @@ const messages = defineMessages({
69export default class EditServiceForm extends Component { 69export default class EditServiceForm extends Component {
70 static propTypes = { 70 static propTypes = {
71 recipe: PropTypes.instanceOf(Recipe).isRequired, 71 recipe: PropTypes.instanceOf(Recipe).isRequired,
72 // service: PropTypes.oneOfType([
73 // PropTypes.object,
74 // PropTypes.instanceOf(Service),
75 // ]),
76 service(props, propName) { 72 service(props, propName) {
77 if (props.action === 'edit' && !(props[propName] instanceof Service)) { 73 if (props.action === 'edit' && !(props[propName] instanceof Service)) {
78 return new Error(`'${propName}'' is expected to be of type 'Service' 74 return new Error(`'${propName}'' is expected to be of type 'Service'
@@ -207,7 +203,7 @@ export default class EditServiceForm extends Component {
207 )} 203 )}
208 {recipe.hasCustomUrl && ( 204 {recipe.hasCustomUrl && (
209 <TabItem title={intl.formatMessage(messages.tabOnPremise)}> 205 <TabItem title={intl.formatMessage(messages.tabOnPremise)}>
210 {user.isPremium ? ( 206 {user.isPremium || recipe.author.find(a => a.email === user.email) ? (
211 <div> 207 <div>
212 <Input field={form.$('customUrl')} /> 208 <Input field={form.$('customUrl')} />
213 {form.error === 'url-validation-error' && ( 209 {form.error === 'url-validation-error' && (