diff options
Diffstat (limited to 'src')
34 files changed, 1581 insertions, 214 deletions
diff --git a/src/actions/index.js b/src/actions/index.js index 59acabb0b..00f843cd6 100644 --- a/src/actions/index.js +++ b/src/actions/index.js | |||
@@ -11,6 +11,7 @@ import payment from './payment'; | |||
11 | import news from './news'; | 11 | import news from './news'; |
12 | import settings from './settings'; | 12 | import settings from './settings'; |
13 | import requests from './requests'; | 13 | import requests from './requests'; |
14 | import workspaces from '../features/workspaces/actions'; | ||
14 | 15 | ||
15 | const actions = Object.assign({}, { | 16 | const actions = Object.assign({}, { |
16 | service, | 17 | service, |
@@ -25,4 +26,7 @@ const actions = Object.assign({}, { | |||
25 | requests, | 26 | requests, |
26 | }); | 27 | }); |
27 | 28 | ||
28 | export default defineActions(actions, PropTypes.checkPropTypes); | 29 | export default Object.assign( |
30 | defineActions(actions, PropTypes.checkPropTypes), | ||
31 | { workspaces }, | ||
32 | ); | ||
diff --git a/src/app.js b/src/app.js index 6660feb46..d3b540f62 100644 --- a/src/app.js +++ b/src/app.js | |||
@@ -39,6 +39,8 @@ import PricingScreen from './containers/auth/PricingScreen'; | |||
39 | import InviteScreen from './containers/auth/InviteScreen'; | 39 | import InviteScreen from './containers/auth/InviteScreen'; |
40 | import AuthLayoutContainer from './containers/auth/AuthLayoutContainer'; | 40 | import AuthLayoutContainer from './containers/auth/AuthLayoutContainer'; |
41 | import SubscriptionPopupScreen from './containers/subscription/SubscriptionPopupScreen'; | 41 | import SubscriptionPopupScreen from './containers/subscription/SubscriptionPopupScreen'; |
42 | import WorkspacesScreen from './features/workspaces/containers/WorkspacesScreen'; | ||
43 | import EditWorkspaceScreen from './features/workspaces/containers/EditWorkspaceScreen'; | ||
42 | 44 | ||
43 | // Add Polyfills | 45 | // Add Polyfills |
44 | smoothScroll.polyfill(); | 46 | smoothScroll.polyfill(); |
@@ -75,6 +77,8 @@ window.addEventListener('load', () => { | |||
75 | <Route path="/settings/recipes/:filter" component={RecipesScreen} /> | 77 | <Route path="/settings/recipes/:filter" component={RecipesScreen} /> |
76 | <Route path="/settings/services" component={ServicesScreen} /> | 78 | <Route path="/settings/services" component={ServicesScreen} /> |
77 | <Route path="/settings/services/:action/:id" component={EditServiceScreen} /> | 79 | <Route path="/settings/services/:action/:id" component={EditServiceScreen} /> |
80 | <Route path="/settings/workspaces" component={WorkspacesScreen} /> | ||
81 | <Route path="/settings/workspaces/:action/:id" component={EditWorkspaceScreen} /> | ||
78 | <Route path="/settings/user" component={AccountScreen} /> | 82 | <Route path="/settings/user" component={AccountScreen} /> |
79 | <Route path="/settings/user/edit" component={EditUserScreen} /> | 83 | <Route path="/settings/user/edit" component={EditUserScreen} /> |
80 | <Route path="/settings/app" component={EditSettingsScreen} /> | 84 | <Route path="/settings/app" component={EditSettingsScreen} /> |
diff --git a/src/components/layout/Sidebar.js b/src/components/layout/Sidebar.js index 609a3b604..fcc5b0001 100644 --- a/src/components/layout/Sidebar.js +++ b/src/components/layout/Sidebar.js | |||
@@ -31,7 +31,7 @@ export default @observer class Sidebar extends Component { | |||
31 | openSettings: PropTypes.func.isRequired, | 31 | openSettings: PropTypes.func.isRequired, |
32 | toggleMuteApp: PropTypes.func.isRequired, | 32 | toggleMuteApp: PropTypes.func.isRequired, |
33 | isAppMuted: PropTypes.bool.isRequired, | 33 | isAppMuted: PropTypes.bool.isRequired, |
34 | } | 34 | }; |
35 | 35 | ||
36 | static contextTypes = { | 36 | static contextTypes = { |
37 | intl: intlShape, | 37 | intl: intlShape, |
diff --git a/src/components/services/tabs/Tabbar.js b/src/components/services/tabs/Tabbar.js index dd5c2140f..5e8260ad0 100644 --- a/src/components/services/tabs/Tabbar.js +++ b/src/components/services/tabs/Tabbar.js | |||
@@ -19,7 +19,7 @@ export default @observer class TabBar extends Component { | |||
19 | updateService: PropTypes.func.isRequired, | 19 | updateService: PropTypes.func.isRequired, |
20 | showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired, | 20 | showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired, |
21 | showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired, | 21 | showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired, |
22 | } | 22 | }; |
23 | 23 | ||
24 | onSortEnd = ({ oldIndex, newIndex }) => { | 24 | onSortEnd = ({ oldIndex, newIndex }) => { |
25 | const { | 25 | const { |
@@ -45,7 +45,7 @@ export default @observer class TabBar extends Component { | |||
45 | redirect: false, | 45 | redirect: false, |
46 | }); | 46 | }); |
47 | } | 47 | } |
48 | } | 48 | }; |
49 | 49 | ||
50 | disableService({ serviceId }) { | 50 | disableService({ serviceId }) { |
51 | this.toggleService({ serviceId, isEnabled: false }); | 51 | this.toggleService({ serviceId, isEnabled: false }); |
diff --git a/src/components/settings/navigation/SettingsNavigation.js b/src/components/settings/navigation/SettingsNavigation.js index 953f702f8..4a80bb126 100644 --- a/src/components/settings/navigation/SettingsNavigation.js +++ b/src/components/settings/navigation/SettingsNavigation.js | |||
@@ -14,6 +14,10 @@ const messages = defineMessages({ | |||
14 | id: 'settings.navigation.yourServices', | 14 | id: 'settings.navigation.yourServices', |
15 | defaultMessage: '!!!Your services', | 15 | defaultMessage: '!!!Your services', |
16 | }, | 16 | }, |
17 | yourWorkspaces: { | ||
18 | id: 'settings.navigation.yourWorkspaces', | ||
19 | defaultMessage: '!!!Your workspaces', | ||
20 | }, | ||
17 | account: { | 21 | account: { |
18 | id: 'settings.navigation.account', | 22 | id: 'settings.navigation.account', |
19 | defaultMessage: '!!!Account', | 23 | defaultMessage: '!!!Account', |
@@ -64,6 +68,14 @@ export default @inject('stores') @observer class SettingsNavigation extends Comp | |||
64 | <span className="badge">{serviceCount}</span> | 68 | <span className="badge">{serviceCount}</span> |
65 | </Link> | 69 | </Link> |
66 | <Link | 70 | <Link |
71 | to="/settings/workspaces" | ||
72 | className="settings-navigation__link" | ||
73 | activeClassName="is-active" | ||
74 | > | ||
75 | {intl.formatMessage(messages.yourWorkspaces)} | ||
76 | {' '} | ||
77 | </Link> | ||
78 | <Link | ||
67 | to="/settings/user" | 79 | to="/settings/user" |
68 | className="settings-navigation__link" | 80 | className="settings-navigation__link" |
69 | activeClassName="is-active" | 81 | activeClassName="is-active" |
diff --git a/src/config.js b/src/config.js index 479572edb..d619a7492 100644 --- a/src/config.js +++ b/src/config.js | |||
@@ -41,6 +41,8 @@ export const DEFAULT_FEATURES_CONFIG = { | |||
41 | }, | 41 | }, |
42 | isServiceProxyEnabled: false, | 42 | isServiceProxyEnabled: false, |
43 | isServiceProxyPremiumFeature: true, | 43 | isServiceProxyPremiumFeature: true, |
44 | isWorkspacePremiumFeature: true, | ||
45 | isWorkspaceEnabled: true, | ||
44 | }; | 46 | }; |
45 | 47 | ||
46 | export const DEFAULT_WINDOW_OPTIONS = { | 48 | export const DEFAULT_WINDOW_OPTIONS = { |
diff --git a/src/environment.js b/src/environment.js index 73b1c7ab2..d67fd6adb 100644 --- a/src/environment.js +++ b/src/environment.js | |||
@@ -28,3 +28,4 @@ if (!isDevMode || (isDevMode && useLiveAPI)) { | |||
28 | } | 28 | } |
29 | 29 | ||
30 | export const API = api; | 30 | export const API = api; |
31 | export const API_VERSION = 'v1'; | ||
diff --git a/src/features/delayApp/Component.js b/src/features/delayApp/Component.js index ff84510e8..ff0f1f2f8 100644 --- a/src/features/delayApp/Component.js +++ b/src/features/delayApp/Component.js | |||
@@ -38,7 +38,7 @@ export default @inject('actions') @injectSheet(styles) @observer class DelayApp | |||
38 | 38 | ||
39 | state = { | 39 | state = { |
40 | countdown: config.delayDuration, | 40 | countdown: config.delayDuration, |
41 | } | 41 | }; |
42 | 42 | ||
43 | countdownInterval = null; | 43 | countdownInterval = null; |
44 | 44 | ||
diff --git a/src/features/workspaces/actions.js b/src/features/workspaces/actions.js new file mode 100644 index 000000000..25246de09 --- /dev/null +++ b/src/features/workspaces/actions.js | |||
@@ -0,0 +1,22 @@ | |||
1 | import PropTypes from 'prop-types'; | ||
2 | import Workspace from './models/Workspace'; | ||
3 | import { createActionsFromDefinitions } from '../../actions/lib/actions'; | ||
4 | |||
5 | export default createActionsFromDefinitions({ | ||
6 | edit: { | ||
7 | workspace: PropTypes.instanceOf(Workspace).isRequired, | ||
8 | }, | ||
9 | create: { | ||
10 | name: PropTypes.string.isRequired, | ||
11 | }, | ||
12 | delete: { | ||
13 | workspace: PropTypes.instanceOf(Workspace).isRequired, | ||
14 | }, | ||
15 | update: { | ||
16 | workspace: PropTypes.instanceOf(Workspace).isRequired, | ||
17 | }, | ||
18 | activate: { | ||
19 | workspace: PropTypes.instanceOf(Workspace).isRequired, | ||
20 | }, | ||
21 | deactivate: {}, | ||
22 | }, PropTypes.checkPropTypes); | ||
diff --git a/src/features/workspaces/api.js b/src/features/workspaces/api.js new file mode 100644 index 000000000..733cb5593 --- /dev/null +++ b/src/features/workspaces/api.js | |||
@@ -0,0 +1,39 @@ | |||
1 | import { pick } from 'lodash'; | ||
2 | import { sendAuthRequest } from '../../api/utils/auth'; | ||
3 | import { API, API_VERSION } from '../../environment'; | ||
4 | |||
5 | export default { | ||
6 | getUserWorkspaces: async () => { | ||
7 | const url = `${API}/${API_VERSION}/workspace`; | ||
8 | const request = await sendAuthRequest(url, { method: 'GET' }); | ||
9 | if (!request.ok) throw request; | ||
10 | return request.json(); | ||
11 | }, | ||
12 | |||
13 | createWorkspace: async (name) => { | ||
14 | const url = `${API}/${API_VERSION}/workspace`; | ||
15 | const request = await sendAuthRequest(url, { | ||
16 | method: 'POST', | ||
17 | body: JSON.stringify({ name }), | ||
18 | }); | ||
19 | if (!request.ok) throw request; | ||
20 | return request.json(); | ||
21 | }, | ||
22 | |||
23 | deleteWorkspace: async (workspace) => { | ||
24 | const url = `${API}/${API_VERSION}/workspace/${workspace.id}`; | ||
25 | const request = await sendAuthRequest(url, { method: 'DELETE' }); | ||
26 | if (!request.ok) throw request; | ||
27 | return request.json(); | ||
28 | }, | ||
29 | |||
30 | updateWorkspace: async (workspace) => { | ||
31 | const url = `${API}/${API_VERSION}/workspace/${workspace.id}`; | ||
32 | const request = await sendAuthRequest(url, { | ||
33 | method: 'PUT', | ||
34 | body: JSON.stringify(pick(workspace, ['name', 'services'])), | ||
35 | }); | ||
36 | if (!request.ok) throw request; | ||
37 | return request.json(); | ||
38 | }, | ||
39 | }; | ||
diff --git a/src/features/workspaces/components/CreateWorkspaceForm.js b/src/features/workspaces/components/CreateWorkspaceForm.js new file mode 100644 index 000000000..83f6e07f7 --- /dev/null +++ b/src/features/workspaces/components/CreateWorkspaceForm.js | |||
@@ -0,0 +1,93 @@ | |||
1 | import React, { Component } from 'react'; | ||
2 | import PropTypes from 'prop-types'; | ||
3 | import { observer } from 'mobx-react'; | ||
4 | import { defineMessages, intlShape } from 'react-intl'; | ||
5 | import { Input, Button } from '@meetfranz/forms'; | ||
6 | import injectSheet from 'react-jss'; | ||
7 | import Form from '../../../lib/Form'; | ||
8 | import { required } from '../../../helpers/validation-helpers'; | ||
9 | |||
10 | const messages = defineMessages({ | ||
11 | submitButton: { | ||
12 | id: 'settings.workspace.add.form.submitButton', | ||
13 | defaultMessage: '!!!Save workspace', | ||
14 | }, | ||
15 | name: { | ||
16 | id: 'settings.workspace.add.form.name', | ||
17 | defaultMessage: '!!!Name', | ||
18 | }, | ||
19 | }); | ||
20 | |||
21 | const styles = () => ({ | ||
22 | form: { | ||
23 | display: 'flex', | ||
24 | }, | ||
25 | input: { | ||
26 | flexGrow: 1, | ||
27 | marginRight: '10px', | ||
28 | }, | ||
29 | submitButton: { | ||
30 | height: 'inherit', | ||
31 | marginTop: '3px', | ||
32 | }, | ||
33 | }); | ||
34 | |||
35 | @injectSheet(styles) @observer | ||
36 | class CreateWorkspaceForm extends Component { | ||
37 | static contextTypes = { | ||
38 | intl: intlShape, | ||
39 | }; | ||
40 | |||
41 | static propTypes = { | ||
42 | classes: PropTypes.object.isRequired, | ||
43 | onSubmit: PropTypes.func.isRequired, | ||
44 | }; | ||
45 | |||
46 | form = (() => { | ||
47 | const { intl } = this.context; | ||
48 | return new Form({ | ||
49 | fields: { | ||
50 | name: { | ||
51 | label: intl.formatMessage(messages.name), | ||
52 | placeholder: intl.formatMessage(messages.name), | ||
53 | value: '', | ||
54 | validators: [required], | ||
55 | }, | ||
56 | }, | ||
57 | }); | ||
58 | })(); | ||
59 | |||
60 | submitForm() { | ||
61 | const { form } = this; | ||
62 | form.submit({ | ||
63 | onSuccess: async (f) => { | ||
64 | const { onSubmit } = this.props; | ||
65 | onSubmit(f.values()); | ||
66 | }, | ||
67 | }); | ||
68 | } | ||
69 | |||
70 | render() { | ||
71 | const { intl } = this.context; | ||
72 | const { classes } = this.props; | ||
73 | const { form } = this; | ||
74 | return ( | ||
75 | <div className={classes.form}> | ||
76 | <Input | ||
77 | className={classes.input} | ||
78 | {...form.$('name').bind()} | ||
79 | showLabel={false} | ||
80 | onEnterKey={this.submitForm.bind(this, form)} | ||
81 | /> | ||
82 | <Button | ||
83 | className={classes.submitButton} | ||
84 | type="submit" | ||
85 | label={intl.formatMessage(messages.submitButton)} | ||
86 | onClick={this.submitForm.bind(this, form)} | ||
87 | /> | ||
88 | </div> | ||
89 | ); | ||
90 | } | ||
91 | } | ||
92 | |||
93 | export default CreateWorkspaceForm; | ||
diff --git a/src/features/workspaces/components/EditWorkspaceForm.js b/src/features/workspaces/components/EditWorkspaceForm.js new file mode 100644 index 000000000..48090f608 --- /dev/null +++ b/src/features/workspaces/components/EditWorkspaceForm.js | |||
@@ -0,0 +1,192 @@ | |||
1 | import React, { Component } from 'react'; | ||
2 | import PropTypes from 'prop-types'; | ||
3 | import { observer } from 'mobx-react'; | ||
4 | import { defineMessages, intlShape } from 'react-intl'; | ||
5 | import { Link } from 'react-router'; | ||
6 | import { Input, Button } from '@meetfranz/forms'; | ||
7 | import injectSheet from 'react-jss'; | ||
8 | |||
9 | import Workspace from '../models/Workspace'; | ||
10 | import Service from '../../../models/Service'; | ||
11 | import Form from '../../../lib/Form'; | ||
12 | import { required } from '../../../helpers/validation-helpers'; | ||
13 | import ServiceListItem from './ServiceListItem'; | ||
14 | |||
15 | const messages = defineMessages({ | ||
16 | buttonDelete: { | ||
17 | id: 'settings.workspace.form.buttonDelete', | ||
18 | defaultMessage: '!!!Delete workspace', | ||
19 | }, | ||
20 | buttonSave: { | ||
21 | id: 'settings.workspace.form.buttonSave', | ||
22 | defaultMessage: '!!!Save workspace', | ||
23 | }, | ||
24 | name: { | ||
25 | id: 'settings.workspace.form.name', | ||
26 | defaultMessage: '!!!Name', | ||
27 | }, | ||
28 | yourWorkspaces: { | ||
29 | id: 'settings.workspace.form.yourWorkspaces', | ||
30 | defaultMessage: '!!!Your workspaces', | ||
31 | }, | ||
32 | servicesInWorkspaceHeadline: { | ||
33 | id: 'settings.workspace.form.servicesInWorkspaceHeadline', | ||
34 | defaultMessage: '!!!Services in this Workspace', | ||
35 | }, | ||
36 | }); | ||
37 | |||
38 | const styles = () => ({ | ||
39 | nameInput: { | ||
40 | height: 'auto', | ||
41 | }, | ||
42 | serviceList: { | ||
43 | height: 'auto', | ||
44 | }, | ||
45 | }); | ||
46 | |||
47 | @injectSheet(styles) @observer | ||
48 | class EditWorkspaceForm extends Component { | ||
49 | static contextTypes = { | ||
50 | intl: intlShape, | ||
51 | }; | ||
52 | |||
53 | static propTypes = { | ||
54 | classes: PropTypes.object.isRequired, | ||
55 | isDeleting: PropTypes.bool.isRequired, | ||
56 | isSaving: PropTypes.bool.isRequired, | ||
57 | onDelete: PropTypes.func.isRequired, | ||
58 | onSave: PropTypes.func.isRequired, | ||
59 | services: PropTypes.arrayOf(PropTypes.instanceOf(Service)).isRequired, | ||
60 | workspace: PropTypes.instanceOf(Workspace).isRequired, | ||
61 | }; | ||
62 | |||
63 | form = this.prepareWorkspaceForm(this.props.workspace); | ||
64 | |||
65 | componentWillReceiveProps(nextProps) { | ||
66 | const { workspace } = this.props; | ||
67 | if (workspace.id !== nextProps.workspace.id) { | ||
68 | this.form = this.prepareWorkspaceForm(nextProps.workspace); | ||
69 | } | ||
70 | } | ||
71 | |||
72 | prepareWorkspaceForm(workspace) { | ||
73 | const { intl } = this.context; | ||
74 | return new Form({ | ||
75 | fields: { | ||
76 | name: { | ||
77 | label: intl.formatMessage(messages.name), | ||
78 | placeholder: intl.formatMessage(messages.name), | ||
79 | value: workspace.name, | ||
80 | validators: [required], | ||
81 | }, | ||
82 | services: { | ||
83 | value: workspace.services.slice(), | ||
84 | }, | ||
85 | }, | ||
86 | }); | ||
87 | } | ||
88 | |||
89 | submitForm(form) { | ||
90 | form.submit({ | ||
91 | onSuccess: async (f) => { | ||
92 | const { onSave } = this.props; | ||
93 | const values = f.values(); | ||
94 | onSave(values); | ||
95 | }, | ||
96 | onError: async () => {}, | ||
97 | }); | ||
98 | } | ||
99 | |||
100 | toggleService(service) { | ||
101 | const servicesField = this.form.$('services'); | ||
102 | const serviceIds = servicesField.value; | ||
103 | if (serviceIds.includes(service.id)) { | ||
104 | serviceIds.splice(serviceIds.indexOf(service.id), 1); | ||
105 | } else { | ||
106 | serviceIds.push(service.id); | ||
107 | } | ||
108 | servicesField.set(serviceIds); | ||
109 | } | ||
110 | |||
111 | render() { | ||
112 | const { intl } = this.context; | ||
113 | const { | ||
114 | classes, | ||
115 | isDeleting, | ||
116 | isSaving, | ||
117 | onDelete, | ||
118 | workspace, | ||
119 | services, | ||
120 | } = this.props; | ||
121 | const { form } = this; | ||
122 | const workspaceServices = form.$('services').value; | ||
123 | return ( | ||
124 | <div className="settings__main"> | ||
125 | <div className="settings__header"> | ||
126 | <span className="settings__header-item"> | ||
127 | <Link to="/settings/workspaces"> | ||
128 | {intl.formatMessage(messages.yourWorkspaces)} | ||
129 | </Link> | ||
130 | </span> | ||
131 | <span className="separator" /> | ||
132 | <span className="settings__header-item"> | ||
133 | {workspace.name} | ||
134 | </span> | ||
135 | </div> | ||
136 | <div className="settings__body"> | ||
137 | <div className={classes.nameInput}> | ||
138 | <Input {...form.$('name').bind()} /> | ||
139 | </div> | ||
140 | <h2>{intl.formatMessage(messages.servicesInWorkspaceHeadline)}</h2> | ||
141 | <div className={classes.serviceList}> | ||
142 | {services.map(s => ( | ||
143 | <ServiceListItem | ||
144 | key={s.id} | ||
145 | service={s} | ||
146 | isInWorkspace={workspaceServices.includes(s.id)} | ||
147 | onToggle={() => this.toggleService(s)} | ||
148 | /> | ||
149 | ))} | ||
150 | </div> | ||
151 | </div> | ||
152 | <div className="settings__controls"> | ||
153 | {/* ===== Delete Button ===== */} | ||
154 | {isDeleting ? ( | ||
155 | <Button | ||
156 | label={intl.formatMessage(messages.buttonDelete)} | ||
157 | loaded={false} | ||
158 | buttonType="secondary" | ||
159 | className="settings__delete-button" | ||
160 | disabled | ||
161 | /> | ||
162 | ) : ( | ||
163 | <Button | ||
164 | buttonType="danger" | ||
165 | label={intl.formatMessage(messages.buttonDelete)} | ||
166 | className="settings__delete-button" | ||
167 | onClick={onDelete} | ||
168 | /> | ||
169 | )} | ||
170 | {/* ===== Save Button ===== */} | ||
171 | {isSaving ? ( | ||
172 | <Button | ||
173 | type="submit" | ||
174 | label={intl.formatMessage(messages.buttonSave)} | ||
175 | loaded={!isSaving} | ||
176 | buttonType="secondary" | ||
177 | disabled | ||
178 | /> | ||
179 | ) : ( | ||
180 | <Button | ||
181 | type="submit" | ||
182 | label={intl.formatMessage(messages.buttonSave)} | ||
183 | onClick={this.submitForm.bind(this, form)} | ||
184 | /> | ||
185 | )} | ||
186 | </div> | ||
187 | </div> | ||
188 | ); | ||
189 | } | ||
190 | } | ||
191 | |||
192 | export default EditWorkspaceForm; | ||
diff --git a/src/features/workspaces/components/ServiceListItem.js b/src/features/workspaces/components/ServiceListItem.js new file mode 100644 index 000000000..146cc5a36 --- /dev/null +++ b/src/features/workspaces/components/ServiceListItem.js | |||
@@ -0,0 +1,48 @@ | |||
1 | import React, { Component } from 'react'; | ||
2 | import PropTypes from 'prop-types'; | ||
3 | import { observer } from 'mobx-react'; | ||
4 | import injectSheet from 'react-jss'; | ||
5 | import { Toggle } from '@meetfranz/forms'; | ||
6 | |||
7 | import Service from '../../../models/Service'; | ||
8 | |||
9 | const styles = () => ({ | ||
10 | service: { | ||
11 | height: 'auto', | ||
12 | display: 'flex', | ||
13 | }, | ||
14 | name: { | ||
15 | marginTop: '4px', | ||
16 | }, | ||
17 | }); | ||
18 | |||
19 | @injectSheet(styles) @observer | ||
20 | class ServiceListItem extends Component { | ||
21 | static propTypes = { | ||
22 | classes: PropTypes.object.isRequired, | ||
23 | isInWorkspace: PropTypes.bool.isRequired, | ||
24 | onToggle: PropTypes.func.isRequired, | ||
25 | service: PropTypes.instanceOf(Service).isRequired, | ||
26 | }; | ||
27 | |||
28 | render() { | ||
29 | const { | ||
30 | classes, | ||
31 | isInWorkspace, | ||
32 | onToggle, | ||
33 | service, | ||
34 | } = this.props; | ||
35 | |||
36 | return ( | ||
37 | <div className={classes.service}> | ||
38 | <Toggle | ||
39 | checked={isInWorkspace} | ||
40 | onChange={onToggle} | ||
41 | label={service.name} | ||
42 | /> | ||
43 | </div> | ||
44 | ); | ||
45 | } | ||
46 | } | ||
47 | |||
48 | export default ServiceListItem; | ||
diff --git a/src/features/workspaces/components/WorkspaceItem.js b/src/features/workspaces/components/WorkspaceItem.js new file mode 100644 index 000000000..b2c2a4830 --- /dev/null +++ b/src/features/workspaces/components/WorkspaceItem.js | |||
@@ -0,0 +1,42 @@ | |||
1 | import React, { Component } from 'react'; | ||
2 | import PropTypes from 'prop-types'; | ||
3 | import { intlShape } from 'react-intl'; | ||
4 | import { observer } from 'mobx-react'; | ||
5 | import classnames from 'classnames'; | ||
6 | import Workspace from '../models/Workspace'; | ||
7 | |||
8 | // const messages = defineMessages({}); | ||
9 | |||
10 | @observer | ||
11 | class WorkspaceItem extends Component { | ||
12 | static propTypes = { | ||
13 | workspace: PropTypes.instanceOf(Workspace).isRequired, | ||
14 | onItemClick: PropTypes.func.isRequired, | ||
15 | }; | ||
16 | |||
17 | static contextTypes = { | ||
18 | intl: intlShape, | ||
19 | }; | ||
20 | |||
21 | render() { | ||
22 | const { workspace, onItemClick } = this.props; | ||
23 | // const { intl } = this.context; | ||
24 | |||
25 | return ( | ||
26 | <tr | ||
27 | className={classnames({ | ||
28 | 'workspace-table__row': true, | ||
29 | })} | ||
30 | > | ||
31 | <td | ||
32 | className="workspace-table__column-name" | ||
33 | onClick={() => onItemClick(workspace)} | ||
34 | > | ||
35 | {workspace.name} | ||
36 | </td> | ||
37 | </tr> | ||
38 | ); | ||
39 | } | ||
40 | } | ||
41 | |||
42 | export default WorkspaceItem; | ||
diff --git a/src/features/workspaces/components/WorkspacesDashboard.js b/src/features/workspaces/components/WorkspacesDashboard.js new file mode 100644 index 000000000..917807302 --- /dev/null +++ b/src/features/workspaces/components/WorkspacesDashboard.js | |||
@@ -0,0 +1,85 @@ | |||
1 | import React, { Component } from 'react'; | ||
2 | import PropTypes from 'prop-types'; | ||
3 | import { observer, PropTypes as MobxPropTypes } from 'mobx-react'; | ||
4 | import { defineMessages, intlShape } from 'react-intl'; | ||
5 | import injectSheet from 'react-jss'; | ||
6 | |||
7 | import Loader from '../../../components/ui/Loader'; | ||
8 | import WorkspaceItem from './WorkspaceItem'; | ||
9 | import CreateWorkspaceForm from './CreateWorkspaceForm'; | ||
10 | |||
11 | const messages = defineMessages({ | ||
12 | headline: { | ||
13 | id: 'settings.workspaces.headline', | ||
14 | defaultMessage: '!!!Your workspaces', | ||
15 | }, | ||
16 | noServicesAdded: { | ||
17 | id: 'settings.workspaces.noWorkspacesAdded', | ||
18 | defaultMessage: '!!!You haven\'t added any workspaces yet.', | ||
19 | }, | ||
20 | }); | ||
21 | |||
22 | const styles = () => ({ | ||
23 | createForm: { | ||
24 | height: 'auto', | ||
25 | marginBottom: '20px', | ||
26 | }, | ||
27 | }); | ||
28 | |||
29 | @observer @injectSheet(styles) | ||
30 | class WorkspacesDashboard extends Component { | ||
31 | static propTypes = { | ||
32 | classes: PropTypes.object.isRequired, | ||
33 | isLoading: PropTypes.bool.isRequired, | ||
34 | onCreateWorkspaceSubmit: PropTypes.func.isRequired, | ||
35 | onWorkspaceClick: PropTypes.func.isRequired, | ||
36 | workspaces: MobxPropTypes.arrayOrObservableArray.isRequired, | ||
37 | }; | ||
38 | |||
39 | static contextTypes = { | ||
40 | intl: intlShape, | ||
41 | }; | ||
42 | |||
43 | render() { | ||
44 | const { | ||
45 | workspaces, | ||
46 | isLoading, | ||
47 | onCreateWorkspaceSubmit, | ||
48 | onWorkspaceClick, | ||
49 | classes, | ||
50 | } = this.props; | ||
51 | const { intl } = this.context; | ||
52 | |||
53 | return ( | ||
54 | <div className="settings__main"> | ||
55 | <div className="settings__header"> | ||
56 | <h1>{intl.formatMessage(messages.headline)}</h1> | ||
57 | </div> | ||
58 | <div className="settings__body"> | ||
59 | <div className={classes.body}> | ||
60 | <div className={classes.createForm}> | ||
61 | <CreateWorkspaceForm onSubmit={onCreateWorkspaceSubmit} /> | ||
62 | </div> | ||
63 | {isLoading ? ( | ||
64 | <Loader /> | ||
65 | ) : ( | ||
66 | <table className="workspace-table"> | ||
67 | <tbody> | ||
68 | {workspaces.map(workspace => ( | ||
69 | <WorkspaceItem | ||
70 | key={workspace.id} | ||
71 | workspace={workspace} | ||
72 | onItemClick={w => onWorkspaceClick(w)} | ||
73 | /> | ||
74 | ))} | ||
75 | </tbody> | ||
76 | </table> | ||
77 | )} | ||
78 | </div> | ||
79 | </div> | ||
80 | </div> | ||
81 | ); | ||
82 | } | ||
83 | } | ||
84 | |||
85 | export default WorkspacesDashboard; | ||
diff --git a/src/features/workspaces/containers/EditWorkspaceScreen.js b/src/features/workspaces/containers/EditWorkspaceScreen.js new file mode 100644 index 000000000..1b13bc2d4 --- /dev/null +++ b/src/features/workspaces/containers/EditWorkspaceScreen.js | |||
@@ -0,0 +1,59 @@ | |||
1 | import React, { Component } from 'react'; | ||
2 | import { inject, observer } from 'mobx-react'; | ||
3 | import PropTypes from 'prop-types'; | ||
4 | |||
5 | import ErrorBoundary from '../../../components/util/ErrorBoundary'; | ||
6 | import EditWorkspaceForm from '../components/EditWorkspaceForm'; | ||
7 | import { workspacesState } from '../state'; | ||
8 | import ServicesStore from '../../../stores/ServicesStore'; | ||
9 | import Workspace from '../models/Workspace'; | ||
10 | |||
11 | @inject('stores', 'actions') @observer | ||
12 | class EditWorkspaceScreen extends Component { | ||
13 | static propTypes = { | ||
14 | actions: PropTypes.shape({ | ||
15 | workspace: PropTypes.shape({ | ||
16 | delete: PropTypes.func.isRequired, | ||
17 | }), | ||
18 | }).isRequired, | ||
19 | stores: PropTypes.shape({ | ||
20 | services: PropTypes.instanceOf(ServicesStore).isRequired, | ||
21 | }).isRequired, | ||
22 | }; | ||
23 | |||
24 | onDelete = () => { | ||
25 | const { workspaceBeingEdited } = workspacesState; | ||
26 | const { actions } = this.props; | ||
27 | if (!workspaceBeingEdited) return null; | ||
28 | actions.workspaces.delete({ workspace: workspaceBeingEdited }); | ||
29 | }; | ||
30 | |||
31 | onSave = (values) => { | ||
32 | const { workspaceBeingEdited } = workspacesState; | ||
33 | const { actions } = this.props; | ||
34 | const workspace = new Workspace( | ||
35 | Object.assign({}, workspaceBeingEdited, values), | ||
36 | ); | ||
37 | actions.workspaces.update({ workspace }); | ||
38 | }; | ||
39 | |||
40 | render() { | ||
41 | const { workspaceBeingEdited } = workspacesState; | ||
42 | const { stores } = this.props; | ||
43 | if (!workspaceBeingEdited) return null; | ||
44 | return ( | ||
45 | <ErrorBoundary> | ||
46 | <EditWorkspaceForm | ||
47 | workspace={workspaceBeingEdited} | ||
48 | services={stores.services.all} | ||
49 | onDelete={this.onDelete} | ||
50 | onSave={this.onSave} | ||
51 | isDeleting={false} | ||
52 | isSaving={false} | ||
53 | /> | ||
54 | </ErrorBoundary> | ||
55 | ); | ||
56 | } | ||
57 | } | ||
58 | |||
59 | export default EditWorkspaceScreen; | ||
diff --git a/src/features/workspaces/containers/WorkspacesScreen.js b/src/features/workspaces/containers/WorkspacesScreen.js new file mode 100644 index 000000000..94e714255 --- /dev/null +++ b/src/features/workspaces/containers/WorkspacesScreen.js | |||
@@ -0,0 +1,33 @@ | |||
1 | import React, { Component } from 'react'; | ||
2 | import { inject, observer } from 'mobx-react'; | ||
3 | import PropTypes from 'prop-types'; | ||
4 | import { workspacesState } from '../state'; | ||
5 | import WorkspacesDashboard from '../components/WorkspacesDashboard'; | ||
6 | import ErrorBoundary from '../../../components/util/ErrorBoundary'; | ||
7 | |||
8 | @inject('actions') @observer | ||
9 | class WorkspacesScreen extends Component { | ||
10 | static propTypes = { | ||
11 | actions: PropTypes.shape({ | ||
12 | workspace: PropTypes.shape({ | ||
13 | edit: PropTypes.func.isRequired, | ||
14 | }), | ||
15 | }).isRequired, | ||
16 | }; | ||
17 | |||
18 | render() { | ||
19 | const { actions } = this.props; | ||
20 | return ( | ||
21 | <ErrorBoundary> | ||
22 | <WorkspacesDashboard | ||
23 | workspaces={workspacesState.workspaces} | ||
24 | isLoading={workspacesState.isLoading} | ||
25 | onCreateWorkspaceSubmit={data => actions.workspaces.create(data)} | ||
26 | onWorkspaceClick={w => actions.workspaces.edit({ workspace: w })} | ||
27 | /> | ||
28 | </ErrorBoundary> | ||
29 | ); | ||
30 | } | ||
31 | } | ||
32 | |||
33 | export default WorkspacesScreen; | ||
diff --git a/src/features/workspaces/index.js b/src/features/workspaces/index.js new file mode 100644 index 000000000..26cadea64 --- /dev/null +++ b/src/features/workspaces/index.js | |||
@@ -0,0 +1,67 @@ | |||
1 | import { reaction, runInAction } from 'mobx'; | ||
2 | import WorkspacesStore from './store'; | ||
3 | import api from './api'; | ||
4 | import { workspacesState, resetState } from './state'; | ||
5 | |||
6 | const debug = require('debug')('Franz:feature:workspaces'); | ||
7 | |||
8 | let store = null; | ||
9 | |||
10 | export const filterServicesByActiveWorkspace = (services) => { | ||
11 | const { isFeatureActive, activeWorkspace } = workspacesState; | ||
12 | if (isFeatureActive && activeWorkspace) { | ||
13 | return services.filter(s => activeWorkspace.services.includes(s.id)); | ||
14 | } | ||
15 | return services; | ||
16 | }; | ||
17 | |||
18 | export const getActiveWorkspaceServices = services => ( | ||
19 | filterServicesByActiveWorkspace(services) | ||
20 | ); | ||
21 | |||
22 | export default function initWorkspaces(stores, actions) { | ||
23 | const { features, user } = stores; | ||
24 | |||
25 | // Toggle workspace feature | ||
26 | reaction( | ||
27 | () => ( | ||
28 | features.features.isWorkspaceEnabled && ( | ||
29 | !features.features.isWorkspacePremiumFeature || user.data.isPremium | ||
30 | ) | ||
31 | ), | ||
32 | (isEnabled) => { | ||
33 | if (isEnabled) { | ||
34 | debug('Initializing `workspaces` feature'); | ||
35 | store = new WorkspacesStore(stores, api, actions, workspacesState); | ||
36 | store.initialize(); | ||
37 | runInAction(() => { workspacesState.isFeatureActive = true; }); | ||
38 | } else if (store) { | ||
39 | debug('Disabling `workspaces` feature'); | ||
40 | runInAction(() => { workspacesState.isFeatureActive = false; }); | ||
41 | store.teardown(); | ||
42 | store = null; | ||
43 | resetState(); // Reset state to default | ||
44 | } | ||
45 | }, | ||
46 | { | ||
47 | fireImmediately: true, | ||
48 | }, | ||
49 | ); | ||
50 | |||
51 | // Update active service on workspace switches | ||
52 | reaction(() => ({ | ||
53 | isFeatureActive: workspacesState.isFeatureActive, | ||
54 | activeWorkspace: workspacesState.activeWorkspace, | ||
55 | }), ({ isFeatureActive, activeWorkspace }) => { | ||
56 | if (!isFeatureActive) return; | ||
57 | if (activeWorkspace) { | ||
58 | const services = stores.services.allDisplayed; | ||
59 | const activeService = services.find(s => s.isActive); | ||
60 | const workspaceServices = filterServicesByActiveWorkspace(services); | ||
61 | const isActiveServiceInWorkspace = workspaceServices.includes(activeService); | ||
62 | if (!isActiveServiceInWorkspace) { | ||
63 | actions.service.setActive({ serviceId: workspaceServices[0].id }); | ||
64 | } | ||
65 | } | ||
66 | }); | ||
67 | } | ||
diff --git a/src/features/workspaces/models/Workspace.js b/src/features/workspaces/models/Workspace.js new file mode 100644 index 000000000..6c73d7095 --- /dev/null +++ b/src/features/workspaces/models/Workspace.js | |||
@@ -0,0 +1,25 @@ | |||
1 | import { observable } from 'mobx'; | ||
2 | |||
3 | export default class Workspace { | ||
4 | id = null; | ||
5 | |||
6 | @observable name = null; | ||
7 | |||
8 | @observable order = null; | ||
9 | |||
10 | @observable services = []; | ||
11 | |||
12 | @observable userId = null; | ||
13 | |||
14 | constructor(data) { | ||
15 | if (!data.id) { | ||
16 | throw Error('Workspace requires Id'); | ||
17 | } | ||
18 | |||
19 | this.id = data.id; | ||
20 | this.name = data.name; | ||
21 | this.order = data.order; | ||
22 | this.services.replace(data.services); | ||
23 | this.userId = data.userId; | ||
24 | } | ||
25 | } | ||
diff --git a/src/features/workspaces/state.js b/src/features/workspaces/state.js new file mode 100644 index 000000000..963b96f81 --- /dev/null +++ b/src/features/workspaces/state.js | |||
@@ -0,0 +1,15 @@ | |||
1 | import { observable } from 'mobx'; | ||
2 | |||
3 | const defaultState = { | ||
4 | activeWorkspace: null, | ||
5 | isLoading: false, | ||
6 | isFeatureActive: false, | ||
7 | workspaces: [], | ||
8 | workspaceBeingEdited: null, | ||
9 | }; | ||
10 | |||
11 | export const workspacesState = observable(defaultState); | ||
12 | |||
13 | export function resetState() { | ||
14 | Object.assign(workspacesState, defaultState); | ||
15 | } | ||
diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js new file mode 100644 index 000000000..a2997a0d2 --- /dev/null +++ b/src/features/workspaces/store.js | |||
@@ -0,0 +1,114 @@ | |||
1 | import { observable, reaction, action } from 'mobx'; | ||
2 | import Store from '../../stores/lib/Store'; | ||
3 | import CachedRequest from '../../stores/lib/CachedRequest'; | ||
4 | import Workspace from './models/Workspace'; | ||
5 | import { matchRoute } from '../../helpers/routing-helpers'; | ||
6 | import workspaceActions from './actions'; | ||
7 | |||
8 | const debug = require('debug')('Franz:feature:workspaces'); | ||
9 | |||
10 | export default class WorkspacesStore extends Store { | ||
11 | @observable allWorkspacesRequest = new CachedRequest(this.api, 'getUserWorkspaces'); | ||
12 | |||
13 | constructor(stores, api, actions, state) { | ||
14 | super(stores, api, actions); | ||
15 | this.state = state; | ||
16 | } | ||
17 | |||
18 | setup() { | ||
19 | debug('fetching workspaces'); | ||
20 | this.allWorkspacesRequest.execute(); | ||
21 | |||
22 | /** | ||
23 | * Update the state workspaces array when workspaces request has results. | ||
24 | */ | ||
25 | reaction( | ||
26 | () => this.allWorkspacesRequest.result, | ||
27 | workspaces => this._setWorkspaces(workspaces), | ||
28 | ); | ||
29 | /** | ||
30 | * Update the loading state when workspace request is executing. | ||
31 | */ | ||
32 | reaction( | ||
33 | () => this.allWorkspacesRequest.isExecuting, | ||
34 | isExecuting => this._setIsLoading(isExecuting), | ||
35 | ); | ||
36 | /** | ||
37 | * Update the state with the workspace to be edited when route matches. | ||
38 | */ | ||
39 | reaction( | ||
40 | () => ({ | ||
41 | pathname: this.stores.router.location.pathname, | ||
42 | workspaces: this.state.workspaces, | ||
43 | }), | ||
44 | ({ pathname }) => { | ||
45 | const match = matchRoute('/settings/workspaces/edit/:id', pathname); | ||
46 | if (match) { | ||
47 | this.state.workspaceBeingEdited = this._getWorkspaceById(match.id); | ||
48 | } | ||
49 | }, | ||
50 | ); | ||
51 | |||
52 | workspaceActions.edit.listen(this._edit); | ||
53 | workspaceActions.create.listen(this._create); | ||
54 | workspaceActions.delete.listen(this._delete); | ||
55 | workspaceActions.update.listen(this._update); | ||
56 | workspaceActions.activate.listen(this._setActiveWorkspace); | ||
57 | workspaceActions.deactivate.listen(this._deactivateActiveWorkspace); | ||
58 | } | ||
59 | |||
60 | _getWorkspaceById = id => this.state.workspaces.find(w => w.id === id); | ||
61 | |||
62 | @action _setWorkspaces = (workspaces) => { | ||
63 | debug('setting user workspaces', workspaces.slice()); | ||
64 | this.state.workspaces = workspaces.map(data => new Workspace(data)); | ||
65 | }; | ||
66 | |||
67 | @action _setIsLoading = (isLoading) => { | ||
68 | this.state.isLoading = isLoading; | ||
69 | }; | ||
70 | |||
71 | @action _edit = ({ workspace }) => { | ||
72 | this.stores.router.push(`/settings/workspaces/edit/${workspace.id}`); | ||
73 | }; | ||
74 | |||
75 | @action _create = async ({ name }) => { | ||
76 | try { | ||
77 | const result = await this.api.createWorkspace(name); | ||
78 | const workspace = new Workspace(result); | ||
79 | this.state.workspaces.push(workspace); | ||
80 | this._edit({ workspace }); | ||
81 | } catch (error) { | ||
82 | throw error; | ||
83 | } | ||
84 | }; | ||
85 | |||
86 | @action _delete = async ({ workspace }) => { | ||
87 | try { | ||
88 | await this.api.deleteWorkspace(workspace); | ||
89 | this.state.workspaces.remove(workspace); | ||
90 | this.stores.router.push('/settings/workspaces'); | ||
91 | } catch (error) { | ||
92 | throw error; | ||
93 | } | ||
94 | }; | ||
95 | |||
96 | @action _update = async ({ workspace }) => { | ||
97 | try { | ||
98 | await this.api.updateWorkspace(workspace); | ||
99 | const localWorkspace = this.state.workspaces.find(ws => ws.id === workspace.id); | ||
100 | Object.assign(localWorkspace, workspace); | ||
101 | this.stores.router.push('/settings/workspaces'); | ||
102 | } catch (error) { | ||
103 | throw error; | ||
104 | } | ||
105 | }; | ||
106 | |||
107 | @action _setActiveWorkspace = ({ workspace }) => { | ||
108 | this.state.activeWorkspace = workspace; | ||
109 | }; | ||
110 | |||
111 | @action _deactivateActiveWorkspace = () => { | ||
112 | this.state.activeWorkspace = null; | ||
113 | }; | ||
114 | } | ||
diff --git a/src/features/workspaces/styles/workspaces-table.scss b/src/features/workspaces/styles/workspaces-table.scss new file mode 100644 index 000000000..6d0e7b4f5 --- /dev/null +++ b/src/features/workspaces/styles/workspaces-table.scss | |||
@@ -0,0 +1,53 @@ | |||
1 | @import '../../../styles/config'; | ||
2 | |||
3 | .theme__dark .workspace-table { | ||
4 | .workspace-table__column-info .mdi { color: $dark-theme-gray-lightest; } | ||
5 | |||
6 | .workspace-table__row { | ||
7 | border-bottom: 1px solid $dark-theme-gray-darker; | ||
8 | |||
9 | &:hover { background: $dark-theme-gray-darker; } | ||
10 | &.workspace-table__row--disabled { color: $dark-theme-gray; } | ||
11 | } | ||
12 | } | ||
13 | |||
14 | .workspace-table { | ||
15 | width: 100%; | ||
16 | |||
17 | .workspace-table__toggle { | ||
18 | width: 60px; | ||
19 | |||
20 | .franz-form__field { | ||
21 | margin-bottom: 0; | ||
22 | } | ||
23 | } | ||
24 | |||
25 | .workspace-table__column-action { | ||
26 | width: 40px | ||
27 | } | ||
28 | |||
29 | .workspace-table__column-info { | ||
30 | width: 40px; | ||
31 | |||
32 | .mdi { | ||
33 | color: $theme-gray-light; | ||
34 | display: block; | ||
35 | font-size: 18px; | ||
36 | } | ||
37 | } | ||
38 | |||
39 | .workspace-table__row { | ||
40 | border-bottom: 1px solid $theme-gray-lightest; | ||
41 | |||
42 | &:hover { | ||
43 | cursor: initial; | ||
44 | background: $theme-gray-lightest; | ||
45 | } | ||
46 | |||
47 | &.workspace-table__row--disabled { | ||
48 | color: $theme-gray-light; | ||
49 | } | ||
50 | } | ||
51 | |||
52 | td { padding: 10px; } | ||
53 | } | ||
diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index 13b8d12fc..3ca62ca56 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json | |||
@@ -85,6 +85,9 @@ | |||
85 | "menu.window" : "Fenster", | 85 | "menu.window" : "Fenster", |
86 | "menu.window.close" : "Schließen", | 86 | "menu.window.close" : "Schließen", |
87 | "menu.window.minimize" : "Minimieren", | 87 | "menu.window.minimize" : "Minimieren", |
88 | "menu.workspaces": "Workspaces", | ||
89 | "menu.workspaces.defaultWorkspace": "All services", | ||
90 | "menu.workspaces.addNewWorkspace": "Add New Workspace", | ||
88 | "password.email.label" : "E-Mail Adresse", | 91 | "password.email.label" : "E-Mail Adresse", |
89 | "password.headline" : "Passwort zurücksetzen", | 92 | "password.headline" : "Passwort zurücksetzen", |
90 | "password.link.login" : "An Deinem Konto anmelden", | 93 | "password.link.login" : "An Deinem Konto anmelden", |
@@ -169,6 +172,7 @@ | |||
169 | "settings.navigation.logout" : "Abmelden", | 172 | "settings.navigation.logout" : "Abmelden", |
170 | "settings.navigation.settings" : "Einstellungen", | 173 | "settings.navigation.settings" : "Einstellungen", |
171 | "settings.navigation.yourServices" : "Deine Dienste", | 174 | "settings.navigation.yourServices" : "Deine Dienste", |
175 | "settings.navigation.yourWorkspaces": "Deine Workspaces", | ||
172 | "settings.recipes.all" : "Alle Dienste", | 176 | "settings.recipes.all" : "Alle Dienste", |
173 | "settings.recipes.dev" : "Entwicklung", | 177 | "settings.recipes.dev" : "Entwicklung", |
174 | "settings.recipes.headline" : "Verfügbare Dienste", | 178 | "settings.recipes.headline" : "Verfügbare Dienste", |
@@ -227,6 +231,14 @@ | |||
227 | "settings.services.tooltip.isMuted" : "Alle Töne sind deaktiviert", | 231 | "settings.services.tooltip.isMuted" : "Alle Töne sind deaktiviert", |
228 | "settings.services.tooltip.notificationsDisabled" : "Benachrichtigungen deaktiviert", | 232 | "settings.services.tooltip.notificationsDisabled" : "Benachrichtigungen deaktiviert", |
229 | "settings.services.updatedInfo" : "Deine Änderungen wurden gespeichert", | 233 | "settings.services.updatedInfo" : "Deine Änderungen wurden gespeichert", |
234 | "settings.workspaces.headline": "Deine Workspaces", | ||
235 | "settings.workspace.add.form.submitButton": "Workspace erstellen", | ||
236 | "settings.workspace.add.form.name": "Name", | ||
237 | "settings.workspace.form.yourWorkspaces": "Deine Workspaces", | ||
238 | "settings.workspace.form.name": "Name", | ||
239 | "settings.workspace.form.buttonDelete": "Workspace löschen", | ||
240 | "settings.workspace.form.buttonSave": "Workspace speichern", | ||
241 | "settings.workspace.form.servicesInWorkspaceHeadline": "Services in diesem Workspace", | ||
230 | "settings.user.form.accountType.company" : "Firma", | 242 | "settings.user.form.accountType.company" : "Firma", |
231 | "settings.user.form.accountType.individual" : "Einzelperson", | 243 | "settings.user.form.accountType.individual" : "Einzelperson", |
232 | "settings.user.form.accountType.label" : "Konto-Typ", | 244 | "settings.user.form.accountType.label" : "Konto-Typ", |
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 0641c510c..c8bb03ded 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json | |||
@@ -1299,55 +1299,68 @@ | |||
1299 | } | 1299 | } |
1300 | }, | 1300 | }, |
1301 | { | 1301 | { |
1302 | "defaultMessage": "!!!Account", | 1302 | "defaultMessage": "!!!Your workspaces", |
1303 | "end": { | 1303 | "end": { |
1304 | "column": 3, | 1304 | "column": 3, |
1305 | "line": 20 | 1305 | "line": 20 |
1306 | }, | 1306 | }, |
1307 | "file": "src/components/settings/navigation/SettingsNavigation.js", | 1307 | "file": "src/components/settings/navigation/SettingsNavigation.js", |
1308 | "id": "settings.navigation.yourWorkspaces", | ||
1309 | "start": { | ||
1310 | "column": 18, | ||
1311 | "line": 17 | ||
1312 | } | ||
1313 | }, | ||
1314 | { | ||
1315 | "defaultMessage": "!!!Account", | ||
1316 | "end": { | ||
1317 | "column": 3, | ||
1318 | "line": 24 | ||
1319 | }, | ||
1320 | "file": "src/components/settings/navigation/SettingsNavigation.js", | ||
1308 | "id": "settings.navigation.account", | 1321 | "id": "settings.navigation.account", |
1309 | "start": { | 1322 | "start": { |
1310 | "column": 11, | 1323 | "column": 11, |
1311 | "line": 17 | 1324 | "line": 21 |
1312 | } | 1325 | } |
1313 | }, | 1326 | }, |
1314 | { | 1327 | { |
1315 | "defaultMessage": "!!!Settings", | 1328 | "defaultMessage": "!!!Settings", |
1316 | "end": { | 1329 | "end": { |
1317 | "column": 3, | 1330 | "column": 3, |
1318 | "line": 24 | 1331 | "line": 28 |
1319 | }, | 1332 | }, |
1320 | "file": "src/components/settings/navigation/SettingsNavigation.js", | 1333 | "file": "src/components/settings/navigation/SettingsNavigation.js", |
1321 | "id": "settings.navigation.settings", | 1334 | "id": "settings.navigation.settings", |
1322 | "start": { | 1335 | "start": { |
1323 | "column": 12, | 1336 | "column": 12, |
1324 | "line": 21 | 1337 | "line": 25 |
1325 | } | 1338 | } |
1326 | }, | 1339 | }, |
1327 | { | 1340 | { |
1328 | "defaultMessage": "!!!Invite Friends", | 1341 | "defaultMessage": "!!!Invite Friends", |
1329 | "end": { | 1342 | "end": { |
1330 | "column": 3, | 1343 | "column": 3, |
1331 | "line": 28 | 1344 | "line": 32 |
1332 | }, | 1345 | }, |
1333 | "file": "src/components/settings/navigation/SettingsNavigation.js", | 1346 | "file": "src/components/settings/navigation/SettingsNavigation.js", |
1334 | "id": "settings.navigation.inviteFriends", | 1347 | "id": "settings.navigation.inviteFriends", |
1335 | "start": { | 1348 | "start": { |
1336 | "column": 17, | 1349 | "column": 17, |
1337 | "line": 25 | 1350 | "line": 29 |
1338 | } | 1351 | } |
1339 | }, | 1352 | }, |
1340 | { | 1353 | { |
1341 | "defaultMessage": "!!!Logout", | 1354 | "defaultMessage": "!!!Logout", |
1342 | "end": { | 1355 | "end": { |
1343 | "column": 3, | 1356 | "column": 3, |
1344 | "line": 32 | 1357 | "line": 36 |
1345 | }, | 1358 | }, |
1346 | "file": "src/components/settings/navigation/SettingsNavigation.js", | 1359 | "file": "src/components/settings/navigation/SettingsNavigation.js", |
1347 | "id": "settings.navigation.logout", | 1360 | "id": "settings.navigation.logout", |
1348 | "start": { | 1361 | "start": { |
1349 | "column": 10, | 1362 | "column": 10, |
1350 | "line": 29 | 1363 | "line": 33 |
1351 | } | 1364 | } |
1352 | } | 1365 | } |
1353 | ], | 1366 | ], |
@@ -3165,6 +3178,138 @@ | |||
3165 | { | 3178 | { |
3166 | "descriptors": [ | 3179 | "descriptors": [ |
3167 | { | 3180 | { |
3181 | "defaultMessage": "!!!Save workspace", | ||
3182 | "end": { | ||
3183 | "column": 3, | ||
3184 | "line": 14 | ||
3185 | }, | ||
3186 | "file": "src/features/workspaces/components/CreateWorkspaceForm.js", | ||
3187 | "id": "settings.workspace.add.form.submitButton", | ||
3188 | "start": { | ||
3189 | "column": 16, | ||
3190 | "line": 11 | ||
3191 | } | ||
3192 | }, | ||
3193 | { | ||
3194 | "defaultMessage": "!!!Name", | ||
3195 | "end": { | ||
3196 | "column": 3, | ||
3197 | "line": 18 | ||
3198 | }, | ||
3199 | "file": "src/features/workspaces/components/CreateWorkspaceForm.js", | ||
3200 | "id": "settings.workspace.add.form.name", | ||
3201 | "start": { | ||
3202 | "column": 8, | ||
3203 | "line": 15 | ||
3204 | } | ||
3205 | } | ||
3206 | ], | ||
3207 | "path": "src/features/workspaces/components/CreateWorkspaceForm.json" | ||
3208 | }, | ||
3209 | { | ||
3210 | "descriptors": [ | ||
3211 | { | ||
3212 | "defaultMessage": "!!!Delete workspace", | ||
3213 | "end": { | ||
3214 | "column": 3, | ||
3215 | "line": 19 | ||
3216 | }, | ||
3217 | "file": "src/features/workspaces/components/EditWorkspaceForm.js", | ||
3218 | "id": "settings.workspace.form.buttonDelete", | ||
3219 | "start": { | ||
3220 | "column": 16, | ||
3221 | "line": 16 | ||
3222 | } | ||
3223 | }, | ||
3224 | { | ||
3225 | "defaultMessage": "!!!Save workspace", | ||
3226 | "end": { | ||
3227 | "column": 3, | ||
3228 | "line": 23 | ||
3229 | }, | ||
3230 | "file": "src/features/workspaces/components/EditWorkspaceForm.js", | ||
3231 | "id": "settings.workspace.form.buttonSave", | ||
3232 | "start": { | ||
3233 | "column": 14, | ||
3234 | "line": 20 | ||
3235 | } | ||
3236 | }, | ||
3237 | { | ||
3238 | "defaultMessage": "!!!Name", | ||
3239 | "end": { | ||
3240 | "column": 3, | ||
3241 | "line": 27 | ||
3242 | }, | ||
3243 | "file": "src/features/workspaces/components/EditWorkspaceForm.js", | ||
3244 | "id": "settings.workspace.form.name", | ||
3245 | "start": { | ||
3246 | "column": 8, | ||
3247 | "line": 24 | ||
3248 | } | ||
3249 | }, | ||
3250 | { | ||
3251 | "defaultMessage": "!!!Your workspaces", | ||
3252 | "end": { | ||
3253 | "column": 3, | ||
3254 | "line": 31 | ||
3255 | }, | ||
3256 | "file": "src/features/workspaces/components/EditWorkspaceForm.js", | ||
3257 | "id": "settings.workspace.form.yourWorkspaces", | ||
3258 | "start": { | ||
3259 | "column": 18, | ||
3260 | "line": 28 | ||
3261 | } | ||
3262 | }, | ||
3263 | { | ||
3264 | "defaultMessage": "!!!Services in this Workspace", | ||
3265 | "end": { | ||
3266 | "column": 3, | ||
3267 | "line": 35 | ||
3268 | }, | ||
3269 | "file": "src/features/workspaces/components/EditWorkspaceForm.js", | ||
3270 | "id": "settings.workspace.form.servicesInWorkspaceHeadline", | ||
3271 | "start": { | ||
3272 | "column": 31, | ||
3273 | "line": 32 | ||
3274 | } | ||
3275 | } | ||
3276 | ], | ||
3277 | "path": "src/features/workspaces/components/EditWorkspaceForm.json" | ||
3278 | }, | ||
3279 | { | ||
3280 | "descriptors": [ | ||
3281 | { | ||
3282 | "defaultMessage": "!!!Your workspaces", | ||
3283 | "end": { | ||
3284 | "column": 3, | ||
3285 | "line": 15 | ||
3286 | }, | ||
3287 | "file": "src/features/workspaces/components/WorkspacesDashboard.js", | ||
3288 | "id": "settings.workspaces.headline", | ||
3289 | "start": { | ||
3290 | "column": 12, | ||
3291 | "line": 12 | ||
3292 | } | ||
3293 | }, | ||
3294 | { | ||
3295 | "defaultMessage": "!!!You haven't added any workspaces yet.", | ||
3296 | "end": { | ||
3297 | "column": 3, | ||
3298 | "line": 19 | ||
3299 | }, | ||
3300 | "file": "src/features/workspaces/components/WorkspacesDashboard.js", | ||
3301 | "id": "settings.workspaces.noWorkspacesAdded", | ||
3302 | "start": { | ||
3303 | "column": 19, | ||
3304 | "line": 16 | ||
3305 | } | ||
3306 | } | ||
3307 | ], | ||
3308 | "path": "src/features/workspaces/components/WorkspacesDashboard.json" | ||
3309 | }, | ||
3310 | { | ||
3311 | "descriptors": [ | ||
3312 | { | ||
3168 | "defaultMessage": "!!!Field is required", | 3313 | "defaultMessage": "!!!Field is required", |
3169 | "end": { | 3314 | "end": { |
3170 | "column": 3, | 3315 | "column": 3, |
@@ -3321,611 +3466,650 @@ | |||
3321 | "defaultMessage": "!!!Edit", | 3466 | "defaultMessage": "!!!Edit", |
3322 | "end": { | 3467 | "end": { |
3323 | "column": 3, | 3468 | "column": 3, |
3324 | "line": 13 | 3469 | "line": 15 |
3325 | }, | 3470 | }, |
3326 | "file": "src/lib/Menu.js", | 3471 | "file": "src/lib/Menu.js", |
3327 | "id": "menu.edit", | 3472 | "id": "menu.edit", |
3328 | "start": { | 3473 | "start": { |
3329 | "column": 8, | 3474 | "column": 8, |
3330 | "line": 10 | 3475 | "line": 12 |
3331 | } | 3476 | } |
3332 | }, | 3477 | }, |
3333 | { | 3478 | { |
3334 | "defaultMessage": "!!!Undo", | 3479 | "defaultMessage": "!!!Undo", |
3335 | "end": { | 3480 | "end": { |
3336 | "column": 3, | 3481 | "column": 3, |
3337 | "line": 17 | 3482 | "line": 19 |
3338 | }, | 3483 | }, |
3339 | "file": "src/lib/Menu.js", | 3484 | "file": "src/lib/Menu.js", |
3340 | "id": "menu.edit.undo", | 3485 | "id": "menu.edit.undo", |
3341 | "start": { | 3486 | "start": { |
3342 | "column": 8, | 3487 | "column": 8, |
3343 | "line": 14 | 3488 | "line": 16 |
3344 | } | 3489 | } |
3345 | }, | 3490 | }, |
3346 | { | 3491 | { |
3347 | "defaultMessage": "!!!Redo", | 3492 | "defaultMessage": "!!!Redo", |
3348 | "end": { | 3493 | "end": { |
3349 | "column": 3, | 3494 | "column": 3, |
3350 | "line": 21 | 3495 | "line": 23 |
3351 | }, | 3496 | }, |
3352 | "file": "src/lib/Menu.js", | 3497 | "file": "src/lib/Menu.js", |
3353 | "id": "menu.edit.redo", | 3498 | "id": "menu.edit.redo", |
3354 | "start": { | 3499 | "start": { |
3355 | "column": 8, | 3500 | "column": 8, |
3356 | "line": 18 | 3501 | "line": 20 |
3357 | } | 3502 | } |
3358 | }, | 3503 | }, |
3359 | { | 3504 | { |
3360 | "defaultMessage": "!!!Cut", | 3505 | "defaultMessage": "!!!Cut", |
3361 | "end": { | 3506 | "end": { |
3362 | "column": 3, | 3507 | "column": 3, |
3363 | "line": 25 | 3508 | "line": 27 |
3364 | }, | 3509 | }, |
3365 | "file": "src/lib/Menu.js", | 3510 | "file": "src/lib/Menu.js", |
3366 | "id": "menu.edit.cut", | 3511 | "id": "menu.edit.cut", |
3367 | "start": { | 3512 | "start": { |
3368 | "column": 7, | 3513 | "column": 7, |
3369 | "line": 22 | 3514 | "line": 24 |
3370 | } | 3515 | } |
3371 | }, | 3516 | }, |
3372 | { | 3517 | { |
3373 | "defaultMessage": "!!!Copy", | 3518 | "defaultMessage": "!!!Copy", |
3374 | "end": { | 3519 | "end": { |
3375 | "column": 3, | 3520 | "column": 3, |
3376 | "line": 29 | 3521 | "line": 31 |
3377 | }, | 3522 | }, |
3378 | "file": "src/lib/Menu.js", | 3523 | "file": "src/lib/Menu.js", |
3379 | "id": "menu.edit.copy", | 3524 | "id": "menu.edit.copy", |
3380 | "start": { | 3525 | "start": { |
3381 | "column": 8, | 3526 | "column": 8, |
3382 | "line": 26 | 3527 | "line": 28 |
3383 | } | 3528 | } |
3384 | }, | 3529 | }, |
3385 | { | 3530 | { |
3386 | "defaultMessage": "!!!Paste", | 3531 | "defaultMessage": "!!!Paste", |
3387 | "end": { | 3532 | "end": { |
3388 | "column": 3, | 3533 | "column": 3, |
3389 | "line": 33 | 3534 | "line": 35 |
3390 | }, | 3535 | }, |
3391 | "file": "src/lib/Menu.js", | 3536 | "file": "src/lib/Menu.js", |
3392 | "id": "menu.edit.paste", | 3537 | "id": "menu.edit.paste", |
3393 | "start": { | 3538 | "start": { |
3394 | "column": 9, | 3539 | "column": 9, |
3395 | "line": 30 | 3540 | "line": 32 |
3396 | } | 3541 | } |
3397 | }, | 3542 | }, |
3398 | { | 3543 | { |
3399 | "defaultMessage": "!!!Paste And Match Style", | 3544 | "defaultMessage": "!!!Paste And Match Style", |
3400 | "end": { | 3545 | "end": { |
3401 | "column": 3, | 3546 | "column": 3, |
3402 | "line": 37 | 3547 | "line": 39 |
3403 | }, | 3548 | }, |
3404 | "file": "src/lib/Menu.js", | 3549 | "file": "src/lib/Menu.js", |
3405 | "id": "menu.edit.pasteAndMatchStyle", | 3550 | "id": "menu.edit.pasteAndMatchStyle", |
3406 | "start": { | 3551 | "start": { |
3407 | "column": 22, | 3552 | "column": 22, |
3408 | "line": 34 | 3553 | "line": 36 |
3409 | } | 3554 | } |
3410 | }, | 3555 | }, |
3411 | { | 3556 | { |
3412 | "defaultMessage": "!!!Delete", | 3557 | "defaultMessage": "!!!Delete", |
3413 | "end": { | 3558 | "end": { |
3414 | "column": 3, | 3559 | "column": 3, |
3415 | "line": 41 | 3560 | "line": 43 |
3416 | }, | 3561 | }, |
3417 | "file": "src/lib/Menu.js", | 3562 | "file": "src/lib/Menu.js", |
3418 | "id": "menu.edit.delete", | 3563 | "id": "menu.edit.delete", |
3419 | "start": { | 3564 | "start": { |
3420 | "column": 10, | 3565 | "column": 10, |
3421 | "line": 38 | 3566 | "line": 40 |
3422 | } | 3567 | } |
3423 | }, | 3568 | }, |
3424 | { | 3569 | { |
3425 | "defaultMessage": "!!!Select All", | 3570 | "defaultMessage": "!!!Select All", |
3426 | "end": { | 3571 | "end": { |
3427 | "column": 3, | 3572 | "column": 3, |
3428 | "line": 45 | 3573 | "line": 47 |
3429 | }, | 3574 | }, |
3430 | "file": "src/lib/Menu.js", | 3575 | "file": "src/lib/Menu.js", |
3431 | "id": "menu.edit.selectAll", | 3576 | "id": "menu.edit.selectAll", |
3432 | "start": { | 3577 | "start": { |
3433 | "column": 13, | 3578 | "column": 13, |
3434 | "line": 42 | 3579 | "line": 44 |
3435 | } | 3580 | } |
3436 | }, | 3581 | }, |
3437 | { | 3582 | { |
3438 | "defaultMessage": "!!!Speech", | 3583 | "defaultMessage": "!!!Speech", |
3439 | "end": { | 3584 | "end": { |
3440 | "column": 3, | 3585 | "column": 3, |
3441 | "line": 49 | 3586 | "line": 51 |
3442 | }, | 3587 | }, |
3443 | "file": "src/lib/Menu.js", | 3588 | "file": "src/lib/Menu.js", |
3444 | "id": "menu.edit.speech", | 3589 | "id": "menu.edit.speech", |
3445 | "start": { | 3590 | "start": { |
3446 | "column": 10, | 3591 | "column": 10, |
3447 | "line": 46 | 3592 | "line": 48 |
3448 | } | 3593 | } |
3449 | }, | 3594 | }, |
3450 | { | 3595 | { |
3451 | "defaultMessage": "!!!Start Speaking", | 3596 | "defaultMessage": "!!!Start Speaking", |
3452 | "end": { | 3597 | "end": { |
3453 | "column": 3, | 3598 | "column": 3, |
3454 | "line": 53 | 3599 | "line": 55 |
3455 | }, | 3600 | }, |
3456 | "file": "src/lib/Menu.js", | 3601 | "file": "src/lib/Menu.js", |
3457 | "id": "menu.edit.startSpeaking", | 3602 | "id": "menu.edit.startSpeaking", |
3458 | "start": { | 3603 | "start": { |
3459 | "column": 17, | 3604 | "column": 17, |
3460 | "line": 50 | 3605 | "line": 52 |
3461 | } | 3606 | } |
3462 | }, | 3607 | }, |
3463 | { | 3608 | { |
3464 | "defaultMessage": "!!!Stop Speaking", | 3609 | "defaultMessage": "!!!Stop Speaking", |
3465 | "end": { | 3610 | "end": { |
3466 | "column": 3, | 3611 | "column": 3, |
3467 | "line": 57 | 3612 | "line": 59 |
3468 | }, | 3613 | }, |
3469 | "file": "src/lib/Menu.js", | 3614 | "file": "src/lib/Menu.js", |
3470 | "id": "menu.edit.stopSpeaking", | 3615 | "id": "menu.edit.stopSpeaking", |
3471 | "start": { | 3616 | "start": { |
3472 | "column": 16, | 3617 | "column": 16, |
3473 | "line": 54 | 3618 | "line": 56 |
3474 | } | 3619 | } |
3475 | }, | 3620 | }, |
3476 | { | 3621 | { |
3477 | "defaultMessage": "!!!Start Dictation", | 3622 | "defaultMessage": "!!!Start Dictation", |
3478 | "end": { | 3623 | "end": { |
3479 | "column": 3, | 3624 | "column": 3, |
3480 | "line": 61 | 3625 | "line": 63 |
3481 | }, | 3626 | }, |
3482 | "file": "src/lib/Menu.js", | 3627 | "file": "src/lib/Menu.js", |
3483 | "id": "menu.edit.startDictation", | 3628 | "id": "menu.edit.startDictation", |
3484 | "start": { | 3629 | "start": { |
3485 | "column": 18, | 3630 | "column": 18, |
3486 | "line": 58 | 3631 | "line": 60 |
3487 | } | 3632 | } |
3488 | }, | 3633 | }, |
3489 | { | 3634 | { |
3490 | "defaultMessage": "!!!Emoji & Symbols", | 3635 | "defaultMessage": "!!!Emoji & Symbols", |
3491 | "end": { | 3636 | "end": { |
3492 | "column": 3, | 3637 | "column": 3, |
3493 | "line": 65 | 3638 | "line": 67 |
3494 | }, | 3639 | }, |
3495 | "file": "src/lib/Menu.js", | 3640 | "file": "src/lib/Menu.js", |
3496 | "id": "menu.edit.emojiSymbols", | 3641 | "id": "menu.edit.emojiSymbols", |
3497 | "start": { | 3642 | "start": { |
3498 | "column": 16, | 3643 | "column": 16, |
3499 | "line": 62 | 3644 | "line": 64 |
3500 | } | 3645 | } |
3501 | }, | 3646 | }, |
3502 | { | 3647 | { |
3503 | "defaultMessage": "!!!Actual Size", | 3648 | "defaultMessage": "!!!Actual Size", |
3504 | "end": { | 3649 | "end": { |
3505 | "column": 3, | 3650 | "column": 3, |
3506 | "line": 69 | 3651 | "line": 71 |
3507 | }, | 3652 | }, |
3508 | "file": "src/lib/Menu.js", | 3653 | "file": "src/lib/Menu.js", |
3509 | "id": "menu.view.resetZoom", | 3654 | "id": "menu.view.resetZoom", |
3510 | "start": { | 3655 | "start": { |
3511 | "column": 13, | 3656 | "column": 13, |
3512 | "line": 66 | 3657 | "line": 68 |
3513 | } | 3658 | } |
3514 | }, | 3659 | }, |
3515 | { | 3660 | { |
3516 | "defaultMessage": "!!!Zoom In", | 3661 | "defaultMessage": "!!!Zoom In", |
3517 | "end": { | 3662 | "end": { |
3518 | "column": 3, | 3663 | "column": 3, |
3519 | "line": 73 | 3664 | "line": 75 |
3520 | }, | 3665 | }, |
3521 | "file": "src/lib/Menu.js", | 3666 | "file": "src/lib/Menu.js", |
3522 | "id": "menu.view.zoomIn", | 3667 | "id": "menu.view.zoomIn", |
3523 | "start": { | 3668 | "start": { |
3524 | "column": 10, | 3669 | "column": 10, |
3525 | "line": 70 | 3670 | "line": 72 |
3526 | } | 3671 | } |
3527 | }, | 3672 | }, |
3528 | { | 3673 | { |
3529 | "defaultMessage": "!!!Zoom Out", | 3674 | "defaultMessage": "!!!Zoom Out", |
3530 | "end": { | 3675 | "end": { |
3531 | "column": 3, | 3676 | "column": 3, |
3532 | "line": 77 | 3677 | "line": 79 |
3533 | }, | 3678 | }, |
3534 | "file": "src/lib/Menu.js", | 3679 | "file": "src/lib/Menu.js", |
3535 | "id": "menu.view.zoomOut", | 3680 | "id": "menu.view.zoomOut", |
3536 | "start": { | 3681 | "start": { |
3537 | "column": 11, | 3682 | "column": 11, |
3538 | "line": 74 | 3683 | "line": 76 |
3539 | } | 3684 | } |
3540 | }, | 3685 | }, |
3541 | { | 3686 | { |
3542 | "defaultMessage": "!!!Enter Full Screen", | 3687 | "defaultMessage": "!!!Enter Full Screen", |
3543 | "end": { | 3688 | "end": { |
3544 | "column": 3, | 3689 | "column": 3, |
3545 | "line": 81 | 3690 | "line": 83 |
3546 | }, | 3691 | }, |
3547 | "file": "src/lib/Menu.js", | 3692 | "file": "src/lib/Menu.js", |
3548 | "id": "menu.view.enterFullScreen", | 3693 | "id": "menu.view.enterFullScreen", |
3549 | "start": { | 3694 | "start": { |
3550 | "column": 19, | 3695 | "column": 19, |
3551 | "line": 78 | 3696 | "line": 80 |
3552 | } | 3697 | } |
3553 | }, | 3698 | }, |
3554 | { | 3699 | { |
3555 | "defaultMessage": "!!!Exit Full Screen", | 3700 | "defaultMessage": "!!!Exit Full Screen", |
3556 | "end": { | 3701 | "end": { |
3557 | "column": 3, | 3702 | "column": 3, |
3558 | "line": 85 | 3703 | "line": 87 |
3559 | }, | 3704 | }, |
3560 | "file": "src/lib/Menu.js", | 3705 | "file": "src/lib/Menu.js", |
3561 | "id": "menu.view.exitFullScreen", | 3706 | "id": "menu.view.exitFullScreen", |
3562 | "start": { | 3707 | "start": { |
3563 | "column": 18, | 3708 | "column": 18, |
3564 | "line": 82 | 3709 | "line": 84 |
3565 | } | 3710 | } |
3566 | }, | 3711 | }, |
3567 | { | 3712 | { |
3568 | "defaultMessage": "!!!Toggle Full Screen", | 3713 | "defaultMessage": "!!!Toggle Full Screen", |
3569 | "end": { | 3714 | "end": { |
3570 | "column": 3, | 3715 | "column": 3, |
3571 | "line": 89 | 3716 | "line": 91 |
3572 | }, | 3717 | }, |
3573 | "file": "src/lib/Menu.js", | 3718 | "file": "src/lib/Menu.js", |
3574 | "id": "menu.view.toggleFullScreen", | 3719 | "id": "menu.view.toggleFullScreen", |
3575 | "start": { | 3720 | "start": { |
3576 | "column": 20, | 3721 | "column": 20, |
3577 | "line": 86 | 3722 | "line": 88 |
3578 | } | 3723 | } |
3579 | }, | 3724 | }, |
3580 | { | 3725 | { |
3581 | "defaultMessage": "!!!Toggle Developer Tools", | 3726 | "defaultMessage": "!!!Toggle Developer Tools", |
3582 | "end": { | 3727 | "end": { |
3583 | "column": 3, | 3728 | "column": 3, |
3584 | "line": 93 | 3729 | "line": 95 |
3585 | }, | 3730 | }, |
3586 | "file": "src/lib/Menu.js", | 3731 | "file": "src/lib/Menu.js", |
3587 | "id": "menu.view.toggleDevTools", | 3732 | "id": "menu.view.toggleDevTools", |
3588 | "start": { | 3733 | "start": { |
3589 | "column": 18, | 3734 | "column": 18, |
3590 | "line": 90 | 3735 | "line": 92 |
3591 | } | 3736 | } |
3592 | }, | 3737 | }, |
3593 | { | 3738 | { |
3594 | "defaultMessage": "!!!Toggle Service Developer Tools", | 3739 | "defaultMessage": "!!!Toggle Service Developer Tools", |
3595 | "end": { | 3740 | "end": { |
3596 | "column": 3, | 3741 | "column": 3, |
3597 | "line": 97 | 3742 | "line": 99 |
3598 | }, | 3743 | }, |
3599 | "file": "src/lib/Menu.js", | 3744 | "file": "src/lib/Menu.js", |
3600 | "id": "menu.view.toggleServiceDevTools", | 3745 | "id": "menu.view.toggleServiceDevTools", |
3601 | "start": { | 3746 | "start": { |
3602 | "column": 25, | 3747 | "column": 25, |
3603 | "line": 94 | 3748 | "line": 96 |
3604 | } | 3749 | } |
3605 | }, | 3750 | }, |
3606 | { | 3751 | { |
3607 | "defaultMessage": "!!!Reload Service", | 3752 | "defaultMessage": "!!!Reload Service", |
3608 | "end": { | 3753 | "end": { |
3609 | "column": 3, | 3754 | "column": 3, |
3610 | "line": 101 | 3755 | "line": 103 |
3611 | }, | 3756 | }, |
3612 | "file": "src/lib/Menu.js", | 3757 | "file": "src/lib/Menu.js", |
3613 | "id": "menu.view.reloadService", | 3758 | "id": "menu.view.reloadService", |
3614 | "start": { | 3759 | "start": { |
3615 | "column": 17, | 3760 | "column": 17, |
3616 | "line": 98 | 3761 | "line": 100 |
3617 | } | 3762 | } |
3618 | }, | 3763 | }, |
3619 | { | 3764 | { |
3620 | "defaultMessage": "!!!Reload Franz", | 3765 | "defaultMessage": "!!!Reload Franz", |
3621 | "end": { | 3766 | "end": { |
3622 | "column": 3, | 3767 | "column": 3, |
3623 | "line": 105 | 3768 | "line": 107 |
3624 | }, | 3769 | }, |
3625 | "file": "src/lib/Menu.js", | 3770 | "file": "src/lib/Menu.js", |
3626 | "id": "menu.view.reloadFranz", | 3771 | "id": "menu.view.reloadFranz", |
3627 | "start": { | 3772 | "start": { |
3628 | "column": 15, | 3773 | "column": 15, |
3629 | "line": 102 | 3774 | "line": 104 |
3630 | } | 3775 | } |
3631 | }, | 3776 | }, |
3632 | { | 3777 | { |
3633 | "defaultMessage": "!!!Minimize", | 3778 | "defaultMessage": "!!!Minimize", |
3634 | "end": { | 3779 | "end": { |
3635 | "column": 3, | 3780 | "column": 3, |
3636 | "line": 109 | 3781 | "line": 111 |
3637 | }, | 3782 | }, |
3638 | "file": "src/lib/Menu.js", | 3783 | "file": "src/lib/Menu.js", |
3639 | "id": "menu.window.minimize", | 3784 | "id": "menu.window.minimize", |
3640 | "start": { | 3785 | "start": { |
3641 | "column": 12, | 3786 | "column": 12, |
3642 | "line": 106 | 3787 | "line": 108 |
3643 | } | 3788 | } |
3644 | }, | 3789 | }, |
3645 | { | 3790 | { |
3646 | "defaultMessage": "!!!Close", | 3791 | "defaultMessage": "!!!Close", |
3647 | "end": { | 3792 | "end": { |
3648 | "column": 3, | 3793 | "column": 3, |
3649 | "line": 113 | 3794 | "line": 115 |
3650 | }, | 3795 | }, |
3651 | "file": "src/lib/Menu.js", | 3796 | "file": "src/lib/Menu.js", |
3652 | "id": "menu.window.close", | 3797 | "id": "menu.window.close", |
3653 | "start": { | 3798 | "start": { |
3654 | "column": 9, | 3799 | "column": 9, |
3655 | "line": 110 | 3800 | "line": 112 |
3656 | } | 3801 | } |
3657 | }, | 3802 | }, |
3658 | { | 3803 | { |
3659 | "defaultMessage": "!!!Learn More", | 3804 | "defaultMessage": "!!!Learn More", |
3660 | "end": { | 3805 | "end": { |
3661 | "column": 3, | 3806 | "column": 3, |
3662 | "line": 117 | 3807 | "line": 119 |
3663 | }, | 3808 | }, |
3664 | "file": "src/lib/Menu.js", | 3809 | "file": "src/lib/Menu.js", |
3665 | "id": "menu.help.learnMore", | 3810 | "id": "menu.help.learnMore", |
3666 | "start": { | 3811 | "start": { |
3667 | "column": 13, | 3812 | "column": 13, |
3668 | "line": 114 | 3813 | "line": 116 |
3669 | } | 3814 | } |
3670 | }, | 3815 | }, |
3671 | { | 3816 | { |
3672 | "defaultMessage": "!!!Changelog", | 3817 | "defaultMessage": "!!!Changelog", |
3673 | "end": { | 3818 | "end": { |
3674 | "column": 3, | 3819 | "column": 3, |
3675 | "line": 121 | 3820 | "line": 123 |
3676 | }, | 3821 | }, |
3677 | "file": "src/lib/Menu.js", | 3822 | "file": "src/lib/Menu.js", |
3678 | "id": "menu.help.changelog", | 3823 | "id": "menu.help.changelog", |
3679 | "start": { | 3824 | "start": { |
3680 | "column": 13, | 3825 | "column": 13, |
3681 | "line": 118 | 3826 | "line": 120 |
3682 | } | 3827 | } |
3683 | }, | 3828 | }, |
3684 | { | 3829 | { |
3685 | "defaultMessage": "!!!Support", | 3830 | "defaultMessage": "!!!Support", |
3686 | "end": { | 3831 | "end": { |
3687 | "column": 3, | 3832 | "column": 3, |
3688 | "line": 125 | 3833 | "line": 127 |
3689 | }, | 3834 | }, |
3690 | "file": "src/lib/Menu.js", | 3835 | "file": "src/lib/Menu.js", |
3691 | "id": "menu.help.support", | 3836 | "id": "menu.help.support", |
3692 | "start": { | 3837 | "start": { |
3693 | "column": 11, | 3838 | "column": 11, |
3694 | "line": 122 | 3839 | "line": 124 |
3695 | } | 3840 | } |
3696 | }, | 3841 | }, |
3697 | { | 3842 | { |
3698 | "defaultMessage": "!!!Terms of Service", | 3843 | "defaultMessage": "!!!Terms of Service", |
3699 | "end": { | 3844 | "end": { |
3700 | "column": 3, | 3845 | "column": 3, |
3701 | "line": 129 | 3846 | "line": 131 |
3702 | }, | 3847 | }, |
3703 | "file": "src/lib/Menu.js", | 3848 | "file": "src/lib/Menu.js", |
3704 | "id": "menu.help.tos", | 3849 | "id": "menu.help.tos", |
3705 | "start": { | 3850 | "start": { |
3706 | "column": 7, | 3851 | "column": 7, |
3707 | "line": 126 | 3852 | "line": 128 |
3708 | } | 3853 | } |
3709 | }, | 3854 | }, |
3710 | { | 3855 | { |
3711 | "defaultMessage": "!!!Privacy Statement", | 3856 | "defaultMessage": "!!!Privacy Statement", |
3712 | "end": { | 3857 | "end": { |
3713 | "column": 3, | 3858 | "column": 3, |
3714 | "line": 133 | 3859 | "line": 135 |
3715 | }, | 3860 | }, |
3716 | "file": "src/lib/Menu.js", | 3861 | "file": "src/lib/Menu.js", |
3717 | "id": "menu.help.privacy", | 3862 | "id": "menu.help.privacy", |
3718 | "start": { | 3863 | "start": { |
3719 | "column": 11, | 3864 | "column": 11, |
3720 | "line": 130 | 3865 | "line": 132 |
3721 | } | 3866 | } |
3722 | }, | 3867 | }, |
3723 | { | 3868 | { |
3724 | "defaultMessage": "!!!File", | 3869 | "defaultMessage": "!!!File", |
3725 | "end": { | 3870 | "end": { |
3726 | "column": 3, | 3871 | "column": 3, |
3727 | "line": 137 | 3872 | "line": 139 |
3728 | }, | 3873 | }, |
3729 | "file": "src/lib/Menu.js", | 3874 | "file": "src/lib/Menu.js", |
3730 | "id": "menu.file", | 3875 | "id": "menu.file", |
3731 | "start": { | 3876 | "start": { |
3732 | "column": 8, | 3877 | "column": 8, |
3733 | "line": 134 | 3878 | "line": 136 |
3734 | } | 3879 | } |
3735 | }, | 3880 | }, |
3736 | { | 3881 | { |
3737 | "defaultMessage": "!!!View", | 3882 | "defaultMessage": "!!!View", |
3738 | "end": { | 3883 | "end": { |
3739 | "column": 3, | 3884 | "column": 3, |
3740 | "line": 141 | 3885 | "line": 143 |
3741 | }, | 3886 | }, |
3742 | "file": "src/lib/Menu.js", | 3887 | "file": "src/lib/Menu.js", |
3743 | "id": "menu.view", | 3888 | "id": "menu.view", |
3744 | "start": { | 3889 | "start": { |
3745 | "column": 8, | 3890 | "column": 8, |
3746 | "line": 138 | 3891 | "line": 140 |
3747 | } | 3892 | } |
3748 | }, | 3893 | }, |
3749 | { | 3894 | { |
3750 | "defaultMessage": "!!!Services", | 3895 | "defaultMessage": "!!!Services", |
3751 | "end": { | 3896 | "end": { |
3752 | "column": 3, | 3897 | "column": 3, |
3753 | "line": 145 | 3898 | "line": 147 |
3754 | }, | 3899 | }, |
3755 | "file": "src/lib/Menu.js", | 3900 | "file": "src/lib/Menu.js", |
3756 | "id": "menu.services", | 3901 | "id": "menu.services", |
3757 | "start": { | 3902 | "start": { |
3758 | "column": 12, | 3903 | "column": 12, |
3759 | "line": 142 | 3904 | "line": 144 |
3760 | } | 3905 | } |
3761 | }, | 3906 | }, |
3762 | { | 3907 | { |
3763 | "defaultMessage": "!!!Window", | 3908 | "defaultMessage": "!!!Window", |
3764 | "end": { | 3909 | "end": { |
3765 | "column": 3, | 3910 | "column": 3, |
3766 | "line": 149 | 3911 | "line": 151 |
3767 | }, | 3912 | }, |
3768 | "file": "src/lib/Menu.js", | 3913 | "file": "src/lib/Menu.js", |
3769 | "id": "menu.window", | 3914 | "id": "menu.window", |
3770 | "start": { | 3915 | "start": { |
3771 | "column": 10, | 3916 | "column": 10, |
3772 | "line": 146 | 3917 | "line": 148 |
3773 | } | 3918 | } |
3774 | }, | 3919 | }, |
3775 | { | 3920 | { |
3776 | "defaultMessage": "!!!Help", | 3921 | "defaultMessage": "!!!Help", |
3777 | "end": { | 3922 | "end": { |
3778 | "column": 3, | 3923 | "column": 3, |
3779 | "line": 153 | 3924 | "line": 155 |
3780 | }, | 3925 | }, |
3781 | "file": "src/lib/Menu.js", | 3926 | "file": "src/lib/Menu.js", |
3782 | "id": "menu.help", | 3927 | "id": "menu.help", |
3783 | "start": { | 3928 | "start": { |
3784 | "column": 8, | 3929 | "column": 8, |
3785 | "line": 150 | 3930 | "line": 152 |
3786 | } | 3931 | } |
3787 | }, | 3932 | }, |
3788 | { | 3933 | { |
3789 | "defaultMessage": "!!!About Franz", | 3934 | "defaultMessage": "!!!About Franz", |
3790 | "end": { | 3935 | "end": { |
3791 | "column": 3, | 3936 | "column": 3, |
3792 | "line": 157 | 3937 | "line": 159 |
3793 | }, | 3938 | }, |
3794 | "file": "src/lib/Menu.js", | 3939 | "file": "src/lib/Menu.js", |
3795 | "id": "menu.app.about", | 3940 | "id": "menu.app.about", |
3796 | "start": { | 3941 | "start": { |
3797 | "column": 9, | 3942 | "column": 9, |
3798 | "line": 154 | 3943 | "line": 156 |
3799 | } | 3944 | } |
3800 | }, | 3945 | }, |
3801 | { | 3946 | { |
3802 | "defaultMessage": "!!!Settings", | 3947 | "defaultMessage": "!!!Settings", |
3803 | "end": { | 3948 | "end": { |
3804 | "column": 3, | 3949 | "column": 3, |
3805 | "line": 161 | 3950 | "line": 163 |
3806 | }, | 3951 | }, |
3807 | "file": "src/lib/Menu.js", | 3952 | "file": "src/lib/Menu.js", |
3808 | "id": "menu.app.settings", | 3953 | "id": "menu.app.settings", |
3809 | "start": { | 3954 | "start": { |
3810 | "column": 12, | 3955 | "column": 12, |
3811 | "line": 158 | 3956 | "line": 160 |
3812 | } | 3957 | } |
3813 | }, | 3958 | }, |
3814 | { | 3959 | { |
3815 | "defaultMessage": "!!!Hide", | 3960 | "defaultMessage": "!!!Hide", |
3816 | "end": { | 3961 | "end": { |
3817 | "column": 3, | 3962 | "column": 3, |
3818 | "line": 165 | 3963 | "line": 167 |
3819 | }, | 3964 | }, |
3820 | "file": "src/lib/Menu.js", | 3965 | "file": "src/lib/Menu.js", |
3821 | "id": "menu.app.hide", | 3966 | "id": "menu.app.hide", |
3822 | "start": { | 3967 | "start": { |
3823 | "column": 8, | 3968 | "column": 8, |
3824 | "line": 162 | 3969 | "line": 164 |
3825 | } | 3970 | } |
3826 | }, | 3971 | }, |
3827 | { | 3972 | { |
3828 | "defaultMessage": "!!!Hide Others", | 3973 | "defaultMessage": "!!!Hide Others", |
3829 | "end": { | 3974 | "end": { |
3830 | "column": 3, | 3975 | "column": 3, |
3831 | "line": 169 | 3976 | "line": 171 |
3832 | }, | 3977 | }, |
3833 | "file": "src/lib/Menu.js", | 3978 | "file": "src/lib/Menu.js", |
3834 | "id": "menu.app.hideOthers", | 3979 | "id": "menu.app.hideOthers", |
3835 | "start": { | 3980 | "start": { |
3836 | "column": 14, | 3981 | "column": 14, |
3837 | "line": 166 | 3982 | "line": 168 |
3838 | } | 3983 | } |
3839 | }, | 3984 | }, |
3840 | { | 3985 | { |
3841 | "defaultMessage": "!!!Unhide", | 3986 | "defaultMessage": "!!!Unhide", |
3842 | "end": { | 3987 | "end": { |
3843 | "column": 3, | 3988 | "column": 3, |
3844 | "line": 173 | 3989 | "line": 175 |
3845 | }, | 3990 | }, |
3846 | "file": "src/lib/Menu.js", | 3991 | "file": "src/lib/Menu.js", |
3847 | "id": "menu.app.unhide", | 3992 | "id": "menu.app.unhide", |
3848 | "start": { | 3993 | "start": { |
3849 | "column": 10, | 3994 | "column": 10, |
3850 | "line": 170 | 3995 | "line": 172 |
3851 | } | 3996 | } |
3852 | }, | 3997 | }, |
3853 | { | 3998 | { |
3854 | "defaultMessage": "!!!Quit", | 3999 | "defaultMessage": "!!!Quit", |
3855 | "end": { | 4000 | "end": { |
3856 | "column": 3, | 4001 | "column": 3, |
3857 | "line": 177 | 4002 | "line": 179 |
3858 | }, | 4003 | }, |
3859 | "file": "src/lib/Menu.js", | 4004 | "file": "src/lib/Menu.js", |
3860 | "id": "menu.app.quit", | 4005 | "id": "menu.app.quit", |
3861 | "start": { | 4006 | "start": { |
3862 | "column": 8, | 4007 | "column": 8, |
3863 | "line": 174 | 4008 | "line": 176 |
3864 | } | 4009 | } |
3865 | }, | 4010 | }, |
3866 | { | 4011 | { |
3867 | "defaultMessage": "!!!Add New Service...", | 4012 | "defaultMessage": "!!!Add New Service...", |
3868 | "end": { | 4013 | "end": { |
3869 | "column": 3, | 4014 | "column": 3, |
3870 | "line": 181 | 4015 | "line": 183 |
3871 | }, | 4016 | }, |
3872 | "file": "src/lib/Menu.js", | 4017 | "file": "src/lib/Menu.js", |
3873 | "id": "menu.services.addNewService", | 4018 | "id": "menu.services.addNewService", |
3874 | "start": { | 4019 | "start": { |
3875 | "column": 17, | 4020 | "column": 17, |
3876 | "line": 178 | 4021 | "line": 180 |
4022 | } | ||
4023 | }, | ||
4024 | { | ||
4025 | "defaultMessage": "!!!Add New Workspace...", | ||
4026 | "end": { | ||
4027 | "column": 3, | ||
4028 | "line": 187 | ||
4029 | }, | ||
4030 | "file": "src/lib/Menu.js", | ||
4031 | "id": "menu.workspaces.addNewWorkspace", | ||
4032 | "start": { | ||
4033 | "column": 19, | ||
4034 | "line": 184 | ||
3877 | } | 4035 | } |
3878 | }, | 4036 | }, |
3879 | { | 4037 | { |
3880 | "defaultMessage": "!!!Activate next service...", | 4038 | "defaultMessage": "!!!Activate next service...", |
3881 | "end": { | 4039 | "end": { |
3882 | "column": 3, | 4040 | "column": 3, |
3883 | "line": 185 | 4041 | "line": 191 |
3884 | }, | 4042 | }, |
3885 | "file": "src/lib/Menu.js", | 4043 | "file": "src/lib/Menu.js", |
3886 | "id": "menu.services.setNextServiceActive", | 4044 | "id": "menu.services.setNextServiceActive", |
3887 | "start": { | 4045 | "start": { |
3888 | "column": 23, | 4046 | "column": 23, |
3889 | "line": 182 | 4047 | "line": 188 |
3890 | } | 4048 | } |
3891 | }, | 4049 | }, |
3892 | { | 4050 | { |
3893 | "defaultMessage": "!!!Activate previous service...", | 4051 | "defaultMessage": "!!!Activate previous service...", |
3894 | "end": { | 4052 | "end": { |
3895 | "column": 3, | 4053 | "column": 3, |
3896 | "line": 189 | 4054 | "line": 195 |
3897 | }, | 4055 | }, |
3898 | "file": "src/lib/Menu.js", | 4056 | "file": "src/lib/Menu.js", |
3899 | "id": "menu.services.activatePreviousService", | 4057 | "id": "menu.services.activatePreviousService", |
3900 | "start": { | 4058 | "start": { |
3901 | "column": 27, | 4059 | "column": 27, |
3902 | "line": 186 | 4060 | "line": 192 |
3903 | } | 4061 | } |
3904 | }, | 4062 | }, |
3905 | { | 4063 | { |
3906 | "defaultMessage": "!!!Disable notifications & audio", | 4064 | "defaultMessage": "!!!Disable notifications & audio", |
3907 | "end": { | 4065 | "end": { |
3908 | "column": 3, | 4066 | "column": 3, |
3909 | "line": 193 | 4067 | "line": 199 |
3910 | }, | 4068 | }, |
3911 | "file": "src/lib/Menu.js", | 4069 | "file": "src/lib/Menu.js", |
3912 | "id": "sidebar.muteApp", | 4070 | "id": "sidebar.muteApp", |
3913 | "start": { | 4071 | "start": { |
3914 | "column": 11, | 4072 | "column": 11, |
3915 | "line": 190 | 4073 | "line": 196 |
3916 | } | 4074 | } |
3917 | }, | 4075 | }, |
3918 | { | 4076 | { |
3919 | "defaultMessage": "!!!Enable notifications & audio", | 4077 | "defaultMessage": "!!!Enable notifications & audio", |
3920 | "end": { | 4078 | "end": { |
3921 | "column": 3, | 4079 | "column": 3, |
3922 | "line": 197 | 4080 | "line": 203 |
3923 | }, | 4081 | }, |
3924 | "file": "src/lib/Menu.js", | 4082 | "file": "src/lib/Menu.js", |
3925 | "id": "sidebar.unmuteApp", | 4083 | "id": "sidebar.unmuteApp", |
3926 | "start": { | 4084 | "start": { |
3927 | "column": 13, | 4085 | "column": 13, |
3928 | "line": 194 | 4086 | "line": 200 |
4087 | } | ||
4088 | }, | ||
4089 | { | ||
4090 | "defaultMessage": "!!!Workspaces", | ||
4091 | "end": { | ||
4092 | "column": 3, | ||
4093 | "line": 207 | ||
4094 | }, | ||
4095 | "file": "src/lib/Menu.js", | ||
4096 | "id": "menu.workspaces", | ||
4097 | "start": { | ||
4098 | "column": 14, | ||
4099 | "line": 204 | ||
4100 | } | ||
4101 | }, | ||
4102 | { | ||
4103 | "defaultMessage": "!!!Default", | ||
4104 | "end": { | ||
4105 | "column": 3, | ||
4106 | "line": 211 | ||
4107 | }, | ||
4108 | "file": "src/lib/Menu.js", | ||
4109 | "id": "menu.workspaces.defaultWorkspace", | ||
4110 | "start": { | ||
4111 | "column": 20, | ||
4112 | "line": 208 | ||
3929 | } | 4113 | } |
3930 | } | 4114 | } |
3931 | ], | 4115 | ], |
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 7543d38bd..1041a8b5f 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json | |||
@@ -87,6 +87,9 @@ | |||
87 | "menu.window": "Window", | 87 | "menu.window": "Window", |
88 | "menu.window.close": "Close", | 88 | "menu.window.close": "Close", |
89 | "menu.window.minimize": "Minimize", | 89 | "menu.window.minimize": "Minimize", |
90 | "menu.workspaces": "Workspaces", | ||
91 | "menu.workspaces.addNewWorkspace": "Add New Workspace...", | ||
92 | "menu.workspaces.defaultWorkspace": "All services", | ||
90 | "password.email.label": "Email address", | 93 | "password.email.label": "Email address", |
91 | "password.headline": "Reset password", | 94 | "password.headline": "Reset password", |
92 | "password.link.login": "Sign in to your account", | 95 | "password.link.login": "Sign in to your account", |
@@ -169,6 +172,7 @@ | |||
169 | "settings.navigation.logout": "Logout", | 172 | "settings.navigation.logout": "Logout", |
170 | "settings.navigation.settings": "Settings", | 173 | "settings.navigation.settings": "Settings", |
171 | "settings.navigation.yourServices": "Your services", | 174 | "settings.navigation.yourServices": "Your services", |
175 | "settings.navigation.yourWorkspaces": "Your workspaces", | ||
172 | "settings.recipes.all": "All services", | 176 | "settings.recipes.all": "All services", |
173 | "settings.recipes.dev": "Development", | 177 | "settings.recipes.dev": "Development", |
174 | "settings.recipes.headline": "Available services", | 178 | "settings.recipes.headline": "Available services", |
@@ -235,6 +239,15 @@ | |||
235 | "settings.user.form.firstname": "First Name", | 239 | "settings.user.form.firstname": "First Name", |
236 | "settings.user.form.lastname": "Last Name", | 240 | "settings.user.form.lastname": "Last Name", |
237 | "settings.user.form.newPassword": "New password", | 241 | "settings.user.form.newPassword": "New password", |
242 | "settings.workspace.add.form.name": "Name", | ||
243 | "settings.workspace.add.form.submitButton": "Save workspace", | ||
244 | "settings.workspace.form.buttonDelete": "Delete workspace", | ||
245 | "settings.workspace.form.buttonSave": "Save workspace", | ||
246 | "settings.workspace.form.name": "Name", | ||
247 | "settings.workspace.form.servicesInWorkspaceHeadline": "Services in this Workspace", | ||
248 | "settings.workspace.form.yourWorkspaces": "Your workspaces", | ||
249 | "settings.workspaces.headline": "Your workspaces", | ||
250 | "settings.workspaces.noWorkspacesAdded": "You haven't added any workspaces yet.", | ||
238 | "sidebar.addNewService": "Add new service", | 251 | "sidebar.addNewService": "Add new service", |
239 | "sidebar.muteApp": "Disable notifications & audio", | 252 | "sidebar.muteApp": "Disable notifications & audio", |
240 | "sidebar.settings": "Settings", | 253 | "sidebar.settings": "Settings", |
diff --git a/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json index 785ce9f29..4d8443b02 100644 --- a/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json +++ b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json | |||
@@ -26,15 +26,28 @@ | |||
26 | } | 26 | } |
27 | }, | 27 | }, |
28 | { | 28 | { |
29 | "id": "settings.navigation.yourWorkspaces", | ||
30 | "defaultMessage": "!!!Your workspaces", | ||
31 | "file": "src/components/settings/navigation/SettingsNavigation.js", | ||
32 | "start": { | ||
33 | "line": 17, | ||
34 | "column": 18 | ||
35 | }, | ||
36 | "end": { | ||
37 | "line": 20, | ||
38 | "column": 3 | ||
39 | } | ||
40 | }, | ||
41 | { | ||
29 | "id": "settings.navigation.account", | 42 | "id": "settings.navigation.account", |
30 | "defaultMessage": "!!!Account", | 43 | "defaultMessage": "!!!Account", |
31 | "file": "src/components/settings/navigation/SettingsNavigation.js", | 44 | "file": "src/components/settings/navigation/SettingsNavigation.js", |
32 | "start": { | 45 | "start": { |
33 | "line": 17, | 46 | "line": 21, |
34 | "column": 11 | 47 | "column": 11 |
35 | }, | 48 | }, |
36 | "end": { | 49 | "end": { |
37 | "line": 20, | 50 | "line": 24, |
38 | "column": 3 | 51 | "column": 3 |
39 | } | 52 | } |
40 | }, | 53 | }, |
@@ -43,11 +56,11 @@ | |||
43 | "defaultMessage": "!!!Settings", | 56 | "defaultMessage": "!!!Settings", |
44 | "file": "src/components/settings/navigation/SettingsNavigation.js", | 57 | "file": "src/components/settings/navigation/SettingsNavigation.js", |
45 | "start": { | 58 | "start": { |
46 | "line": 21, | 59 | "line": 25, |
47 | "column": 12 | 60 | "column": 12 |
48 | }, | 61 | }, |
49 | "end": { | 62 | "end": { |
50 | "line": 24, | 63 | "line": 28, |
51 | "column": 3 | 64 | "column": 3 |
52 | } | 65 | } |
53 | }, | 66 | }, |
@@ -56,11 +69,11 @@ | |||
56 | "defaultMessage": "!!!Invite Friends", | 69 | "defaultMessage": "!!!Invite Friends", |
57 | "file": "src/components/settings/navigation/SettingsNavigation.js", | 70 | "file": "src/components/settings/navigation/SettingsNavigation.js", |
58 | "start": { | 71 | "start": { |
59 | "line": 25, | 72 | "line": 29, |
60 | "column": 17 | 73 | "column": 17 |
61 | }, | 74 | }, |
62 | "end": { | 75 | "end": { |
63 | "line": 28, | 76 | "line": 32, |
64 | "column": 3 | 77 | "column": 3 |
65 | } | 78 | } |
66 | }, | 79 | }, |
@@ -69,11 +82,11 @@ | |||
69 | "defaultMessage": "!!!Logout", | 82 | "defaultMessage": "!!!Logout", |
70 | "file": "src/components/settings/navigation/SettingsNavigation.js", | 83 | "file": "src/components/settings/navigation/SettingsNavigation.js", |
71 | "start": { | 84 | "start": { |
72 | "line": 29, | 85 | "line": 33, |
73 | "column": 10 | 86 | "column": 10 |
74 | }, | 87 | }, |
75 | "end": { | 88 | "end": { |
76 | "line": 32, | 89 | "line": 36, |
77 | "column": 3 | 90 | "column": 3 |
78 | } | 91 | } |
79 | } | 92 | } |
diff --git a/src/i18n/messages/src/features/workspaces/components/CreateWorkspaceForm.json b/src/i18n/messages/src/features/workspaces/components/CreateWorkspaceForm.json new file mode 100644 index 000000000..1d5063a97 --- /dev/null +++ b/src/i18n/messages/src/features/workspaces/components/CreateWorkspaceForm.json | |||
@@ -0,0 +1,28 @@ | |||
1 | [ | ||
2 | { | ||
3 | "id": "settings.workspace.add.form.submitButton", | ||
4 | "defaultMessage": "!!!Save workspace", | ||
5 | "file": "src/features/workspaces/components/CreateWorkspaceForm.js", | ||
6 | "start": { | ||
7 | "line": 11, | ||
8 | "column": 16 | ||
9 | }, | ||
10 | "end": { | ||
11 | "line": 14, | ||
12 | "column": 3 | ||
13 | } | ||
14 | }, | ||
15 | { | ||
16 | "id": "settings.workspace.add.form.name", | ||
17 | "defaultMessage": "!!!Name", | ||
18 | "file": "src/features/workspaces/components/CreateWorkspaceForm.js", | ||
19 | "start": { | ||
20 | "line": 15, | ||
21 | "column": 8 | ||
22 | }, | ||
23 | "end": { | ||
24 | "line": 18, | ||
25 | "column": 3 | ||
26 | } | ||
27 | } | ||
28 | ] \ No newline at end of file | ||
diff --git a/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json b/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json new file mode 100644 index 000000000..467f49cda --- /dev/null +++ b/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json | |||
@@ -0,0 +1,67 @@ | |||
1 | [ | ||
2 | { | ||
3 | "id": "settings.workspace.form.buttonDelete", | ||
4 | "defaultMessage": "!!!Delete workspace", | ||
5 | "file": "src/features/workspaces/components/EditWorkspaceForm.js", | ||
6 | "start": { | ||
7 | "line": 16, | ||
8 | "column": 16 | ||
9 | }, | ||
10 | "end": { | ||
11 | "line": 19, | ||
12 | "column": 3 | ||
13 | } | ||
14 | }, | ||
15 | { | ||
16 | "id": "settings.workspace.form.buttonSave", | ||
17 | "defaultMessage": "!!!Save workspace", | ||
18 | "file": "src/features/workspaces/components/EditWorkspaceForm.js", | ||
19 | "start": { | ||
20 | "line": 20, | ||
21 | "column": 14 | ||
22 | }, | ||
23 | "end": { | ||
24 | "line": 23, | ||
25 | "column": 3 | ||
26 | } | ||
27 | }, | ||
28 | { | ||
29 | "id": "settings.workspace.form.name", | ||
30 | "defaultMessage": "!!!Name", | ||
31 | "file": "src/features/workspaces/components/EditWorkspaceForm.js", | ||
32 | "start": { | ||
33 | "line": 24, | ||
34 | "column": 8 | ||
35 | }, | ||
36 | "end": { | ||
37 | "line": 27, | ||
38 | "column": 3 | ||
39 | } | ||
40 | }, | ||
41 | { | ||
42 | "id": "settings.workspace.form.yourWorkspaces", | ||
43 | "defaultMessage": "!!!Your workspaces", | ||
44 | "file": "src/features/workspaces/components/EditWorkspaceForm.js", | ||
45 | "start": { | ||
46 | "line": 28, | ||
47 | "column": 18 | ||
48 | }, | ||
49 | "end": { | ||
50 | "line": 31, | ||
51 | "column": 3 | ||
52 | } | ||
53 | }, | ||
54 | { | ||
55 | "id": "settings.workspace.form.servicesInWorkspaceHeadline", | ||
56 | "defaultMessage": "!!!Services in this Workspace", | ||
57 | "file": "src/features/workspaces/components/EditWorkspaceForm.js", | ||
58 | "start": { | ||
59 | "line": 32, | ||
60 | "column": 31 | ||
61 | }, | ||
62 | "end": { | ||
63 | "line": 35, | ||
64 | "column": 3 | ||
65 | } | ||
66 | } | ||
67 | ] \ No newline at end of file | ||
diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json new file mode 100644 index 000000000..0e053a124 --- /dev/null +++ b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json | |||
@@ -0,0 +1,28 @@ | |||
1 | [ | ||
2 | { | ||
3 | "id": "settings.workspaces.headline", | ||
4 | "defaultMessage": "!!!Your workspaces", | ||
5 | "file": "src/features/workspaces/components/WorkspacesDashboard.js", | ||
6 | "start": { | ||
7 | "line": 12, | ||
8 | "column": 12 | ||
9 | }, | ||
10 | "end": { | ||
11 | "line": 15, | ||
12 | "column": 3 | ||
13 | } | ||
14 | }, | ||
15 | { | ||
16 | "id": "settings.workspaces.noWorkspacesAdded", | ||
17 | "defaultMessage": "!!!You haven't added any workspaces yet.", | ||
18 | "file": "src/features/workspaces/components/WorkspacesDashboard.js", | ||
19 | "start": { | ||
20 | "line": 16, | ||
21 | "column": 19 | ||
22 | }, | ||
23 | "end": { | ||
24 | "line": 19, | ||
25 | "column": 3 | ||
26 | } | ||
27 | } | ||
28 | ] \ No newline at end of file | ||
diff --git a/src/i18n/messages/src/lib/Menu.json b/src/i18n/messages/src/lib/Menu.json index 9314f5cce..53fa038c6 100644 --- a/src/i18n/messages/src/lib/Menu.json +++ b/src/i18n/messages/src/lib/Menu.json | |||
@@ -4,11 +4,11 @@ | |||
4 | "defaultMessage": "!!!Edit", | 4 | "defaultMessage": "!!!Edit", |
5 | "file": "src/lib/Menu.js", | 5 | "file": "src/lib/Menu.js", |
6 | "start": { | 6 | "start": { |
7 | "line": 10, | 7 | "line": 12, |
8 | "column": 8 | 8 | "column": 8 |
9 | }, | 9 | }, |
10 | "end": { | 10 | "end": { |
11 | "line": 13, | 11 | "line": 15, |
12 | "column": 3 | 12 | "column": 3 |
13 | } | 13 | } |
14 | }, | 14 | }, |
@@ -17,11 +17,11 @@ | |||
17 | "defaultMessage": "!!!Undo", | 17 | "defaultMessage": "!!!Undo", |
18 | "file": "src/lib/Menu.js", | 18 | "file": "src/lib/Menu.js", |
19 | "start": { | 19 | "start": { |
20 | "line": 14, | 20 | "line": 16, |
21 | "column": 8 | 21 | "column": 8 |
22 | }, | 22 | }, |
23 | "end": { | 23 | "end": { |
24 | "line": 17, | 24 | "line": 19, |
25 | "column": 3 | 25 | "column": 3 |
26 | } | 26 | } |
27 | }, | 27 | }, |
@@ -30,11 +30,11 @@ | |||
30 | "defaultMessage": "!!!Redo", | 30 | "defaultMessage": "!!!Redo", |
31 | "file": "src/lib/Menu.js", | 31 | "file": "src/lib/Menu.js", |
32 | "start": { | 32 | "start": { |
33 | "line": 18, | 33 | "line": 20, |
34 | "column": 8 | 34 | "column": 8 |
35 | }, | 35 | }, |
36 | "end": { | 36 | "end": { |
37 | "line": 21, | 37 | "line": 23, |
38 | "column": 3 | 38 | "column": 3 |
39 | } | 39 | } |
40 | }, | 40 | }, |
@@ -43,11 +43,11 @@ | |||
43 | "defaultMessage": "!!!Cut", | 43 | "defaultMessage": "!!!Cut", |
44 | "file": "src/lib/Menu.js", | 44 | "file": "src/lib/Menu.js", |
45 | "start": { | 45 | "start": { |
46 | "line": 22, | 46 | "line": 24, |
47 | "column": 7 | 47 | "column": 7 |
48 | }, | 48 | }, |
49 | "end": { | 49 | "end": { |
50 | "line": 25, | 50 | "line": 27, |
51 | "column": 3 | 51 | "column": 3 |
52 | } | 52 | } |
53 | }, | 53 | }, |
@@ -56,11 +56,11 @@ | |||
56 | "defaultMessage": "!!!Copy", | 56 | "defaultMessage": "!!!Copy", |
57 | "file": "src/lib/Menu.js", | 57 | "file": "src/lib/Menu.js", |
58 | "start": { | 58 | "start": { |
59 | "line": 26, | 59 | "line": 28, |
60 | "column": 8 | 60 | "column": 8 |
61 | }, | 61 | }, |
62 | "end": { | 62 | "end": { |
63 | "line": 29, | 63 | "line": 31, |
64 | "column": 3 | 64 | "column": 3 |
65 | } | 65 | } |
66 | }, | 66 | }, |
@@ -69,11 +69,11 @@ | |||
69 | "defaultMessage": "!!!Paste", | 69 | "defaultMessage": "!!!Paste", |
70 | "file": "src/lib/Menu.js", | 70 | "file": "src/lib/Menu.js", |
71 | "start": { | 71 | "start": { |
72 | "line": 30, | 72 | "line": 32, |
73 | "column": 9 | 73 | "column": 9 |
74 | }, | 74 | }, |
75 | "end": { | 75 | "end": { |
76 | "line": 33, | 76 | "line": 35, |
77 | "column": 3 | 77 | "column": 3 |
78 | } | 78 | } |
79 | }, | 79 | }, |
@@ -82,11 +82,11 @@ | |||
82 | "defaultMessage": "!!!Paste And Match Style", | 82 | "defaultMessage": "!!!Paste And Match Style", |
83 | "file": "src/lib/Menu.js", | 83 | "file": "src/lib/Menu.js", |
84 | "start": { | 84 | "start": { |
85 | "line": 34, | 85 | "line": 36, |
86 | "column": 22 | 86 | "column": 22 |
87 | }, | 87 | }, |
88 | "end": { | 88 | "end": { |
89 | "line": 37, | 89 | "line": 39, |
90 | "column": 3 | 90 | "column": 3 |
91 | } | 91 | } |
92 | }, | 92 | }, |
@@ -95,11 +95,11 @@ | |||
95 | "defaultMessage": "!!!Delete", | 95 | "defaultMessage": "!!!Delete", |
96 | "file": "src/lib/Menu.js", | 96 | "file": "src/lib/Menu.js", |
97 | "start": { | 97 | "start": { |
98 | "line": 38, | 98 | "line": 40, |
99 | "column": 10 | 99 | "column": 10 |
100 | }, | 100 | }, |
101 | "end": { | 101 | "end": { |
102 | "line": 41, | 102 | "line": 43, |
103 | "column": 3 | 103 | "column": 3 |
104 | } | 104 | } |
105 | }, | 105 | }, |
@@ -108,11 +108,11 @@ | |||
108 | "defaultMessage": "!!!Select All", | 108 | "defaultMessage": "!!!Select All", |
109 | "file": "src/lib/Menu.js", | 109 | "file": "src/lib/Menu.js", |
110 | "start": { | 110 | "start": { |
111 | "line": 42, | 111 | "line": 44, |
112 | "column": 13 | 112 | "column": 13 |
113 | }, | 113 | }, |
114 | "end": { | 114 | "end": { |
115 | "line": 45, | 115 | "line": 47, |
116 | "column": 3 | 116 | "column": 3 |
117 | } | 117 | } |
118 | }, | 118 | }, |
@@ -121,11 +121,11 @@ | |||
121 | "defaultMessage": "!!!Speech", | 121 | "defaultMessage": "!!!Speech", |
122 | "file": "src/lib/Menu.js", | 122 | "file": "src/lib/Menu.js", |
123 | "start": { | 123 | "start": { |
124 | "line": 46, | 124 | "line": 48, |
125 | "column": 10 | 125 | "column": 10 |
126 | }, | 126 | }, |
127 | "end": { | 127 | "end": { |
128 | "line": 49, | 128 | "line": 51, |
129 | "column": 3 | 129 | "column": 3 |
130 | } | 130 | } |
131 | }, | 131 | }, |
@@ -134,11 +134,11 @@ | |||
134 | "defaultMessage": "!!!Start Speaking", | 134 | "defaultMessage": "!!!Start Speaking", |
135 | "file": "src/lib/Menu.js", | 135 | "file": "src/lib/Menu.js", |
136 | "start": { | 136 | "start": { |
137 | "line": 50, | 137 | "line": 52, |
138 | "column": 17 | 138 | "column": 17 |
139 | }, | 139 | }, |
140 | "end": { | 140 | "end": { |
141 | "line": 53, | 141 | "line": 55, |
142 | "column": 3 | 142 | "column": 3 |
143 | } | 143 | } |
144 | }, | 144 | }, |
@@ -147,11 +147,11 @@ | |||
147 | "defaultMessage": "!!!Stop Speaking", | 147 | "defaultMessage": "!!!Stop Speaking", |
148 | "file": "src/lib/Menu.js", | 148 | "file": "src/lib/Menu.js", |
149 | "start": { | 149 | "start": { |
150 | "line": 54, | 150 | "line": 56, |
151 | "column": 16 | 151 | "column": 16 |
152 | }, | 152 | }, |
153 | "end": { | 153 | "end": { |
154 | "line": 57, | 154 | "line": 59, |
155 | "column": 3 | 155 | "column": 3 |
156 | } | 156 | } |
157 | }, | 157 | }, |
@@ -160,11 +160,11 @@ | |||
160 | "defaultMessage": "!!!Start Dictation", | 160 | "defaultMessage": "!!!Start Dictation", |
161 | "file": "src/lib/Menu.js", | 161 | "file": "src/lib/Menu.js", |
162 | "start": { | 162 | "start": { |
163 | "line": 58, | 163 | "line": 60, |
164 | "column": 18 | 164 | "column": 18 |
165 | }, | 165 | }, |
166 | "end": { | 166 | "end": { |
167 | "line": 61, | 167 | "line": 63, |
168 | "column": 3 | 168 | "column": 3 |
169 | } | 169 | } |
170 | }, | 170 | }, |
@@ -173,11 +173,11 @@ | |||
173 | "defaultMessage": "!!!Emoji & Symbols", | 173 | "defaultMessage": "!!!Emoji & Symbols", |
174 | "file": "src/lib/Menu.js", | 174 | "file": "src/lib/Menu.js", |
175 | "start": { | 175 | "start": { |
176 | "line": 62, | 176 | "line": 64, |
177 | "column": 16 | 177 | "column": 16 |
178 | }, | 178 | }, |
179 | "end": { | 179 | "end": { |
180 | "line": 65, | 180 | "line": 67, |
181 | "column": 3 | 181 | "column": 3 |
182 | } | 182 | } |
183 | }, | 183 | }, |
@@ -186,11 +186,11 @@ | |||
186 | "defaultMessage": "!!!Actual Size", | 186 | "defaultMessage": "!!!Actual Size", |
187 | "file": "src/lib/Menu.js", | 187 | "file": "src/lib/Menu.js", |
188 | "start": { | 188 | "start": { |
189 | "line": 66, | 189 | "line": 68, |
190 | "column": 13 | 190 | "column": 13 |
191 | }, | 191 | }, |
192 | "end": { | 192 | "end": { |
193 | "line": 69, | 193 | "line": 71, |
194 | "column": 3 | 194 | "column": 3 |
195 | } | 195 | } |
196 | }, | 196 | }, |
@@ -199,11 +199,11 @@ | |||
199 | "defaultMessage": "!!!Zoom In", | 199 | "defaultMessage": "!!!Zoom In", |
200 | "file": "src/lib/Menu.js", | 200 | "file": "src/lib/Menu.js", |
201 | "start": { | 201 | "start": { |
202 | "line": 70, | 202 | "line": 72, |
203 | "column": 10 | 203 | "column": 10 |
204 | }, | 204 | }, |
205 | "end": { | 205 | "end": { |
206 | "line": 73, | 206 | "line": 75, |
207 | "column": 3 | 207 | "column": 3 |
208 | } | 208 | } |
209 | }, | 209 | }, |
@@ -212,11 +212,11 @@ | |||
212 | "defaultMessage": "!!!Zoom Out", | 212 | "defaultMessage": "!!!Zoom Out", |
213 | "file": "src/lib/Menu.js", | 213 | "file": "src/lib/Menu.js", |
214 | "start": { | 214 | "start": { |
215 | "line": 74, | 215 | "line": 76, |
216 | "column": 11 | 216 | "column": 11 |
217 | }, | 217 | }, |
218 | "end": { | 218 | "end": { |
219 | "line": 77, | 219 | "line": 79, |
220 | "column": 3 | 220 | "column": 3 |
221 | } | 221 | } |
222 | }, | 222 | }, |
@@ -225,11 +225,11 @@ | |||
225 | "defaultMessage": "!!!Enter Full Screen", | 225 | "defaultMessage": "!!!Enter Full Screen", |
226 | "file": "src/lib/Menu.js", | 226 | "file": "src/lib/Menu.js", |
227 | "start": { | 227 | "start": { |
228 | "line": 78, | 228 | "line": 80, |
229 | "column": 19 | 229 | "column": 19 |
230 | }, | 230 | }, |
231 | "end": { | 231 | "end": { |
232 | "line": 81, | 232 | "line": 83, |
233 | "column": 3 | 233 | "column": 3 |
234 | } | 234 | } |
235 | }, | 235 | }, |
@@ -238,11 +238,11 @@ | |||
238 | "defaultMessage": "!!!Exit Full Screen", | 238 | "defaultMessage": "!!!Exit Full Screen", |
239 | "file": "src/lib/Menu.js", | 239 | "file": "src/lib/Menu.js", |
240 | "start": { | 240 | "start": { |
241 | "line": 82, | 241 | "line": 84, |
242 | "column": 18 | 242 | "column": 18 |
243 | }, | 243 | }, |
244 | "end": { | 244 | "end": { |
245 | "line": 85, | 245 | "line": 87, |
246 | "column": 3 | 246 | "column": 3 |
247 | } | 247 | } |
248 | }, | 248 | }, |
@@ -251,11 +251,11 @@ | |||
251 | "defaultMessage": "!!!Toggle Full Screen", | 251 | "defaultMessage": "!!!Toggle Full Screen", |
252 | "file": "src/lib/Menu.js", | 252 | "file": "src/lib/Menu.js", |
253 | "start": { | 253 | "start": { |
254 | "line": 86, | 254 | "line": 88, |
255 | "column": 20 | 255 | "column": 20 |
256 | }, | 256 | }, |
257 | "end": { | 257 | "end": { |
258 | "line": 89, | 258 | "line": 91, |
259 | "column": 3 | 259 | "column": 3 |
260 | } | 260 | } |
261 | }, | 261 | }, |
@@ -264,11 +264,11 @@ | |||
264 | "defaultMessage": "!!!Toggle Developer Tools", | 264 | "defaultMessage": "!!!Toggle Developer Tools", |
265 | "file": "src/lib/Menu.js", | 265 | "file": "src/lib/Menu.js", |
266 | "start": { | 266 | "start": { |
267 | "line": 90, | 267 | "line": 92, |
268 | "column": 18 | 268 | "column": 18 |
269 | }, | 269 | }, |
270 | "end": { | 270 | "end": { |
271 | "line": 93, | 271 | "line": 95, |
272 | "column": 3 | 272 | "column": 3 |
273 | } | 273 | } |
274 | }, | 274 | }, |
@@ -277,11 +277,11 @@ | |||
277 | "defaultMessage": "!!!Toggle Service Developer Tools", | 277 | "defaultMessage": "!!!Toggle Service Developer Tools", |
278 | "file": "src/lib/Menu.js", | 278 | "file": "src/lib/Menu.js", |
279 | "start": { | 279 | "start": { |
280 | "line": 94, | 280 | "line": 96, |
281 | "column": 25 | 281 | "column": 25 |
282 | }, | 282 | }, |
283 | "end": { | 283 | "end": { |
284 | "line": 97, | 284 | "line": 99, |
285 | "column": 3 | 285 | "column": 3 |
286 | } | 286 | } |
287 | }, | 287 | }, |
@@ -290,11 +290,11 @@ | |||
290 | "defaultMessage": "!!!Reload Service", | 290 | "defaultMessage": "!!!Reload Service", |
291 | "file": "src/lib/Menu.js", | 291 | "file": "src/lib/Menu.js", |
292 | "start": { | 292 | "start": { |
293 | "line": 98, | 293 | "line": 100, |
294 | "column": 17 | 294 | "column": 17 |
295 | }, | 295 | }, |
296 | "end": { | 296 | "end": { |
297 | "line": 101, | 297 | "line": 103, |
298 | "column": 3 | 298 | "column": 3 |
299 | } | 299 | } |
300 | }, | 300 | }, |
@@ -303,11 +303,11 @@ | |||
303 | "defaultMessage": "!!!Reload Franz", | 303 | "defaultMessage": "!!!Reload Franz", |
304 | "file": "src/lib/Menu.js", | 304 | "file": "src/lib/Menu.js", |
305 | "start": { | 305 | "start": { |
306 | "line": 102, | 306 | "line": 104, |
307 | "column": 15 | 307 | "column": 15 |
308 | }, | 308 | }, |
309 | "end": { | 309 | "end": { |
310 | "line": 105, | 310 | "line": 107, |
311 | "column": 3 | 311 | "column": 3 |
312 | } | 312 | } |
313 | }, | 313 | }, |
@@ -316,11 +316,11 @@ | |||
316 | "defaultMessage": "!!!Minimize", | 316 | "defaultMessage": "!!!Minimize", |
317 | "file": "src/lib/Menu.js", | 317 | "file": "src/lib/Menu.js", |
318 | "start": { | 318 | "start": { |
319 | "line": 106, | 319 | "line": 108, |
320 | "column": 12 | 320 | "column": 12 |
321 | }, | 321 | }, |
322 | "end": { | 322 | "end": { |
323 | "line": 109, | 323 | "line": 111, |
324 | "column": 3 | 324 | "column": 3 |
325 | } | 325 | } |
326 | }, | 326 | }, |
@@ -329,11 +329,11 @@ | |||
329 | "defaultMessage": "!!!Close", | 329 | "defaultMessage": "!!!Close", |
330 | "file": "src/lib/Menu.js", | 330 | "file": "src/lib/Menu.js", |
331 | "start": { | 331 | "start": { |
332 | "line": 110, | 332 | "line": 112, |
333 | "column": 9 | 333 | "column": 9 |
334 | }, | 334 | }, |
335 | "end": { | 335 | "end": { |
336 | "line": 113, | 336 | "line": 115, |
337 | "column": 3 | 337 | "column": 3 |
338 | } | 338 | } |
339 | }, | 339 | }, |
@@ -342,11 +342,11 @@ | |||
342 | "defaultMessage": "!!!Learn More", | 342 | "defaultMessage": "!!!Learn More", |
343 | "file": "src/lib/Menu.js", | 343 | "file": "src/lib/Menu.js", |
344 | "start": { | 344 | "start": { |
345 | "line": 114, | 345 | "line": 116, |
346 | "column": 13 | 346 | "column": 13 |
347 | }, | 347 | }, |
348 | "end": { | 348 | "end": { |
349 | "line": 117, | 349 | "line": 119, |
350 | "column": 3 | 350 | "column": 3 |
351 | } | 351 | } |
352 | }, | 352 | }, |
@@ -355,11 +355,11 @@ | |||
355 | "defaultMessage": "!!!Changelog", | 355 | "defaultMessage": "!!!Changelog", |
356 | "file": "src/lib/Menu.js", | 356 | "file": "src/lib/Menu.js", |
357 | "start": { | 357 | "start": { |
358 | "line": 118, | 358 | "line": 120, |
359 | "column": 13 | 359 | "column": 13 |
360 | }, | 360 | }, |
361 | "end": { | 361 | "end": { |
362 | "line": 121, | 362 | "line": 123, |
363 | "column": 3 | 363 | "column": 3 |
364 | } | 364 | } |
365 | }, | 365 | }, |
@@ -368,11 +368,11 @@ | |||
368 | "defaultMessage": "!!!Support", | 368 | "defaultMessage": "!!!Support", |
369 | "file": "src/lib/Menu.js", | 369 | "file": "src/lib/Menu.js", |
370 | "start": { | 370 | "start": { |
371 | "line": 122, | 371 | "line": 124, |
372 | "column": 11 | 372 | "column": 11 |
373 | }, | 373 | }, |
374 | "end": { | 374 | "end": { |
375 | "line": 125, | 375 | "line": 127, |
376 | "column": 3 | 376 | "column": 3 |
377 | } | 377 | } |
378 | }, | 378 | }, |
@@ -381,11 +381,11 @@ | |||
381 | "defaultMessage": "!!!Terms of Service", | 381 | "defaultMessage": "!!!Terms of Service", |
382 | "file": "src/lib/Menu.js", | 382 | "file": "src/lib/Menu.js", |
383 | "start": { | 383 | "start": { |
384 | "line": 126, | 384 | "line": 128, |
385 | "column": 7 | 385 | "column": 7 |
386 | }, | 386 | }, |
387 | "end": { | 387 | "end": { |
388 | "line": 129, | 388 | "line": 131, |
389 | "column": 3 | 389 | "column": 3 |
390 | } | 390 | } |
391 | }, | 391 | }, |
@@ -394,11 +394,11 @@ | |||
394 | "defaultMessage": "!!!Privacy Statement", | 394 | "defaultMessage": "!!!Privacy Statement", |
395 | "file": "src/lib/Menu.js", | 395 | "file": "src/lib/Menu.js", |
396 | "start": { | 396 | "start": { |
397 | "line": 130, | 397 | "line": 132, |
398 | "column": 11 | 398 | "column": 11 |
399 | }, | 399 | }, |
400 | "end": { | 400 | "end": { |
401 | "line": 133, | 401 | "line": 135, |
402 | "column": 3 | 402 | "column": 3 |
403 | } | 403 | } |
404 | }, | 404 | }, |
@@ -407,11 +407,11 @@ | |||
407 | "defaultMessage": "!!!File", | 407 | "defaultMessage": "!!!File", |
408 | "file": "src/lib/Menu.js", | 408 | "file": "src/lib/Menu.js", |
409 | "start": { | 409 | "start": { |
410 | "line": 134, | 410 | "line": 136, |
411 | "column": 8 | 411 | "column": 8 |
412 | }, | 412 | }, |
413 | "end": { | 413 | "end": { |
414 | "line": 137, | 414 | "line": 139, |
415 | "column": 3 | 415 | "column": 3 |
416 | } | 416 | } |
417 | }, | 417 | }, |
@@ -420,11 +420,11 @@ | |||
420 | "defaultMessage": "!!!View", | 420 | "defaultMessage": "!!!View", |
421 | "file": "src/lib/Menu.js", | 421 | "file": "src/lib/Menu.js", |
422 | "start": { | 422 | "start": { |
423 | "line": 138, | 423 | "line": 140, |
424 | "column": 8 | 424 | "column": 8 |
425 | }, | 425 | }, |
426 | "end": { | 426 | "end": { |
427 | "line": 141, | 427 | "line": 143, |
428 | "column": 3 | 428 | "column": 3 |
429 | } | 429 | } |
430 | }, | 430 | }, |
@@ -433,11 +433,11 @@ | |||
433 | "defaultMessage": "!!!Services", | 433 | "defaultMessage": "!!!Services", |
434 | "file": "src/lib/Menu.js", | 434 | "file": "src/lib/Menu.js", |
435 | "start": { | 435 | "start": { |
436 | "line": 142, | 436 | "line": 144, |
437 | "column": 12 | 437 | "column": 12 |
438 | }, | 438 | }, |
439 | "end": { | 439 | "end": { |
440 | "line": 145, | 440 | "line": 147, |
441 | "column": 3 | 441 | "column": 3 |
442 | } | 442 | } |
443 | }, | 443 | }, |
@@ -446,11 +446,11 @@ | |||
446 | "defaultMessage": "!!!Window", | 446 | "defaultMessage": "!!!Window", |
447 | "file": "src/lib/Menu.js", | 447 | "file": "src/lib/Menu.js", |
448 | "start": { | 448 | "start": { |
449 | "line": 146, | 449 | "line": 148, |
450 | "column": 10 | 450 | "column": 10 |
451 | }, | 451 | }, |
452 | "end": { | 452 | "end": { |
453 | "line": 149, | 453 | "line": 151, |
454 | "column": 3 | 454 | "column": 3 |
455 | } | 455 | } |
456 | }, | 456 | }, |
@@ -459,11 +459,11 @@ | |||
459 | "defaultMessage": "!!!Help", | 459 | "defaultMessage": "!!!Help", |
460 | "file": "src/lib/Menu.js", | 460 | "file": "src/lib/Menu.js", |
461 | "start": { | 461 | "start": { |
462 | "line": 150, | 462 | "line": 152, |
463 | "column": 8 | 463 | "column": 8 |
464 | }, | 464 | }, |
465 | "end": { | 465 | "end": { |
466 | "line": 153, | 466 | "line": 155, |
467 | "column": 3 | 467 | "column": 3 |
468 | } | 468 | } |
469 | }, | 469 | }, |
@@ -472,11 +472,11 @@ | |||
472 | "defaultMessage": "!!!About Franz", | 472 | "defaultMessage": "!!!About Franz", |
473 | "file": "src/lib/Menu.js", | 473 | "file": "src/lib/Menu.js", |
474 | "start": { | 474 | "start": { |
475 | "line": 154, | 475 | "line": 156, |
476 | "column": 9 | 476 | "column": 9 |
477 | }, | 477 | }, |
478 | "end": { | 478 | "end": { |
479 | "line": 157, | 479 | "line": 159, |
480 | "column": 3 | 480 | "column": 3 |
481 | } | 481 | } |
482 | }, | 482 | }, |
@@ -485,11 +485,11 @@ | |||
485 | "defaultMessage": "!!!Settings", | 485 | "defaultMessage": "!!!Settings", |
486 | "file": "src/lib/Menu.js", | 486 | "file": "src/lib/Menu.js", |
487 | "start": { | 487 | "start": { |
488 | "line": 158, | 488 | "line": 160, |
489 | "column": 12 | 489 | "column": 12 |
490 | }, | 490 | }, |
491 | "end": { | 491 | "end": { |
492 | "line": 161, | 492 | "line": 163, |
493 | "column": 3 | 493 | "column": 3 |
494 | } | 494 | } |
495 | }, | 495 | }, |
@@ -498,11 +498,11 @@ | |||
498 | "defaultMessage": "!!!Hide", | 498 | "defaultMessage": "!!!Hide", |
499 | "file": "src/lib/Menu.js", | 499 | "file": "src/lib/Menu.js", |
500 | "start": { | 500 | "start": { |
501 | "line": 162, | 501 | "line": 164, |
502 | "column": 8 | 502 | "column": 8 |
503 | }, | 503 | }, |
504 | "end": { | 504 | "end": { |
505 | "line": 165, | 505 | "line": 167, |
506 | "column": 3 | 506 | "column": 3 |
507 | } | 507 | } |
508 | }, | 508 | }, |
@@ -511,11 +511,11 @@ | |||
511 | "defaultMessage": "!!!Hide Others", | 511 | "defaultMessage": "!!!Hide Others", |
512 | "file": "src/lib/Menu.js", | 512 | "file": "src/lib/Menu.js", |
513 | "start": { | 513 | "start": { |
514 | "line": 166, | 514 | "line": 168, |
515 | "column": 14 | 515 | "column": 14 |
516 | }, | 516 | }, |
517 | "end": { | 517 | "end": { |
518 | "line": 169, | 518 | "line": 171, |
519 | "column": 3 | 519 | "column": 3 |
520 | } | 520 | } |
521 | }, | 521 | }, |
@@ -524,11 +524,11 @@ | |||
524 | "defaultMessage": "!!!Unhide", | 524 | "defaultMessage": "!!!Unhide", |
525 | "file": "src/lib/Menu.js", | 525 | "file": "src/lib/Menu.js", |
526 | "start": { | 526 | "start": { |
527 | "line": 170, | 527 | "line": 172, |
528 | "column": 10 | 528 | "column": 10 |
529 | }, | 529 | }, |
530 | "end": { | 530 | "end": { |
531 | "line": 173, | 531 | "line": 175, |
532 | "column": 3 | 532 | "column": 3 |
533 | } | 533 | } |
534 | }, | 534 | }, |
@@ -537,11 +537,11 @@ | |||
537 | "defaultMessage": "!!!Quit", | 537 | "defaultMessage": "!!!Quit", |
538 | "file": "src/lib/Menu.js", | 538 | "file": "src/lib/Menu.js", |
539 | "start": { | 539 | "start": { |
540 | "line": 174, | 540 | "line": 176, |
541 | "column": 8 | 541 | "column": 8 |
542 | }, | 542 | }, |
543 | "end": { | 543 | "end": { |
544 | "line": 177, | 544 | "line": 179, |
545 | "column": 3 | 545 | "column": 3 |
546 | } | 546 | } |
547 | }, | 547 | }, |
@@ -550,11 +550,24 @@ | |||
550 | "defaultMessage": "!!!Add New Service...", | 550 | "defaultMessage": "!!!Add New Service...", |
551 | "file": "src/lib/Menu.js", | 551 | "file": "src/lib/Menu.js", |
552 | "start": { | 552 | "start": { |
553 | "line": 178, | 553 | "line": 180, |
554 | "column": 17 | 554 | "column": 17 |
555 | }, | 555 | }, |
556 | "end": { | 556 | "end": { |
557 | "line": 181, | 557 | "line": 183, |
558 | "column": 3 | ||
559 | } | ||
560 | }, | ||
561 | { | ||
562 | "id": "menu.workspaces.addNewWorkspace", | ||
563 | "defaultMessage": "!!!Add New Workspace...", | ||
564 | "file": "src/lib/Menu.js", | ||
565 | "start": { | ||
566 | "line": 184, | ||
567 | "column": 19 | ||
568 | }, | ||
569 | "end": { | ||
570 | "line": 187, | ||
558 | "column": 3 | 571 | "column": 3 |
559 | } | 572 | } |
560 | }, | 573 | }, |
@@ -563,11 +576,11 @@ | |||
563 | "defaultMessage": "!!!Activate next service...", | 576 | "defaultMessage": "!!!Activate next service...", |
564 | "file": "src/lib/Menu.js", | 577 | "file": "src/lib/Menu.js", |
565 | "start": { | 578 | "start": { |
566 | "line": 182, | 579 | "line": 188, |
567 | "column": 23 | 580 | "column": 23 |
568 | }, | 581 | }, |
569 | "end": { | 582 | "end": { |
570 | "line": 185, | 583 | "line": 191, |
571 | "column": 3 | 584 | "column": 3 |
572 | } | 585 | } |
573 | }, | 586 | }, |
@@ -576,11 +589,11 @@ | |||
576 | "defaultMessage": "!!!Activate previous service...", | 589 | "defaultMessage": "!!!Activate previous service...", |
577 | "file": "src/lib/Menu.js", | 590 | "file": "src/lib/Menu.js", |
578 | "start": { | 591 | "start": { |
579 | "line": 186, | 592 | "line": 192, |
580 | "column": 27 | 593 | "column": 27 |
581 | }, | 594 | }, |
582 | "end": { | 595 | "end": { |
583 | "line": 189, | 596 | "line": 195, |
584 | "column": 3 | 597 | "column": 3 |
585 | } | 598 | } |
586 | }, | 599 | }, |
@@ -589,11 +602,11 @@ | |||
589 | "defaultMessage": "!!!Disable notifications & audio", | 602 | "defaultMessage": "!!!Disable notifications & audio", |
590 | "file": "src/lib/Menu.js", | 603 | "file": "src/lib/Menu.js", |
591 | "start": { | 604 | "start": { |
592 | "line": 190, | 605 | "line": 196, |
593 | "column": 11 | 606 | "column": 11 |
594 | }, | 607 | }, |
595 | "end": { | 608 | "end": { |
596 | "line": 193, | 609 | "line": 199, |
597 | "column": 3 | 610 | "column": 3 |
598 | } | 611 | } |
599 | }, | 612 | }, |
@@ -602,11 +615,37 @@ | |||
602 | "defaultMessage": "!!!Enable notifications & audio", | 615 | "defaultMessage": "!!!Enable notifications & audio", |
603 | "file": "src/lib/Menu.js", | 616 | "file": "src/lib/Menu.js", |
604 | "start": { | 617 | "start": { |
605 | "line": 194, | 618 | "line": 200, |
606 | "column": 13 | 619 | "column": 13 |
607 | }, | 620 | }, |
608 | "end": { | 621 | "end": { |
609 | "line": 197, | 622 | "line": 203, |
623 | "column": 3 | ||
624 | } | ||
625 | }, | ||
626 | { | ||
627 | "id": "menu.workspaces", | ||
628 | "defaultMessage": "!!!Workspaces", | ||
629 | "file": "src/lib/Menu.js", | ||
630 | "start": { | ||
631 | "line": 204, | ||
632 | "column": 14 | ||
633 | }, | ||
634 | "end": { | ||
635 | "line": 207, | ||
636 | "column": 3 | ||
637 | } | ||
638 | }, | ||
639 | { | ||
640 | "id": "menu.workspaces.defaultWorkspace", | ||
641 | "defaultMessage": "!!!Default", | ||
642 | "file": "src/lib/Menu.js", | ||
643 | "start": { | ||
644 | "line": 208, | ||
645 | "column": 20 | ||
646 | }, | ||
647 | "end": { | ||
648 | "line": 211, | ||
610 | "column": 3 | 649 | "column": 3 |
611 | } | 650 | } |
612 | } | 651 | } |
diff --git a/src/lib/Menu.js b/src/lib/Menu.js index 7a60c448f..b21a62b4d 100644 --- a/src/lib/Menu.js +++ b/src/lib/Menu.js | |||
@@ -3,6 +3,8 @@ import { observable, autorun } from 'mobx'; | |||
3 | import { defineMessages } from 'react-intl'; | 3 | import { defineMessages } from 'react-intl'; |
4 | 4 | ||
5 | import { isMac, ctrlKey, cmdKey } from '../environment'; | 5 | import { isMac, ctrlKey, cmdKey } from '../environment'; |
6 | import { workspacesState } from '../features/workspaces/state'; | ||
7 | import workspaceActions from '../features/workspaces/actions'; | ||
6 | 8 | ||
7 | const { app, Menu, dialog } = remote; | 9 | const { app, Menu, dialog } = remote; |
8 | 10 | ||
@@ -179,6 +181,10 @@ const menuItems = defineMessages({ | |||
179 | id: 'menu.services.addNewService', | 181 | id: 'menu.services.addNewService', |
180 | defaultMessage: '!!!Add New Service...', | 182 | defaultMessage: '!!!Add New Service...', |
181 | }, | 183 | }, |
184 | addNewWorkspace: { | ||
185 | id: 'menu.workspaces.addNewWorkspace', | ||
186 | defaultMessage: '!!!Add New Workspace...', | ||
187 | }, | ||
182 | activateNextService: { | 188 | activateNextService: { |
183 | id: 'menu.services.setNextServiceActive', | 189 | id: 'menu.services.setNextServiceActive', |
184 | defaultMessage: '!!!Activate next service...', | 190 | defaultMessage: '!!!Activate next service...', |
@@ -195,6 +201,14 @@ const menuItems = defineMessages({ | |||
195 | id: 'sidebar.unmuteApp', | 201 | id: 'sidebar.unmuteApp', |
196 | defaultMessage: '!!!Enable notifications & audio', | 202 | defaultMessage: '!!!Enable notifications & audio', |
197 | }, | 203 | }, |
204 | workspaces: { | ||
205 | id: 'menu.workspaces', | ||
206 | defaultMessage: '!!!Workspaces', | ||
207 | }, | ||
208 | defaultWorkspace: { | ||
209 | id: 'menu.workspaces.defaultWorkspace', | ||
210 | defaultMessage: '!!!Default', | ||
211 | }, | ||
198 | }); | 212 | }); |
199 | 213 | ||
200 | function getActiveWebview() { | 214 | function getActiveWebview() { |
@@ -298,6 +312,10 @@ const _templateFactory = intl => [ | |||
298 | submenu: [], | 312 | submenu: [], |
299 | }, | 313 | }, |
300 | { | 314 | { |
315 | label: intl.formatMessage(menuItems.workspaces), | ||
316 | submenu: [], | ||
317 | }, | ||
318 | { | ||
301 | label: intl.formatMessage(menuItems.window), | 319 | label: intl.formatMessage(menuItems.window), |
302 | role: 'window', | 320 | role: 'window', |
303 | submenu: [ | 321 | submenu: [ |
@@ -537,6 +555,7 @@ export default class FranzMenu { | |||
537 | _build() { | 555 | _build() { |
538 | // need to clone object so we don't modify computed (cached) object | 556 | // need to clone object so we don't modify computed (cached) object |
539 | const serviceTpl = Object.assign([], this.serviceTpl()); | 557 | const serviceTpl = Object.assign([], this.serviceTpl()); |
558 | const workspacesMenu = Object.assign([], this.workspacesMenu()); | ||
540 | 559 | ||
541 | if (window.franz === undefined) { | 560 | if (window.franz === undefined) { |
542 | return; | 561 | return; |
@@ -669,7 +688,7 @@ export default class FranzMenu { | |||
669 | }, | 688 | }, |
670 | ); | 689 | ); |
671 | 690 | ||
672 | tpl[4].submenu.unshift(about, { | 691 | tpl[5].submenu.unshift(about, { |
673 | type: 'separator', | 692 | type: 'separator', |
674 | }); | 693 | }); |
675 | } else { | 694 | } else { |
@@ -704,6 +723,8 @@ export default class FranzMenu { | |||
704 | tpl[3].submenu = serviceTpl; | 723 | tpl[3].submenu = serviceTpl; |
705 | } | 724 | } |
706 | 725 | ||
726 | tpl[4].submenu = workspacesMenu; | ||
727 | |||
707 | this.currentTemplate = tpl; | 728 | this.currentTemplate = tpl; |
708 | const menu = Menu.buildFromTemplate(tpl); | 729 | const menu = Menu.buildFromTemplate(tpl); |
709 | Menu.setApplicationMenu(menu); | 730 | Menu.setApplicationMenu(menu); |
@@ -754,6 +775,50 @@ export default class FranzMenu { | |||
754 | return menu; | 775 | return menu; |
755 | } | 776 | } |
756 | 777 | ||
778 | workspacesMenu() { | ||
779 | const { workspaces, activeWorkspace } = workspacesState; | ||
780 | const { intl } = window.franz; | ||
781 | const menu = []; | ||
782 | |||
783 | // Add new workspace item: | ||
784 | menu.push({ | ||
785 | label: intl.formatMessage(menuItems.addNewWorkspace), | ||
786 | accelerator: `${cmdKey}+Shift+N`, | ||
787 | click: () => { | ||
788 | this.actions.ui.openSettings({ path: 'workspaces' }); | ||
789 | }, | ||
790 | enabled: this.stores.user.isLoggedIn, | ||
791 | }, { | ||
792 | type: 'separator', | ||
793 | }); | ||
794 | |||
795 | // Default workspace | ||
796 | menu.push({ | ||
797 | label: intl.formatMessage(menuItems.defaultWorkspace), | ||
798 | accelerator: `${cmdKey}+Alt+1`, | ||
799 | type: 'radio', | ||
800 | checked: !activeWorkspace, | ||
801 | click: () => { | ||
802 | workspaceActions.deactivate(); | ||
803 | }, | ||
804 | }); | ||
805 | |||
806 | // Workspace items | ||
807 | if (this.stores.user.isLoggedIn) { | ||
808 | workspaces.forEach((workspace, i) => menu.push({ | ||
809 | label: workspace.name, | ||
810 | accelerator: i < 9 ? `${cmdKey}+Alt+${i + 2}` : null, | ||
811 | type: 'radio', | ||
812 | checked: activeWorkspace ? workspace.id === activeWorkspace.id : false, | ||
813 | click: () => { | ||
814 | workspaceActions.activate({ workspace }); | ||
815 | }, | ||
816 | })); | ||
817 | } | ||
818 | |||
819 | return menu; | ||
820 | } | ||
821 | |||
757 | _getServiceName(service) { | 822 | _getServiceName(service) { |
758 | if (service.name) { | 823 | if (service.name) { |
759 | return service.name; | 824 | return service.name; |
diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js index d2842083c..b7130904b 100644 --- a/src/stores/FeaturesStore.js +++ b/src/stores/FeaturesStore.js | |||
@@ -7,6 +7,7 @@ import delayApp from '../features/delayApp'; | |||
7 | import spellchecker from '../features/spellchecker'; | 7 | import spellchecker from '../features/spellchecker'; |
8 | import serviceProxy from '../features/serviceProxy'; | 8 | import serviceProxy from '../features/serviceProxy'; |
9 | import basicAuth from '../features/basicAuth'; | 9 | import basicAuth from '../features/basicAuth'; |
10 | import workspaces from '../features/workspaces'; | ||
10 | import shareFranz from '../features/shareFranz'; | 11 | import shareFranz from '../features/shareFranz'; |
11 | 12 | ||
12 | import { DEFAULT_FEATURES_CONFIG } from '../config'; | 13 | import { DEFAULT_FEATURES_CONFIG } from '../config'; |
@@ -38,7 +39,7 @@ export default class FeaturesStore extends Store { | |||
38 | 39 | ||
39 | @computed get features() { | 40 | @computed get features() { |
40 | if (this.stores.user.isLoggedIn) { | 41 | if (this.stores.user.isLoggedIn) { |
41 | return this.featuresRequest.execute().result || DEFAULT_FEATURES_CONFIG; | 42 | return Object.assign({}, DEFAULT_FEATURES_CONFIG, this.featuresRequest.execute().result); |
42 | } | 43 | } |
43 | 44 | ||
44 | return DEFAULT_FEATURES_CONFIG; | 45 | return DEFAULT_FEATURES_CONFIG; |
@@ -57,6 +58,7 @@ export default class FeaturesStore extends Store { | |||
57 | spellchecker(this.stores, this.actions); | 58 | spellchecker(this.stores, this.actions); |
58 | serviceProxy(this.stores, this.actions); | 59 | serviceProxy(this.stores, this.actions); |
59 | basicAuth(this.stores, this.actions); | 60 | basicAuth(this.stores, this.actions); |
61 | workspaces(this.stores, this.actions); | ||
60 | shareFranz(this.stores, this.actions); | 62 | shareFranz(this.stores, this.actions); |
61 | } | 63 | } |
62 | } | 64 | } |
diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js index 69e616f0c..cc8eed65b 100644 --- a/src/stores/ServicesStore.js +++ b/src/stores/ServicesStore.js | |||
@@ -12,6 +12,7 @@ import Request from './lib/Request'; | |||
12 | import CachedRequest from './lib/CachedRequest'; | 12 | import CachedRequest from './lib/CachedRequest'; |
13 | import { matchRoute } from '../helpers/routing-helpers'; | 13 | import { matchRoute } from '../helpers/routing-helpers'; |
14 | import { gaEvent } from '../lib/analytics'; | 14 | import { gaEvent } from '../lib/analytics'; |
15 | import { filterServicesByActiveWorkspace, getActiveWorkspaceServices } from '../features/workspaces'; | ||
15 | 16 | ||
16 | const debug = require('debug')('Franz:ServiceStore'); | 17 | const debug = require('debug')('Franz:ServiceStore'); |
17 | 18 | ||
@@ -99,7 +100,6 @@ export default class ServicesStore extends Store { | |||
99 | return observable(services.slice().slice().sort((a, b) => a.order - b.order)); | 100 | return observable(services.slice().slice().sort((a, b) => a.order - b.order)); |
100 | } | 101 | } |
101 | } | 102 | } |
102 | |||
103 | return []; | 103 | return []; |
104 | } | 104 | } |
105 | 105 | ||
@@ -108,13 +108,16 @@ export default class ServicesStore extends Store { | |||
108 | } | 108 | } |
109 | 109 | ||
110 | @computed get allDisplayed() { | 110 | @computed get allDisplayed() { |
111 | return this.stores.settings.all.app.showDisabledServices ? this.all : this.enabled; | 111 | const services = this.stores.settings.all.app.showDisabledServices ? this.all : this.enabled; |
112 | return filterServicesByActiveWorkspace(services); | ||
112 | } | 113 | } |
113 | 114 | ||
114 | // This is just used to avoid unnecessary rerendering of resource-heavy webviews | 115 | // This is just used to avoid unnecessary rerendering of resource-heavy webviews |
115 | @computed get allDisplayedUnordered() { | 116 | @computed get allDisplayedUnordered() { |
117 | const { showDisabledServices } = this.stores.settings.all.app; | ||
116 | const services = this.allServicesRequest.execute().result || []; | 118 | const services = this.allServicesRequest.execute().result || []; |
117 | return this.stores.settings.all.app.showDisabledServices ? services : services.filter(service => service.isEnabled); | 119 | const filteredServices = showDisabledServices ? services : services.filter(service => service.isEnabled); |
120 | return getActiveWorkspaceServices(filteredServices); | ||
118 | } | 121 | } |
119 | 122 | ||
120 | @computed get filtered() { | 123 | @computed get filtered() { |
diff --git a/src/styles/main.scss b/src/styles/main.scss index 784a04d3d..9ba7f5827 100644 --- a/src/styles/main.scss +++ b/src/styles/main.scss | |||
@@ -31,6 +31,9 @@ $mdi-font-path: '../node_modules/mdi/fonts'; | |||
31 | @import './invite.scss'; | 31 | @import './invite.scss'; |
32 | @import './title-bar.scss'; | 32 | @import './title-bar.scss'; |
33 | 33 | ||
34 | // Workspaces legacy css | ||
35 | @import '../features/workspaces/styles/workspaces-table'; | ||
36 | |||
34 | // form | 37 | // form |
35 | @import './input.scss'; | 38 | @import './input.scss'; |
36 | @import './radio.scss'; | 39 | @import './radio.scss'; |