aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/components/layout/AppLayout.js2
-rw-r--r--src/components/ui/Modal/index.js3
-rw-r--r--src/features/quickSwitch/Component.js291
-rw-r--r--src/features/quickSwitch/index.js24
-rw-r--r--src/i18n/locales/defaultMessages.json268
-rw-r--r--src/i18n/locales/en-US.json5
-rw-r--r--src/i18n/locales/ua.json2
-rw-r--r--src/i18n/locales/whitelist_en-US.json3
-rw-r--r--src/i18n/messages/src/components/layout/AppLayout.json16
-rw-r--r--src/i18n/messages/src/features/quickSwitch/Component.json28
-rw-r--r--src/i18n/messages/src/lib/Menu.json221
-rw-r--r--src/lib/Menu.js14
-rw-r--r--src/stores/FeaturesStore.js2
13 files changed, 651 insertions, 228 deletions
diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js
index e82275b9f..2b0719f92 100644
--- a/src/components/layout/AppLayout.js
+++ b/src/components/layout/AppLayout.js
@@ -8,6 +8,7 @@ import injectSheet from 'react-jss';
8import InfoBar from '../ui/InfoBar'; 8import InfoBar from '../ui/InfoBar';
9import { Component as BasicAuth } from '../../features/basicAuth'; 9import { Component as BasicAuth } from '../../features/basicAuth';
10import { Component as ShareFranz } from '../../features/shareFranz'; 10import { Component as ShareFranz } from '../../features/shareFranz';
11import { Component as QuickSwitch } from '../../features/quickSwitch';
11import ErrorBoundary from '../util/ErrorBoundary'; 12import ErrorBoundary from '../util/ErrorBoundary';
12 13
13// import globalMessages from '../../i18n/globalMessages'; 14// import globalMessages from '../../i18n/globalMessages';
@@ -185,6 +186,7 @@ class AppLayout extends Component {
185 )} 186 )}
186 <BasicAuth /> 187 <BasicAuth />
187 <ShareFranz /> 188 <ShareFranz />
189 <QuickSwitch />
188 {services} 190 {services}
189 {children} 191 {children}
190 </div> 192 </div>
diff --git a/src/components/ui/Modal/index.js b/src/components/ui/Modal/index.js
index 63d858c47..0af521452 100644
--- a/src/components/ui/Modal/index.js
+++ b/src/components/ui/Modal/index.js
@@ -41,6 +41,8 @@ export default @injectCSS(styles) class Modal extends Component {
41 showClose, 41 showClose,
42 } = this.props; 42 } = this.props;
43 43
44 const appRoot = document.getElementById('root');
45
44 return ( 46 return (
45 <ReactModal 47 <ReactModal
46 isOpen={isOpen} 48 isOpen={isOpen}
@@ -53,6 +55,7 @@ export default @injectCSS(styles) class Modal extends Component {
53 portal={portal} 55 portal={portal}
54 onRequestClose={close} 56 onRequestClose={close}
55 shouldCloseOnOverlayClick={shouldCloseOnOverlayClick} 57 shouldCloseOnOverlayClick={shouldCloseOnOverlayClick}
58 appElement={appRoot}
56 > 59 >
57 {showClose && close && ( 60 {showClose && close && (
58 <button 61 <button
diff --git a/src/features/quickSwitch/Component.js b/src/features/quickSwitch/Component.js
new file mode 100644
index 000000000..3217a3d93
--- /dev/null
+++ b/src/features/quickSwitch/Component.js
@@ -0,0 +1,291 @@
1import React, { Component, createRef } from 'react';
2import PropTypes from 'prop-types';
3import { observer, inject } from 'mobx-react';
4import { reaction } from 'mobx';
5import injectSheet from 'react-jss';
6import { defineMessages, intlShape } from 'react-intl';
7import { Input } from '@meetfranz/forms';
8
9import Modal from '../../components/ui/Modal';
10import { state as ModalState } from '.';
11import ServicesStore from '../../stores/ServicesStore';
12
13const messages = defineMessages({
14 search: {
15 id: 'feature.quickSwitch.search',
16 defaultMessage: '!!!Search...',
17 },
18 info: {
19 id: 'feature.quickSwitch.info',
20 defaultMessage: '!!!Select a service with TAB, ↑ and ↓. Open a service with ENTER.',
21 },
22});
23
24const styles = theme => ({
25 modal: {
26 width: '80%',
27 maxWidth: 600,
28 background: theme.styleTypes.primary.contrast,
29 color: theme.styleTypes.primary.accent,
30 paddingTop: 30,
31 },
32 services: {
33 width: '100%',
34 marginTop: 30,
35 },
36 service: {
37 background: theme.styleTypes.primary.contrast,
38 color: theme.colorText,
39 borderColor: theme.styleTypes.primary.accent,
40 borderStyle: 'solid',
41 borderWidth: 1,
42 borderRadius: 6,
43 padding: '3px 25px',
44 marginBottom: 10,
45 display: 'flex',
46 alignItems: 'center',
47 '&:hover': {
48 background: theme.styleTypes.primary.accent,
49 color: theme.styleTypes.primary.contrast,
50 cursor: 'pointer',
51 },
52 },
53 activeService: {
54 background: theme.styleTypes.primary.accent,
55 color: theme.styleTypes.primary.contrast,
56 cursor: 'pointer',
57 },
58 serviceIcon: {
59 width: 50,
60 height: 50,
61 paddingRight: 20,
62 objectFit: 'contain',
63 },
64});
65
66export default @injectSheet(styles) @inject('stores', 'actions') @observer class QuickSwitchModal extends Component {
67 static propTypes = {
68 classes: PropTypes.object.isRequired,
69 };
70
71 static contextTypes = {
72 intl: intlShape,
73 };
74
75 state = {
76 selected: 0,
77 search: '',
78 wasPrevVisible: false,
79 }
80
81 ARROW_DOWN = 40;
82
83 ARROW_UP = 38;
84
85 ENTER = 13;
86
87 TAB = 9;
88
89 inputRef = createRef();
90
91 constructor(props) {
92 super(props);
93
94 this._handleKeyDown = this._handleKeyDown.bind(this);
95 this._handleSearchUpdate = this._handleSearchUpdate.bind(this);
96 this._handleVisibilityChange = this._handleVisibilityChange.bind(this);
97 this.openService = this.openService.bind(this);
98
99 reaction(
100 () => ModalState.isModalVisible,
101 this._handleVisibilityChange,
102 );
103 }
104
105 // Add global keydown listener when component mounts
106 componentDidMount() {
107 document.addEventListener('keydown', this._handleKeyDown);
108 }
109
110 // Remove global keydown listener when component unmounts
111 componentWillUnmount() {
112 document.removeEventListener('keydown', this._handleKeyDown);
113 }
114
115 // Get currently shown services
116 services() {
117 let services = this.props.stores.services.allDisplayed;
118 if (this.state.search) {
119 // Apply simple search algorythm
120 services = services.filter(service => service.name.toLowerCase().includes(this.state.search.toLowerCase()));
121 }
122
123 return services;
124 }
125
126 openService(index) {
127 // Open service
128 const service = this.services()[index];
129 this.props.actions.service.setActive({ serviceId: service.id });
130
131 // Reset and close modal
132 this.setState({
133 search: '',
134 });
135 this.close();
136 }
137
138 // Change the selected service
139 // factor should be -1 or 1
140 changeSelected(factor) {
141 this.setState((state) => {
142 let newSelected = state.selected + factor;
143 const services = this.services().length;
144
145 // Roll around when on edge of list
146 if (state.selected < 1 && factor === -1) {
147 newSelected = services - 1;
148 } else if ((state.selected >= (services - 1)) && factor === 1) {
149 newSelected = 0;
150 }
151
152 return {
153 selected: newSelected,
154 };
155 });
156 }
157
158 // Handle global key presses to change the selection
159 _handleKeyDown(event) {
160 if (ModalState.isModalVisible) {
161 switch (event.keyCode) {
162 case this.ARROW_DOWN:
163 this.changeSelected(1);
164 break;
165 case this.TAB:
166 this.changeSelected(1);
167 break;
168 case this.ARROW_UP:
169 this.changeSelected(-1);
170 break;
171 case this.ENTER:
172 this.openService(this.state.selected);
173 break;
174 default:
175 break;
176 }
177 }
178 }
179
180 // Handle update of the search query
181 _handleSearchUpdate(evt) {
182 this.setState({
183 search: evt.target.value,
184 });
185 }
186
187 _handleVisibilityChange() {
188 const { isModalVisible } = ModalState;
189
190 if (isModalVisible && !this.state.wasPrevVisible) {
191 // Set focus back on current window if its in a service
192 // TODO: Find a way to gain back focus
193
194 // The input "focus" attribute will only work on first modal open
195 // Manually add focus to the input element
196 // Wrapped inside timeout to let the modal render first
197 setTimeout(() => {
198 if (this.inputRef.current) {
199 this.inputRef.current.getElementsByTagName('input')[0].focus();
200 }
201 }, 10);
202
203 this.setState({
204 wasPrevVisible: true,
205 });
206 } else if (!isModalVisible && this.state.wasPrevVisible) {
207 // Manually blur focus from the input element to prevent
208 // search query change when modal not visible
209 setTimeout(() => {
210 if (this.inputRef.current) {
211 this.inputRef.current.getElementsByTagName('input')[0].blur();
212 }
213 }, 100);
214
215 this.setState({
216 wasPrevVisible: false,
217 });
218 }
219 }
220
221 // Close this modal
222 close() {
223 ModalState.isModalVisible = false;
224 }
225
226 render() {
227 const { isModalVisible } = ModalState;
228
229 const {
230 openService,
231 } = this;
232
233 const {
234 classes,
235 } = this.props;
236
237 const services = this.services();
238
239 const { intl } = this.context;
240
241 return (
242 <Modal
243 isOpen={isModalVisible}
244 className={classes.modal}
245 shouldCloseOnOverlayClick
246 close={this.close.bind(this)}
247 >
248 <div ref={this.inputRef}>
249 <Input
250 placeholder={intl.formatMessage(messages.search)}
251 focus
252 value={this.state.search}
253 onChange={this._handleSearchUpdate}
254 />
255 </div>
256
257 <div className={classes.services}>
258 { services.map((service, index) => (
259 <div
260 className={`${classes.service} ${this.state.selected === index ? classes.activeService : ''}`}
261 onClick={() => openService(index)}
262 key={service.id}
263 >
264 <img
265 src={service.icon}
266 className={classes.serviceIcon}
267 alt={service.recipe.name}
268 />
269 <div>
270 { service.name }
271 </div>
272 </div>
273 ))}
274 </div>
275
276 <p>{intl.formatMessage(messages.info)}</p>
277 </Modal>
278 );
279 }
280}
281
282QuickSwitchModal.wrappedComponent.propTypes = {
283 stores: PropTypes.shape({
284 services: PropTypes.instanceOf(ServicesStore).isRequired,
285 }).isRequired,
286 actions: PropTypes.shape({
287 service: PropTypes.shape({
288 setActive: PropTypes.func.isRequired,
289 }).isRequired,
290 }).isRequired,
291};
diff --git a/src/features/quickSwitch/index.js b/src/features/quickSwitch/index.js
new file mode 100644
index 000000000..c57fad366
--- /dev/null
+++ b/src/features/quickSwitch/index.js
@@ -0,0 +1,24 @@
1import { observable } from 'mobx';
2
3export { default as Component } from './Component';
4
5const debug = require('debug')('Ferdi:feature:quickSwitch');
6
7const defaultState = {
8 isModalVisible: false,
9};
10
11export const state = observable(defaultState);
12
13export default function initialize() {
14 debug('Initialize quickSwitch feature');
15
16 function showModal() {
17 state.isModalVisible = true;
18 }
19
20 window.ferdi.features.quickSwitch = {
21 state,
22 showModal,
23 };
24}
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
index 45d691e22..7f02af685 100644
--- a/src/i18n/locales/defaultMessages.json
+++ b/src/i18n/locales/defaultMessages.json
@@ -817,52 +817,52 @@
817 "defaultMessage": "!!!Your services have been updated.", 817 "defaultMessage": "!!!Your services have been updated.",
818 "end": { 818 "end": {
819 "column": 3, 819 "column": 3,
820 "line": 30 820 "line": 31
821 }, 821 },
822 "file": "src/components/layout/AppLayout.js", 822 "file": "src/components/layout/AppLayout.js",
823 "id": "infobar.servicesUpdated", 823 "id": "infobar.servicesUpdated",
824 "start": { 824 "start": {
825 "column": 19, 825 "column": 19,
826 "line": 27 826 "line": 28
827 } 827 }
828 }, 828 },
829 { 829 {
830 "defaultMessage": "!!!Reload services", 830 "defaultMessage": "!!!Reload services",
831 "end": { 831 "end": {
832 "column": 3, 832 "column": 3,
833 "line": 34 833 "line": 35
834 }, 834 },
835 "file": "src/components/layout/AppLayout.js", 835 "file": "src/components/layout/AppLayout.js",
836 "id": "infobar.buttonReloadServices", 836 "id": "infobar.buttonReloadServices",
837 "start": { 837 "start": {
838 "column": 24, 838 "column": 24,
839 "line": 31 839 "line": 32
840 } 840 }
841 }, 841 },
842 { 842 {
843 "defaultMessage": "!!!Could not load services and user information", 843 "defaultMessage": "!!!Could not load services and user information",
844 "end": { 844 "end": {
845 "column": 3, 845 "column": 3,
846 "line": 38 846 "line": 39
847 }, 847 },
848 "file": "src/components/layout/AppLayout.js", 848 "file": "src/components/layout/AppLayout.js",
849 "id": "infobar.requiredRequestsFailed", 849 "id": "infobar.requiredRequestsFailed",
850 "start": { 850 "start": {
851 "column": 26, 851 "column": 26,
852 "line": 35 852 "line": 36
853 } 853 }
854 }, 854 },
855 { 855 {
856 "defaultMessage": "!!!There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.", 856 "defaultMessage": "!!!There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.",
857 "end": { 857 "end": {
858 "column": 3, 858 "column": 3,
859 "line": 42 859 "line": 43
860 }, 860 },
861 "file": "src/components/layout/AppLayout.js", 861 "file": "src/components/layout/AppLayout.js",
862 "id": "infobar.authRequestFailed", 862 "id": "infobar.authRequestFailed",
863 "start": { 863 "start": {
864 "column": 21, 864 "column": 21,
865 "line": 39 865 "line": 40
866 } 866 }
867 } 867 }
868 ], 868 ],
@@ -4099,6 +4099,37 @@
4099 { 4099 {
4100 "descriptors": [ 4100 "descriptors": [
4101 { 4101 {
4102 "defaultMessage": "!!!Search...",
4103 "end": {
4104 "column": 3,
4105 "line": 17
4106 },
4107 "file": "src/features/quickSwitch/Component.js",
4108 "id": "feature.quickSwitch.search",
4109 "start": {
4110 "column": 10,
4111 "line": 14
4112 }
4113 },
4114 {
4115 "defaultMessage": "!!!Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
4116 "end": {
4117 "column": 3,
4118 "line": 21
4119 },
4120 "file": "src/features/quickSwitch/Component.js",
4121 "id": "feature.quickSwitch.info",
4122 "start": {
4123 "column": 8,
4124 "line": 18
4125 }
4126 }
4127 ],
4128 "path": "src/features/quickSwitch/Component.json"
4129 },
4130 {
4131 "descriptors": [
4132 {
4102 "defaultMessage": "!!!Changes in Franz {version}", 4133 "defaultMessage": "!!!Changes in Franz {version}",
4103 "end": { 4134 "end": {
4104 "column": 3, 4135 "column": 3,
@@ -5196,679 +5227,692 @@
5196 } 5227 }
5197 }, 5228 },
5198 { 5229 {
5199 "defaultMessage": "!!!Back", 5230 "defaultMessage": "!!!Open Quick Switch",
5200 "end": { 5231 "end": {
5201 "column": 3, 5232 "column": 3,
5202 "line": 75 5233 "line": 75
5203 }, 5234 },
5204 "file": "src/lib/Menu.js", 5235 "file": "src/lib/Menu.js",
5236 "id": "menu.view.openQuickSwitch",
5237 "start": {
5238 "column": 19,
5239 "line": 72
5240 }
5241 },
5242 {
5243 "defaultMessage": "!!!Back",
5244 "end": {
5245 "column": 3,
5246 "line": 79
5247 },
5248 "file": "src/lib/Menu.js",
5205 "id": "menu.view.back", 5249 "id": "menu.view.back",
5206 "start": { 5250 "start": {
5207 "column": 8, 5251 "column": 8,
5208 "line": 72 5252 "line": 76
5209 } 5253 }
5210 }, 5254 },
5211 { 5255 {
5212 "defaultMessage": "!!!Forward", 5256 "defaultMessage": "!!!Forward",
5213 "end": { 5257 "end": {
5214 "column": 3, 5258 "column": 3,
5215 "line": 79 5259 "line": 83
5216 }, 5260 },
5217 "file": "src/lib/Menu.js", 5261 "file": "src/lib/Menu.js",
5218 "id": "menu.view.forward", 5262 "id": "menu.view.forward",
5219 "start": { 5263 "start": {
5220 "column": 11, 5264 "column": 11,
5221 "line": 76 5265 "line": 80
5222 } 5266 }
5223 }, 5267 },
5224 { 5268 {
5225 "defaultMessage": "!!!Actual Size", 5269 "defaultMessage": "!!!Actual Size",
5226 "end": { 5270 "end": {
5227 "column": 3, 5271 "column": 3,
5228 "line": 83 5272 "line": 87
5229 }, 5273 },
5230 "file": "src/lib/Menu.js", 5274 "file": "src/lib/Menu.js",
5231 "id": "menu.view.resetZoom", 5275 "id": "menu.view.resetZoom",
5232 "start": { 5276 "start": {
5233 "column": 13, 5277 "column": 13,
5234 "line": 80 5278 "line": 84
5235 } 5279 }
5236 }, 5280 },
5237 { 5281 {
5238 "defaultMessage": "!!!Zoom In", 5282 "defaultMessage": "!!!Zoom In",
5239 "end": { 5283 "end": {
5240 "column": 3, 5284 "column": 3,
5241 "line": 87 5285 "line": 91
5242 }, 5286 },
5243 "file": "src/lib/Menu.js", 5287 "file": "src/lib/Menu.js",
5244 "id": "menu.view.zoomIn", 5288 "id": "menu.view.zoomIn",
5245 "start": { 5289 "start": {
5246 "column": 10, 5290 "column": 10,
5247 "line": 84 5291 "line": 88
5248 } 5292 }
5249 }, 5293 },
5250 { 5294 {
5251 "defaultMessage": "!!!Zoom Out", 5295 "defaultMessage": "!!!Zoom Out",
5252 "end": { 5296 "end": {
5253 "column": 3, 5297 "column": 3,
5254 "line": 91 5298 "line": 95
5255 }, 5299 },
5256 "file": "src/lib/Menu.js", 5300 "file": "src/lib/Menu.js",
5257 "id": "menu.view.zoomOut", 5301 "id": "menu.view.zoomOut",
5258 "start": { 5302 "start": {
5259 "column": 11, 5303 "column": 11,
5260 "line": 88 5304 "line": 92
5261 } 5305 }
5262 }, 5306 },
5263 { 5307 {
5264 "defaultMessage": "!!!Enter Full Screen", 5308 "defaultMessage": "!!!Enter Full Screen",
5265 "end": { 5309 "end": {
5266 "column": 3, 5310 "column": 3,
5267 "line": 95 5311 "line": 99
5268 }, 5312 },
5269 "file": "src/lib/Menu.js", 5313 "file": "src/lib/Menu.js",
5270 "id": "menu.view.enterFullScreen", 5314 "id": "menu.view.enterFullScreen",
5271 "start": { 5315 "start": {
5272 "column": 19, 5316 "column": 19,
5273 "line": 92 5317 "line": 96
5274 } 5318 }
5275 }, 5319 },
5276 { 5320 {
5277 "defaultMessage": "!!!Exit Full Screen", 5321 "defaultMessage": "!!!Exit Full Screen",
5278 "end": { 5322 "end": {
5279 "column": 3, 5323 "column": 3,
5280 "line": 99 5324 "line": 103
5281 }, 5325 },
5282 "file": "src/lib/Menu.js", 5326 "file": "src/lib/Menu.js",
5283 "id": "menu.view.exitFullScreen", 5327 "id": "menu.view.exitFullScreen",
5284 "start": { 5328 "start": {
5285 "column": 18, 5329 "column": 18,
5286 "line": 96 5330 "line": 100
5287 } 5331 }
5288 }, 5332 },
5289 { 5333 {
5290 "defaultMessage": "!!!Toggle Full Screen", 5334 "defaultMessage": "!!!Toggle Full Screen",
5291 "end": { 5335 "end": {
5292 "column": 3, 5336 "column": 3,
5293 "line": 103 5337 "line": 107
5294 }, 5338 },
5295 "file": "src/lib/Menu.js", 5339 "file": "src/lib/Menu.js",
5296 "id": "menu.view.toggleFullScreen", 5340 "id": "menu.view.toggleFullScreen",
5297 "start": { 5341 "start": {
5298 "column": 20, 5342 "column": 20,
5299 "line": 100 5343 "line": 104
5300 } 5344 }
5301 }, 5345 },
5302 { 5346 {
5303 "defaultMessage": "!!!Toggle Developer Tools", 5347 "defaultMessage": "!!!Toggle Developer Tools",
5304 "end": { 5348 "end": {
5305 "column": 3, 5349 "column": 3,
5306 "line": 107 5350 "line": 111
5307 }, 5351 },
5308 "file": "src/lib/Menu.js", 5352 "file": "src/lib/Menu.js",
5309 "id": "menu.view.toggleDevTools", 5353 "id": "menu.view.toggleDevTools",
5310 "start": { 5354 "start": {
5311 "column": 18, 5355 "column": 18,
5312 "line": 104 5356 "line": 108
5313 } 5357 }
5314 }, 5358 },
5315 { 5359 {
5316 "defaultMessage": "!!!Toggle Todos Developer Tools", 5360 "defaultMessage": "!!!Toggle Todos Developer Tools",
5317 "end": { 5361 "end": {
5318 "column": 3, 5362 "column": 3,
5319 "line": 111 5363 "line": 115
5320 }, 5364 },
5321 "file": "src/lib/Menu.js", 5365 "file": "src/lib/Menu.js",
5322 "id": "menu.view.toggleTodosDevTools", 5366 "id": "menu.view.toggleTodosDevTools",
5323 "start": { 5367 "start": {
5324 "column": 23, 5368 "column": 23,
5325 "line": 108 5369 "line": 112
5326 } 5370 }
5327 }, 5371 },
5328 { 5372 {
5329 "defaultMessage": "!!!Toggle Service Developer Tools", 5373 "defaultMessage": "!!!Toggle Service Developer Tools",
5330 "end": { 5374 "end": {
5331 "column": 3, 5375 "column": 3,
5332 "line": 115 5376 "line": 119
5333 }, 5377 },
5334 "file": "src/lib/Menu.js", 5378 "file": "src/lib/Menu.js",
5335 "id": "menu.view.toggleServiceDevTools", 5379 "id": "menu.view.toggleServiceDevTools",
5336 "start": { 5380 "start": {
5337 "column": 25, 5381 "column": 25,
5338 "line": 112 5382 "line": 116
5339 } 5383 }
5340 }, 5384 },
5341 { 5385 {
5342 "defaultMessage": "!!!Reload Service", 5386 "defaultMessage": "!!!Reload Service",
5343 "end": { 5387 "end": {
5344 "column": 3, 5388 "column": 3,
5345 "line": 119 5389 "line": 123
5346 }, 5390 },
5347 "file": "src/lib/Menu.js", 5391 "file": "src/lib/Menu.js",
5348 "id": "menu.view.reloadService", 5392 "id": "menu.view.reloadService",
5349 "start": { 5393 "start": {
5350 "column": 17, 5394 "column": 17,
5351 "line": 116 5395 "line": 120
5352 } 5396 }
5353 }, 5397 },
5354 { 5398 {
5355 "defaultMessage": "!!!Reload Ferdi", 5399 "defaultMessage": "!!!Reload Ferdi",
5356 "end": { 5400 "end": {
5357 "column": 3, 5401 "column": 3,
5358 "line": 123 5402 "line": 127
5359 }, 5403 },
5360 "file": "src/lib/Menu.js", 5404 "file": "src/lib/Menu.js",
5361 "id": "menu.view.reloadFranz", 5405 "id": "menu.view.reloadFranz",
5362 "start": { 5406 "start": {
5363 "column": 15, 5407 "column": 15,
5364 "line": 120 5408 "line": 124
5365 } 5409 }
5366 }, 5410 },
5367 { 5411 {
5368 "defaultMessage": "!!!Lock Ferdi", 5412 "defaultMessage": "!!!Lock Ferdi",
5369 "end": { 5413 "end": {
5370 "column": 3, 5414 "column": 3,
5371 "line": 127 5415 "line": 131
5372 }, 5416 },
5373 "file": "src/lib/Menu.js", 5417 "file": "src/lib/Menu.js",
5374 "id": "menu.view.lockFerdi", 5418 "id": "menu.view.lockFerdi",
5375 "start": { 5419 "start": {
5376 "column": 13, 5420 "column": 13,
5377 "line": 124 5421 "line": 128
5378 } 5422 }
5379 }, 5423 },
5380 { 5424 {
5381 "defaultMessage": "!!!Minimize", 5425 "defaultMessage": "!!!Minimize",
5382 "end": { 5426 "end": {
5383 "column": 3, 5427 "column": 3,
5384 "line": 131 5428 "line": 135
5385 }, 5429 },
5386 "file": "src/lib/Menu.js", 5430 "file": "src/lib/Menu.js",
5387 "id": "menu.window.minimize", 5431 "id": "menu.window.minimize",
5388 "start": { 5432 "start": {
5389 "column": 12, 5433 "column": 12,
5390 "line": 128 5434 "line": 132
5391 } 5435 }
5392 }, 5436 },
5393 { 5437 {
5394 "defaultMessage": "!!!Close", 5438 "defaultMessage": "!!!Close",
5395 "end": { 5439 "end": {
5396 "column": 3, 5440 "column": 3,
5397 "line": 135 5441 "line": 139
5398 }, 5442 },
5399 "file": "src/lib/Menu.js", 5443 "file": "src/lib/Menu.js",
5400 "id": "menu.window.close", 5444 "id": "menu.window.close",
5401 "start": { 5445 "start": {
5402 "column": 9, 5446 "column": 9,
5403 "line": 132 5447 "line": 136
5404 } 5448 }
5405 }, 5449 },
5406 { 5450 {
5407 "defaultMessage": "!!!Learn More", 5451 "defaultMessage": "!!!Learn More",
5408 "end": { 5452 "end": {
5409 "column": 3, 5453 "column": 3,
5410 "line": 139 5454 "line": 143
5411 }, 5455 },
5412 "file": "src/lib/Menu.js", 5456 "file": "src/lib/Menu.js",
5413 "id": "menu.help.learnMore", 5457 "id": "menu.help.learnMore",
5414 "start": { 5458 "start": {
5415 "column": 13, 5459 "column": 13,
5416 "line": 136 5460 "line": 140
5417 } 5461 }
5418 }, 5462 },
5419 { 5463 {
5420 "defaultMessage": "!!!Changelog", 5464 "defaultMessage": "!!!Changelog",
5421 "end": { 5465 "end": {
5422 "column": 3, 5466 "column": 3,
5423 "line": 143 5467 "line": 147
5424 }, 5468 },
5425 "file": "src/lib/Menu.js", 5469 "file": "src/lib/Menu.js",
5426 "id": "menu.help.changelog", 5470 "id": "menu.help.changelog",
5427 "start": { 5471 "start": {
5428 "column": 13, 5472 "column": 13,
5429 "line": 140 5473 "line": 144
5430 } 5474 }
5431 }, 5475 },
5432 { 5476 {
5433 "defaultMessage": "!!!Support", 5477 "defaultMessage": "!!!Support",
5434 "end": { 5478 "end": {
5435 "column": 3, 5479 "column": 3,
5436 "line": 147 5480 "line": 151
5437 }, 5481 },
5438 "file": "src/lib/Menu.js", 5482 "file": "src/lib/Menu.js",
5439 "id": "menu.help.support", 5483 "id": "menu.help.support",
5440 "start": { 5484 "start": {
5441 "column": 11, 5485 "column": 11,
5442 "line": 144 5486 "line": 148
5443 } 5487 }
5444 }, 5488 },
5445 { 5489 {
5446 "defaultMessage": "!!!Copy Debug Information", 5490 "defaultMessage": "!!!Copy Debug Information",
5447 "end": { 5491 "end": {
5448 "column": 3, 5492 "column": 3,
5449 "line": 151 5493 "line": 155
5450 }, 5494 },
5451 "file": "src/lib/Menu.js", 5495 "file": "src/lib/Menu.js",
5452 "id": "menu.help.debugInfo", 5496 "id": "menu.help.debugInfo",
5453 "start": { 5497 "start": {
5454 "column": 13, 5498 "column": 13,
5455 "line": 148 5499 "line": 152
5456 } 5500 }
5457 }, 5501 },
5458 { 5502 {
5459 "defaultMessage": "!!!Ferdi Debug Information", 5503 "defaultMessage": "!!!Ferdi Debug Information",
5460 "end": { 5504 "end": {
5461 "column": 3, 5505 "column": 3,
5462 "line": 155 5506 "line": 159
5463 }, 5507 },
5464 "file": "src/lib/Menu.js", 5508 "file": "src/lib/Menu.js",
5465 "id": "menu.help.debugInfoCopiedHeadline", 5509 "id": "menu.help.debugInfoCopiedHeadline",
5466 "start": { 5510 "start": {
5467 "column": 27, 5511 "column": 27,
5468 "line": 152 5512 "line": 156
5469 } 5513 }
5470 }, 5514 },
5471 { 5515 {
5472 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.", 5516 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.",
5473 "end": { 5517 "end": {
5474 "column": 3, 5518 "column": 3,
5475 "line": 159 5519 "line": 163
5476 }, 5520 },
5477 "file": "src/lib/Menu.js", 5521 "file": "src/lib/Menu.js",
5478 "id": "menu.help.debugInfoCopiedBody", 5522 "id": "menu.help.debugInfoCopiedBody",
5479 "start": { 5523 "start": {
5480 "column": 23, 5524 "column": 23,
5481 "line": 156 5525 "line": 160
5482 } 5526 }
5483 }, 5527 },
5484 { 5528 {
5485 "defaultMessage": "!!!Terms of Service", 5529 "defaultMessage": "!!!Terms of Service",
5486 "end": { 5530 "end": {
5487 "column": 3, 5531 "column": 3,
5488 "line": 163 5532 "line": 167
5489 }, 5533 },
5490 "file": "src/lib/Menu.js", 5534 "file": "src/lib/Menu.js",
5491 "id": "menu.help.tos", 5535 "id": "menu.help.tos",
5492 "start": { 5536 "start": {
5493 "column": 7, 5537 "column": 7,
5494 "line": 160 5538 "line": 164
5495 } 5539 }
5496 }, 5540 },
5497 { 5541 {
5498 "defaultMessage": "!!!Privacy Statement", 5542 "defaultMessage": "!!!Privacy Statement",
5499 "end": { 5543 "end": {
5500 "column": 3, 5544 "column": 3,
5501 "line": 167 5545 "line": 171
5502 }, 5546 },
5503 "file": "src/lib/Menu.js", 5547 "file": "src/lib/Menu.js",
5504 "id": "menu.help.privacy", 5548 "id": "menu.help.privacy",
5505 "start": { 5549 "start": {
5506 "column": 11, 5550 "column": 11,
5507 "line": 164 5551 "line": 168
5508 } 5552 }
5509 }, 5553 },
5510 { 5554 {
5511 "defaultMessage": "!!!File", 5555 "defaultMessage": "!!!File",
5512 "end": { 5556 "end": {
5513 "column": 3, 5557 "column": 3,
5514 "line": 171 5558 "line": 175
5515 }, 5559 },
5516 "file": "src/lib/Menu.js", 5560 "file": "src/lib/Menu.js",
5517 "id": "menu.file", 5561 "id": "menu.file",
5518 "start": { 5562 "start": {
5519 "column": 8, 5563 "column": 8,
5520 "line": 168 5564 "line": 172
5521 } 5565 }
5522 }, 5566 },
5523 { 5567 {
5524 "defaultMessage": "!!!View", 5568 "defaultMessage": "!!!View",
5525 "end": { 5569 "end": {
5526 "column": 3, 5570 "column": 3,
5527 "line": 175 5571 "line": 179
5528 }, 5572 },
5529 "file": "src/lib/Menu.js", 5573 "file": "src/lib/Menu.js",
5530 "id": "menu.view", 5574 "id": "menu.view",
5531 "start": { 5575 "start": {
5532 "column": 8, 5576 "column": 8,
5533 "line": 172 5577 "line": 176
5534 } 5578 }
5535 }, 5579 },
5536 { 5580 {
5537 "defaultMessage": "!!!Services", 5581 "defaultMessage": "!!!Services",
5538 "end": { 5582 "end": {
5539 "column": 3, 5583 "column": 3,
5540 "line": 179 5584 "line": 183
5541 }, 5585 },
5542 "file": "src/lib/Menu.js", 5586 "file": "src/lib/Menu.js",
5543 "id": "menu.services", 5587 "id": "menu.services",
5544 "start": { 5588 "start": {
5545 "column": 12, 5589 "column": 12,
5546 "line": 176 5590 "line": 180
5547 } 5591 }
5548 }, 5592 },
5549 { 5593 {
5550 "defaultMessage": "!!!Window", 5594 "defaultMessage": "!!!Window",
5551 "end": { 5595 "end": {
5552 "column": 3, 5596 "column": 3,
5553 "line": 183 5597 "line": 187
5554 }, 5598 },
5555 "file": "src/lib/Menu.js", 5599 "file": "src/lib/Menu.js",
5556 "id": "menu.window", 5600 "id": "menu.window",
5557 "start": { 5601 "start": {
5558 "column": 10, 5602 "column": 10,
5559 "line": 180 5603 "line": 184
5560 } 5604 }
5561 }, 5605 },
5562 { 5606 {
5563 "defaultMessage": "!!!Help", 5607 "defaultMessage": "!!!Help",
5564 "end": { 5608 "end": {
5565 "column": 3, 5609 "column": 3,
5566 "line": 187 5610 "line": 191
5567 }, 5611 },
5568 "file": "src/lib/Menu.js", 5612 "file": "src/lib/Menu.js",
5569 "id": "menu.help", 5613 "id": "menu.help",
5570 "start": { 5614 "start": {
5571 "column": 8, 5615 "column": 8,
5572 "line": 184 5616 "line": 188
5573 } 5617 }
5574 }, 5618 },
5575 { 5619 {
5576 "defaultMessage": "!!!About Ferdi", 5620 "defaultMessage": "!!!About Ferdi",
5577 "end": { 5621 "end": {
5578 "column": 3, 5622 "column": 3,
5579 "line": 191 5623 "line": 195
5580 }, 5624 },
5581 "file": "src/lib/Menu.js", 5625 "file": "src/lib/Menu.js",
5582 "id": "menu.app.about", 5626 "id": "menu.app.about",
5583 "start": { 5627 "start": {
5584 "column": 9, 5628 "column": 9,
5585 "line": 188 5629 "line": 192
5586 } 5630 }
5587 }, 5631 },
5588 { 5632 {
5589 "defaultMessage": "!!!What's new?", 5633 "defaultMessage": "!!!What's new?",
5590 "end": { 5634 "end": {
5591 "column": 3, 5635 "column": 3,
5592 "line": 195 5636 "line": 199
5593 }, 5637 },
5594 "file": "src/lib/Menu.js", 5638 "file": "src/lib/Menu.js",
5595 "id": "menu.app.announcement", 5639 "id": "menu.app.announcement",
5596 "start": { 5640 "start": {
5597 "column": 16, 5641 "column": 16,
5598 "line": 192 5642 "line": 196
5599 } 5643 }
5600 }, 5644 },
5601 { 5645 {
5602 "defaultMessage": "!!!Settings", 5646 "defaultMessage": "!!!Settings",
5603 "end": { 5647 "end": {
5604 "column": 3, 5648 "column": 3,
5605 "line": 199 5649 "line": 203
5606 }, 5650 },
5607 "file": "src/lib/Menu.js", 5651 "file": "src/lib/Menu.js",
5608 "id": "menu.app.settings", 5652 "id": "menu.app.settings",
5609 "start": { 5653 "start": {
5610 "column": 12, 5654 "column": 12,
5611 "line": 196 5655 "line": 200
5612 } 5656 }
5613 }, 5657 },
5614 { 5658 {
5615 "defaultMessage": "!!!Check for updates", 5659 "defaultMessage": "!!!Check for updates",
5616 "end": { 5660 "end": {
5617 "column": 3, 5661 "column": 3,
5618 "line": 203 5662 "line": 207
5619 }, 5663 },
5620 "file": "src/lib/Menu.js", 5664 "file": "src/lib/Menu.js",
5621 "id": "menu.app.checkForUpdates", 5665 "id": "menu.app.checkForUpdates",
5622 "start": { 5666 "start": {
5623 "column": 19, 5667 "column": 19,
5624 "line": 200 5668 "line": 204
5625 } 5669 }
5626 }, 5670 },
5627 { 5671 {
5628 "defaultMessage": "!!!Hide", 5672 "defaultMessage": "!!!Hide",
5629 "end": { 5673 "end": {
5630 "column": 3, 5674 "column": 3,
5631 "line": 207 5675 "line": 211
5632 }, 5676 },
5633 "file": "src/lib/Menu.js", 5677 "file": "src/lib/Menu.js",
5634 "id": "menu.app.hide", 5678 "id": "menu.app.hide",
5635 "start": { 5679 "start": {
5636 "column": 8, 5680 "column": 8,
5637 "line": 204 5681 "line": 208
5638 } 5682 }
5639 }, 5683 },
5640 { 5684 {
5641 "defaultMessage": "!!!Hide Others", 5685 "defaultMessage": "!!!Hide Others",
5642 "end": { 5686 "end": {
5643 "column": 3, 5687 "column": 3,
5644 "line": 211 5688 "line": 215
5645 }, 5689 },
5646 "file": "src/lib/Menu.js", 5690 "file": "src/lib/Menu.js",
5647 "id": "menu.app.hideOthers", 5691 "id": "menu.app.hideOthers",
5648 "start": { 5692 "start": {
5649 "column": 14, 5693 "column": 14,
5650 "line": 208 5694 "line": 212
5651 } 5695 }
5652 }, 5696 },
5653 { 5697 {
5654 "defaultMessage": "!!!Unhide", 5698 "defaultMessage": "!!!Unhide",
5655 "end": { 5699 "end": {
5656 "column": 3, 5700 "column": 3,
5657 "line": 215 5701 "line": 219
5658 }, 5702 },
5659 "file": "src/lib/Menu.js", 5703 "file": "src/lib/Menu.js",
5660 "id": "menu.app.unhide", 5704 "id": "menu.app.unhide",
5661 "start": { 5705 "start": {
5662 "column": 10, 5706 "column": 10,
5663 "line": 212 5707 "line": 216
5664 } 5708 }
5665 }, 5709 },
5666 { 5710 {
5667 "defaultMessage": "!!!Auto-hide menu bar", 5711 "defaultMessage": "!!!Auto-hide menu bar",
5668 "end": { 5712 "end": {
5669 "column": 3, 5713 "column": 3,
5670 "line": 219 5714 "line": 223
5671 }, 5715 },
5672 "file": "src/lib/Menu.js", 5716 "file": "src/lib/Menu.js",
5673 "id": "menu.app.autohideMenuBar", 5717 "id": "menu.app.autohideMenuBar",
5674 "start": { 5718 "start": {
5675 "column": 19, 5719 "column": 19,
5676 "line": 216 5720 "line": 220
5677 } 5721 }
5678 }, 5722 },
5679 { 5723 {
5680 "defaultMessage": "!!!Quit", 5724 "defaultMessage": "!!!Quit",
5681 "end": { 5725 "end": {
5682 "column": 3, 5726 "column": 3,
5683 "line": 223 5727 "line": 227
5684 }, 5728 },
5685 "file": "src/lib/Menu.js", 5729 "file": "src/lib/Menu.js",
5686 "id": "menu.app.quit", 5730 "id": "menu.app.quit",
5687 "start": { 5731 "start": {
5688 "column": 8, 5732 "column": 8,
5689 "line": 220 5733 "line": 224
5690 } 5734 }
5691 }, 5735 },
5692 { 5736 {
5693 "defaultMessage": "!!!Add New Service...", 5737 "defaultMessage": "!!!Add New Service...",
5694 "end": { 5738 "end": {
5695 "column": 3, 5739 "column": 3,
5696 "line": 227 5740 "line": 231
5697 }, 5741 },
5698 "file": "src/lib/Menu.js", 5742 "file": "src/lib/Menu.js",
5699 "id": "menu.services.addNewService", 5743 "id": "menu.services.addNewService",
5700 "start": { 5744 "start": {
5701 "column": 17, 5745 "column": 17,
5702 "line": 224 5746 "line": 228
5703 } 5747 }
5704 }, 5748 },
5705 { 5749 {
5706 "defaultMessage": "!!!Add New Workspace...", 5750 "defaultMessage": "!!!Add New Workspace...",
5707 "end": { 5751 "end": {
5708 "column": 3, 5752 "column": 3,
5709 "line": 231 5753 "line": 235
5710 }, 5754 },
5711 "file": "src/lib/Menu.js", 5755 "file": "src/lib/Menu.js",
5712 "id": "menu.workspaces.addNewWorkspace", 5756 "id": "menu.workspaces.addNewWorkspace",
5713 "start": { 5757 "start": {
5714 "column": 19, 5758 "column": 19,
5715 "line": 228 5759 "line": 232
5716 } 5760 }
5717 }, 5761 },
5718 { 5762 {
5719 "defaultMessage": "!!!Open workspace drawer", 5763 "defaultMessage": "!!!Open workspace drawer",
5720 "end": { 5764 "end": {
5721 "column": 3, 5765 "column": 3,
5722 "line": 235 5766 "line": 239
5723 }, 5767 },
5724 "file": "src/lib/Menu.js", 5768 "file": "src/lib/Menu.js",
5725 "id": "menu.workspaces.openWorkspaceDrawer", 5769 "id": "menu.workspaces.openWorkspaceDrawer",
5726 "start": { 5770 "start": {
5727 "column": 23, 5771 "column": 23,
5728 "line": 232 5772 "line": 236
5729 } 5773 }
5730 }, 5774 },
5731 { 5775 {
5732 "defaultMessage": "!!!Close workspace drawer", 5776 "defaultMessage": "!!!Close workspace drawer",
5733 "end": { 5777 "end": {
5734 "column": 3, 5778 "column": 3,
5735 "line": 239 5779 "line": 243
5736 }, 5780 },
5737 "file": "src/lib/Menu.js", 5781 "file": "src/lib/Menu.js",
5738 "id": "menu.workspaces.closeWorkspaceDrawer", 5782 "id": "menu.workspaces.closeWorkspaceDrawer",
5739 "start": { 5783 "start": {
5740 "column": 24, 5784 "column": 24,
5741 "line": 236 5785 "line": 240
5742 } 5786 }
5743 }, 5787 },
5744 { 5788 {
5745 "defaultMessage": "!!!Activate next service...", 5789 "defaultMessage": "!!!Activate next service...",
5746 "end": { 5790 "end": {
5747 "column": 3, 5791 "column": 3,
5748 "line": 243 5792 "line": 247
5749 }, 5793 },
5750 "file": "src/lib/Menu.js", 5794 "file": "src/lib/Menu.js",
5751 "id": "menu.services.setNextServiceActive", 5795 "id": "menu.services.setNextServiceActive",
5752 "start": { 5796 "start": {
5753 "column": 23, 5797 "column": 23,
5754 "line": 240 5798 "line": 244
5755 } 5799 }
5756 }, 5800 },
5757 { 5801 {
5758 "defaultMessage": "!!!Activate previous service...", 5802 "defaultMessage": "!!!Activate previous service...",
5759 "end": { 5803 "end": {
5760 "column": 3, 5804 "column": 3,
5761 "line": 247 5805 "line": 251
5762 }, 5806 },
5763 "file": "src/lib/Menu.js", 5807 "file": "src/lib/Menu.js",
5764 "id": "menu.services.activatePreviousService", 5808 "id": "menu.services.activatePreviousService",
5765 "start": { 5809 "start": {
5766 "column": 27, 5810 "column": 27,
5767 "line": 244 5811 "line": 248
5768 } 5812 }
5769 }, 5813 },
5770 { 5814 {
5771 "defaultMessage": "!!!Disable notifications & audio", 5815 "defaultMessage": "!!!Disable notifications & audio",
5772 "end": { 5816 "end": {
5773 "column": 3, 5817 "column": 3,
5774 "line": 251 5818 "line": 255
5775 }, 5819 },
5776 "file": "src/lib/Menu.js", 5820 "file": "src/lib/Menu.js",
5777 "id": "sidebar.muteApp", 5821 "id": "sidebar.muteApp",
5778 "start": { 5822 "start": {
5779 "column": 11, 5823 "column": 11,
5780 "line": 248 5824 "line": 252
5781 } 5825 }
5782 }, 5826 },
5783 { 5827 {
5784 "defaultMessage": "!!!Enable notifications & audio", 5828 "defaultMessage": "!!!Enable notifications & audio",
5785 "end": { 5829 "end": {
5786 "column": 3, 5830 "column": 3,
5787 "line": 255 5831 "line": 259
5788 }, 5832 },
5789 "file": "src/lib/Menu.js", 5833 "file": "src/lib/Menu.js",
5790 "id": "sidebar.unmuteApp", 5834 "id": "sidebar.unmuteApp",
5791 "start": { 5835 "start": {
5792 "column": 13, 5836 "column": 13,
5793 "line": 252 5837 "line": 256
5794 } 5838 }
5795 }, 5839 },
5796 { 5840 {
5797 "defaultMessage": "!!!Workspaces", 5841 "defaultMessage": "!!!Workspaces",
5798 "end": { 5842 "end": {
5799 "column": 3, 5843 "column": 3,
5800 "line": 259 5844 "line": 263
5801 }, 5845 },
5802 "file": "src/lib/Menu.js", 5846 "file": "src/lib/Menu.js",
5803 "id": "menu.workspaces", 5847 "id": "menu.workspaces",
5804 "start": { 5848 "start": {
5805 "column": 14, 5849 "column": 14,
5806 "line": 256 5850 "line": 260
5807 } 5851 }
5808 }, 5852 },
5809 { 5853 {
5810 "defaultMessage": "!!!Default", 5854 "defaultMessage": "!!!Default",
5811 "end": { 5855 "end": {
5812 "column": 3, 5856 "column": 3,
5813 "line": 263 5857 "line": 267
5814 }, 5858 },
5815 "file": "src/lib/Menu.js", 5859 "file": "src/lib/Menu.js",
5816 "id": "menu.workspaces.defaultWorkspace", 5860 "id": "menu.workspaces.defaultWorkspace",
5817 "start": { 5861 "start": {
5818 "column": 20, 5862 "column": 20,
5819 "line": 260 5863 "line": 264
5820 } 5864 }
5821 }, 5865 },
5822 { 5866 {
5823 "defaultMessage": "!!!Todos", 5867 "defaultMessage": "!!!Todos",
5824 "end": { 5868 "end": {
5825 "column": 3, 5869 "column": 3,
5826 "line": 267 5870 "line": 271
5827 }, 5871 },
5828 "file": "src/lib/Menu.js", 5872 "file": "src/lib/Menu.js",
5829 "id": "menu.todos", 5873 "id": "menu.todos",
5830 "start": { 5874 "start": {
5831 "column": 9, 5875 "column": 9,
5832 "line": 264 5876 "line": 268
5833 } 5877 }
5834 }, 5878 },
5835 { 5879 {
5836 "defaultMessage": "!!!Open Todos drawer", 5880 "defaultMessage": "!!!Open Todos drawer",
5837 "end": { 5881 "end": {
5838 "column": 3, 5882 "column": 3,
5839 "line": 271 5883 "line": 275
5840 }, 5884 },
5841 "file": "src/lib/Menu.js", 5885 "file": "src/lib/Menu.js",
5842 "id": "menu.Todoss.openTodosDrawer", 5886 "id": "menu.Todoss.openTodosDrawer",
5843 "start": { 5887 "start": {
5844 "column": 19, 5888 "column": 19,
5845 "line": 268 5889 "line": 272
5846 } 5890 }
5847 }, 5891 },
5848 { 5892 {
5849 "defaultMessage": "!!!Close Todos drawer", 5893 "defaultMessage": "!!!Close Todos drawer",
5850 "end": { 5894 "end": {
5851 "column": 3, 5895 "column": 3,
5852 "line": 275 5896 "line": 279
5853 }, 5897 },
5854 "file": "src/lib/Menu.js", 5898 "file": "src/lib/Menu.js",
5855 "id": "menu.Todoss.closeTodosDrawer", 5899 "id": "menu.Todoss.closeTodosDrawer",
5856 "start": { 5900 "start": {
5857 "column": 20, 5901 "column": 20,
5858 "line": 272 5902 "line": 276
5859 } 5903 }
5860 }, 5904 },
5861 { 5905 {
5862 "defaultMessage": "!!!Enable Todos", 5906 "defaultMessage": "!!!Enable Todos",
5863 "end": { 5907 "end": {
5864 "column": 3, 5908 "column": 3,
5865 "line": 279 5909 "line": 283
5866 }, 5910 },
5867 "file": "src/lib/Menu.js", 5911 "file": "src/lib/Menu.js",
5868 "id": "menu.todos.enableTodos", 5912 "id": "menu.todos.enableTodos",
5869 "start": { 5913 "start": {
5870 "column": 15, 5914 "column": 15,
5871 "line": 276 5915 "line": 280
5872 } 5916 }
5873 } 5917 }
5874 ], 5918 ],
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index acf8724a6..f809ac51f 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -9,6 +9,8 @@
9 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line", 9 "feature.delayApp.trial.headline": "Get the free Ferdi Professional 14 day trial and skip the line",
10 "feature.delayApp.upgrade.action": "Get a Ferdi Supporter License", 10 "feature.delayApp.upgrade.action": "Get a Ferdi Supporter License",
11 "feature.delayApp.upgrade.actionShort": "Upgrade account", 11 "feature.delayApp.upgrade.actionShort": "Upgrade account",
12 "feature.quickSwitch.info": "Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
13 "feature.quickSwitch.search": "Search...",
12 "feature.serviceLimit.limitReached": "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.", 14 "feature.serviceLimit.limitReached": "You have added {amount} out of {limit} services that are included in your plan. Please upgrade your account to add more services.",
13 "feature.shareFranz.action.email": "Send as email", 15 "feature.shareFranz.action.email": "Send as email",
14 "feature.shareFranz.action.facebook": "Share on Facebook", 16 "feature.shareFranz.action.facebook": "Share on Facebook",
@@ -109,6 +111,7 @@
109 "menu.view.exitFullScreen": "Exit Full Screen", 111 "menu.view.exitFullScreen": "Exit Full Screen",
110 "menu.view.forward": "Forward", 112 "menu.view.forward": "Forward",
111 "menu.view.lockFerdi": "Lock Ferdi", 113 "menu.view.lockFerdi": "Lock Ferdi",
114 "menu.view.openQuickSwitch": "Open Quick Switch",
112 "menu.view.reloadFranz": "Reload Ferdi", 115 "menu.view.reloadFranz": "Reload Ferdi",
113 "menu.view.reloadService": "Reload Service", 116 "menu.view.reloadService": "Reload Service",
114 "menu.view.resetZoom": "Actual Size", 117 "menu.view.resetZoom": "Actual Size",
@@ -409,4 +412,4 @@
409 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.</p>", 412 "workspaceDrawer.workspaceFeatureInfo": "<p>Ferdi Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.</p><p>You decide which services you need when and where, so we can help you stay on top of your game - or easily switch off from work whenever you want.</p>",
410 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", 413 "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings",
411 "workspaces.switchingIndicator.switchingTo": "Switching to" 414 "workspaces.switchingIndicator.switchingTo": "Switching to"
412} \ No newline at end of file 415}
diff --git a/src/i18n/locales/ua.json b/src/i18n/locales/ua.json
index 4dcfdc6e8..dfd9b6fa4 100644
--- a/src/i18n/locales/ua.json
+++ b/src/i18n/locales/ua.json
@@ -60,7 +60,7 @@
60 "infobar.buttonInstallUpdate": "Перезавантажити і встановити оновлення", 60 "infobar.buttonInstallUpdate": "Перезавантажити і встановити оновлення",
61 "infobar.requiredRequestsFailed": "Не вдалося завантажити сервіси та інформацію користувача", 61 "infobar.requiredRequestsFailed": "Не вдалося завантажити сервіси та інформацію користувача",
62 "sidebar.settings": "Налаштування", 62 "sidebar.settings": "Налаштування",
63 "sidebar.addNewService": "!!!Add new service", 63 "sidebar.addNewService": "Add new service",
64 "services.welcome": "Ласкаво просимо в Ferdi", 64 "services.welcome": "Ласкаво просимо в Ferdi",
65 "services.getStarted": "Почати", 65 "services.getStarted": "Почати",
66 "settings.account.headline": "Акаунт", 66 "settings.account.headline": "Акаунт",
diff --git a/src/i18n/locales/whitelist_en-US.json b/src/i18n/locales/whitelist_en-US.json
index 32960f8ce..fe51488c7 100644
--- a/src/i18n/locales/whitelist_en-US.json
+++ b/src/i18n/locales/whitelist_en-US.json
@@ -1,2 +1 @@
1[ []
2] \ No newline at end of file
diff --git a/src/i18n/messages/src/components/layout/AppLayout.json b/src/i18n/messages/src/components/layout/AppLayout.json
index 3b8e047b4..0625487b4 100644
--- a/src/i18n/messages/src/components/layout/AppLayout.json
+++ b/src/i18n/messages/src/components/layout/AppLayout.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Your services have been updated.", 4 "defaultMessage": "!!!Your services have been updated.",
5 "file": "src/components/layout/AppLayout.js", 5 "file": "src/components/layout/AppLayout.js",
6 "start": { 6 "start": {
7 "line": 27, 7 "line": 28,
8 "column": 19 8 "column": 19
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 30, 11 "line": 31,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Reload services", 17 "defaultMessage": "!!!Reload services",
18 "file": "src/components/layout/AppLayout.js", 18 "file": "src/components/layout/AppLayout.js",
19 "start": { 19 "start": {
20 "line": 31, 20 "line": 32,
21 "column": 24 21 "column": 24
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 34, 24 "line": 35,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Could not load services and user information", 30 "defaultMessage": "!!!Could not load services and user information",
31 "file": "src/components/layout/AppLayout.js", 31 "file": "src/components/layout/AppLayout.js",
32 "start": { 32 "start": {
33 "line": 35, 33 "line": 36,
34 "column": 26 34 "column": 26
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 38, 37 "line": 39,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.", 43 "defaultMessage": "!!!There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.",
44 "file": "src/components/layout/AppLayout.js", 44 "file": "src/components/layout/AppLayout.js",
45 "start": { 45 "start": {
46 "line": 39, 46 "line": 40,
47 "column": 21 47 "column": 21
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 42, 50 "line": 43,
51 "column": 3 51 "column": 3
52 } 52 }
53 } 53 }
diff --git a/src/i18n/messages/src/features/quickSwitch/Component.json b/src/i18n/messages/src/features/quickSwitch/Component.json
new file mode 100644
index 000000000..248925a37
--- /dev/null
+++ b/src/i18n/messages/src/features/quickSwitch/Component.json
@@ -0,0 +1,28 @@
1[
2 {
3 "id": "feature.quickSwitch.search",
4 "defaultMessage": "!!!Search...",
5 "file": "src/features/quickSwitch/Component.js",
6 "start": {
7 "line": 14,
8 "column": 10
9 },
10 "end": {
11 "line": 17,
12 "column": 3
13 }
14 },
15 {
16 "id": "feature.quickSwitch.info",
17 "defaultMessage": "!!!Select a service with TAB, ↑ and ↓. Open a service with ENTER.",
18 "file": "src/features/quickSwitch/Component.js",
19 "start": {
20 "line": 18,
21 "column": 8
22 },
23 "end": {
24 "line": 21,
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 521022edd..c09148b2f 100644
--- a/src/i18n/messages/src/lib/Menu.json
+++ b/src/i18n/messages/src/lib/Menu.json
@@ -182,15 +182,28 @@
182 } 182 }
183 }, 183 },
184 { 184 {
185 "id": "menu.view.openQuickSwitch",
186 "defaultMessage": "!!!Open Quick Switch",
187 "file": "src/lib/Menu.js",
188 "start": {
189 "line": 72,
190 "column": 19
191 },
192 "end": {
193 "line": 75,
194 "column": 3
195 }
196 },
197 {
185 "id": "menu.view.back", 198 "id": "menu.view.back",
186 "defaultMessage": "!!!Back", 199 "defaultMessage": "!!!Back",
187 "file": "src/lib/Menu.js", 200 "file": "src/lib/Menu.js",
188 "start": { 201 "start": {
189 "line": 72, 202 "line": 76,
190 "column": 8 203 "column": 8
191 }, 204 },
192 "end": { 205 "end": {
193 "line": 75, 206 "line": 79,
194 "column": 3 207 "column": 3
195 } 208 }
196 }, 209 },
@@ -199,11 +212,11 @@
199 "defaultMessage": "!!!Forward", 212 "defaultMessage": "!!!Forward",
200 "file": "src/lib/Menu.js", 213 "file": "src/lib/Menu.js",
201 "start": { 214 "start": {
202 "line": 76, 215 "line": 80,
203 "column": 11 216 "column": 11
204 }, 217 },
205 "end": { 218 "end": {
206 "line": 79, 219 "line": 83,
207 "column": 3 220 "column": 3
208 } 221 }
209 }, 222 },
@@ -212,11 +225,11 @@
212 "defaultMessage": "!!!Actual Size", 225 "defaultMessage": "!!!Actual Size",
213 "file": "src/lib/Menu.js", 226 "file": "src/lib/Menu.js",
214 "start": { 227 "start": {
215 "line": 80, 228 "line": 84,
216 "column": 13 229 "column": 13
217 }, 230 },
218 "end": { 231 "end": {
219 "line": 83, 232 "line": 87,
220 "column": 3 233 "column": 3
221 } 234 }
222 }, 235 },
@@ -225,11 +238,11 @@
225 "defaultMessage": "!!!Zoom In", 238 "defaultMessage": "!!!Zoom In",
226 "file": "src/lib/Menu.js", 239 "file": "src/lib/Menu.js",
227 "start": { 240 "start": {
228 "line": 84, 241 "line": 88,
229 "column": 10 242 "column": 10
230 }, 243 },
231 "end": { 244 "end": {
232 "line": 87, 245 "line": 91,
233 "column": 3 246 "column": 3
234 } 247 }
235 }, 248 },
@@ -238,11 +251,11 @@
238 "defaultMessage": "!!!Zoom Out", 251 "defaultMessage": "!!!Zoom Out",
239 "file": "src/lib/Menu.js", 252 "file": "src/lib/Menu.js",
240 "start": { 253 "start": {
241 "line": 88, 254 "line": 92,
242 "column": 11 255 "column": 11
243 }, 256 },
244 "end": { 257 "end": {
245 "line": 91, 258 "line": 95,
246 "column": 3 259 "column": 3
247 } 260 }
248 }, 261 },
@@ -251,11 +264,11 @@
251 "defaultMessage": "!!!Enter Full Screen", 264 "defaultMessage": "!!!Enter Full Screen",
252 "file": "src/lib/Menu.js", 265 "file": "src/lib/Menu.js",
253 "start": { 266 "start": {
254 "line": 92, 267 "line": 96,
255 "column": 19 268 "column": 19
256 }, 269 },
257 "end": { 270 "end": {
258 "line": 95, 271 "line": 99,
259 "column": 3 272 "column": 3
260 } 273 }
261 }, 274 },
@@ -264,11 +277,11 @@
264 "defaultMessage": "!!!Exit Full Screen", 277 "defaultMessage": "!!!Exit Full Screen",
265 "file": "src/lib/Menu.js", 278 "file": "src/lib/Menu.js",
266 "start": { 279 "start": {
267 "line": 96, 280 "line": 100,
268 "column": 18 281 "column": 18
269 }, 282 },
270 "end": { 283 "end": {
271 "line": 99, 284 "line": 103,
272 "column": 3 285 "column": 3
273 } 286 }
274 }, 287 },
@@ -277,11 +290,11 @@
277 "defaultMessage": "!!!Toggle Full Screen", 290 "defaultMessage": "!!!Toggle Full Screen",
278 "file": "src/lib/Menu.js", 291 "file": "src/lib/Menu.js",
279 "start": { 292 "start": {
280 "line": 100, 293 "line": 104,
281 "column": 20 294 "column": 20
282 }, 295 },
283 "end": { 296 "end": {
284 "line": 103, 297 "line": 107,
285 "column": 3 298 "column": 3
286 } 299 }
287 }, 300 },
@@ -290,11 +303,11 @@
290 "defaultMessage": "!!!Toggle Developer Tools", 303 "defaultMessage": "!!!Toggle Developer Tools",
291 "file": "src/lib/Menu.js", 304 "file": "src/lib/Menu.js",
292 "start": { 305 "start": {
293 "line": 104, 306 "line": 108,
294 "column": 18 307 "column": 18
295 }, 308 },
296 "end": { 309 "end": {
297 "line": 107, 310 "line": 111,
298 "column": 3 311 "column": 3
299 } 312 }
300 }, 313 },
@@ -303,11 +316,11 @@
303 "defaultMessage": "!!!Toggle Todos Developer Tools", 316 "defaultMessage": "!!!Toggle Todos Developer Tools",
304 "file": "src/lib/Menu.js", 317 "file": "src/lib/Menu.js",
305 "start": { 318 "start": {
306 "line": 108, 319 "line": 112,
307 "column": 23 320 "column": 23
308 }, 321 },
309 "end": { 322 "end": {
310 "line": 111, 323 "line": 115,
311 "column": 3 324 "column": 3
312 } 325 }
313 }, 326 },
@@ -316,11 +329,11 @@
316 "defaultMessage": "!!!Toggle Service Developer Tools", 329 "defaultMessage": "!!!Toggle Service Developer Tools",
317 "file": "src/lib/Menu.js", 330 "file": "src/lib/Menu.js",
318 "start": { 331 "start": {
319 "line": 112, 332 "line": 116,
320 "column": 25 333 "column": 25
321 }, 334 },
322 "end": { 335 "end": {
323 "line": 115, 336 "line": 119,
324 "column": 3 337 "column": 3
325 } 338 }
326 }, 339 },
@@ -329,11 +342,11 @@
329 "defaultMessage": "!!!Reload Service", 342 "defaultMessage": "!!!Reload Service",
330 "file": "src/lib/Menu.js", 343 "file": "src/lib/Menu.js",
331 "start": { 344 "start": {
332 "line": 116, 345 "line": 120,
333 "column": 17 346 "column": 17
334 }, 347 },
335 "end": { 348 "end": {
336 "line": 119, 349 "line": 123,
337 "column": 3 350 "column": 3
338 } 351 }
339 }, 352 },
@@ -342,11 +355,11 @@
342 "defaultMessage": "!!!Reload Ferdi", 355 "defaultMessage": "!!!Reload Ferdi",
343 "file": "src/lib/Menu.js", 356 "file": "src/lib/Menu.js",
344 "start": { 357 "start": {
345 "line": 120, 358 "line": 124,
346 "column": 15 359 "column": 15
347 }, 360 },
348 "end": { 361 "end": {
349 "line": 123, 362 "line": 127,
350 "column": 3 363 "column": 3
351 } 364 }
352 }, 365 },
@@ -355,11 +368,11 @@
355 "defaultMessage": "!!!Lock Ferdi", 368 "defaultMessage": "!!!Lock Ferdi",
356 "file": "src/lib/Menu.js", 369 "file": "src/lib/Menu.js",
357 "start": { 370 "start": {
358 "line": 124, 371 "line": 128,
359 "column": 13 372 "column": 13
360 }, 373 },
361 "end": { 374 "end": {
362 "line": 127, 375 "line": 131,
363 "column": 3 376 "column": 3
364 } 377 }
365 }, 378 },
@@ -368,11 +381,11 @@
368 "defaultMessage": "!!!Minimize", 381 "defaultMessage": "!!!Minimize",
369 "file": "src/lib/Menu.js", 382 "file": "src/lib/Menu.js",
370 "start": { 383 "start": {
371 "line": 128, 384 "line": 132,
372 "column": 12 385 "column": 12
373 }, 386 },
374 "end": { 387 "end": {
375 "line": 131, 388 "line": 135,
376 "column": 3 389 "column": 3
377 } 390 }
378 }, 391 },
@@ -381,11 +394,11 @@
381 "defaultMessage": "!!!Close", 394 "defaultMessage": "!!!Close",
382 "file": "src/lib/Menu.js", 395 "file": "src/lib/Menu.js",
383 "start": { 396 "start": {
384 "line": 132, 397 "line": 136,
385 "column": 9 398 "column": 9
386 }, 399 },
387 "end": { 400 "end": {
388 "line": 135, 401 "line": 139,
389 "column": 3 402 "column": 3
390 } 403 }
391 }, 404 },
@@ -394,11 +407,11 @@
394 "defaultMessage": "!!!Learn More", 407 "defaultMessage": "!!!Learn More",
395 "file": "src/lib/Menu.js", 408 "file": "src/lib/Menu.js",
396 "start": { 409 "start": {
397 "line": 136, 410 "line": 140,
398 "column": 13 411 "column": 13
399 }, 412 },
400 "end": { 413 "end": {
401 "line": 139, 414 "line": 143,
402 "column": 3 415 "column": 3
403 } 416 }
404 }, 417 },
@@ -407,11 +420,11 @@
407 "defaultMessage": "!!!Changelog", 420 "defaultMessage": "!!!Changelog",
408 "file": "src/lib/Menu.js", 421 "file": "src/lib/Menu.js",
409 "start": { 422 "start": {
410 "line": 140, 423 "line": 144,
411 "column": 13 424 "column": 13
412 }, 425 },
413 "end": { 426 "end": {
414 "line": 143, 427 "line": 147,
415 "column": 3 428 "column": 3
416 } 429 }
417 }, 430 },
@@ -420,11 +433,11 @@
420 "defaultMessage": "!!!Support", 433 "defaultMessage": "!!!Support",
421 "file": "src/lib/Menu.js", 434 "file": "src/lib/Menu.js",
422 "start": { 435 "start": {
423 "line": 144, 436 "line": 148,
424 "column": 11 437 "column": 11
425 }, 438 },
426 "end": { 439 "end": {
427 "line": 147, 440 "line": 151,
428 "column": 3 441 "column": 3
429 } 442 }
430 }, 443 },
@@ -433,11 +446,11 @@
433 "defaultMessage": "!!!Copy Debug Information", 446 "defaultMessage": "!!!Copy Debug Information",
434 "file": "src/lib/Menu.js", 447 "file": "src/lib/Menu.js",
435 "start": { 448 "start": {
436 "line": 148, 449 "line": 152,
437 "column": 13 450 "column": 13
438 }, 451 },
439 "end": { 452 "end": {
440 "line": 151, 453 "line": 155,
441 "column": 3 454 "column": 3
442 } 455 }
443 }, 456 },
@@ -446,11 +459,11 @@
446 "defaultMessage": "!!!Ferdi Debug Information", 459 "defaultMessage": "!!!Ferdi Debug Information",
447 "file": "src/lib/Menu.js", 460 "file": "src/lib/Menu.js",
448 "start": { 461 "start": {
449 "line": 152, 462 "line": 156,
450 "column": 27 463 "column": 27
451 }, 464 },
452 "end": { 465 "end": {
453 "line": 155, 466 "line": 159,
454 "column": 3 467 "column": 3
455 } 468 }
456 }, 469 },
@@ -459,11 +472,11 @@
459 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.", 472 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.",
460 "file": "src/lib/Menu.js", 473 "file": "src/lib/Menu.js",
461 "start": { 474 "start": {
462 "line": 156, 475 "line": 160,
463 "column": 23 476 "column": 23
464 }, 477 },
465 "end": { 478 "end": {
466 "line": 159, 479 "line": 163,
467 "column": 3 480 "column": 3
468 } 481 }
469 }, 482 },
@@ -472,11 +485,11 @@
472 "defaultMessage": "!!!Terms of Service", 485 "defaultMessage": "!!!Terms of Service",
473 "file": "src/lib/Menu.js", 486 "file": "src/lib/Menu.js",
474 "start": { 487 "start": {
475 "line": 160, 488 "line": 164,
476 "column": 7 489 "column": 7
477 }, 490 },
478 "end": { 491 "end": {
479 "line": 163, 492 "line": 167,
480 "column": 3 493 "column": 3
481 } 494 }
482 }, 495 },
@@ -485,11 +498,11 @@
485 "defaultMessage": "!!!Privacy Statement", 498 "defaultMessage": "!!!Privacy Statement",
486 "file": "src/lib/Menu.js", 499 "file": "src/lib/Menu.js",
487 "start": { 500 "start": {
488 "line": 164, 501 "line": 168,
489 "column": 11 502 "column": 11
490 }, 503 },
491 "end": { 504 "end": {
492 "line": 167, 505 "line": 171,
493 "column": 3 506 "column": 3
494 } 507 }
495 }, 508 },
@@ -498,11 +511,11 @@
498 "defaultMessage": "!!!File", 511 "defaultMessage": "!!!File",
499 "file": "src/lib/Menu.js", 512 "file": "src/lib/Menu.js",
500 "start": { 513 "start": {
501 "line": 168, 514 "line": 172,
502 "column": 8 515 "column": 8
503 }, 516 },
504 "end": { 517 "end": {
505 "line": 171, 518 "line": 175,
506 "column": 3 519 "column": 3
507 } 520 }
508 }, 521 },
@@ -511,11 +524,11 @@
511 "defaultMessage": "!!!View", 524 "defaultMessage": "!!!View",
512 "file": "src/lib/Menu.js", 525 "file": "src/lib/Menu.js",
513 "start": { 526 "start": {
514 "line": 172, 527 "line": 176,
515 "column": 8 528 "column": 8
516 }, 529 },
517 "end": { 530 "end": {
518 "line": 175, 531 "line": 179,
519 "column": 3 532 "column": 3
520 } 533 }
521 }, 534 },
@@ -524,11 +537,11 @@
524 "defaultMessage": "!!!Services", 537 "defaultMessage": "!!!Services",
525 "file": "src/lib/Menu.js", 538 "file": "src/lib/Menu.js",
526 "start": { 539 "start": {
527 "line": 176, 540 "line": 180,
528 "column": 12 541 "column": 12
529 }, 542 },
530 "end": { 543 "end": {
531 "line": 179, 544 "line": 183,
532 "column": 3 545 "column": 3
533 } 546 }
534 }, 547 },
@@ -537,11 +550,11 @@
537 "defaultMessage": "!!!Window", 550 "defaultMessage": "!!!Window",
538 "file": "src/lib/Menu.js", 551 "file": "src/lib/Menu.js",
539 "start": { 552 "start": {
540 "line": 180, 553 "line": 184,
541 "column": 10 554 "column": 10
542 }, 555 },
543 "end": { 556 "end": {
544 "line": 183, 557 "line": 187,
545 "column": 3 558 "column": 3
546 } 559 }
547 }, 560 },
@@ -550,11 +563,11 @@
550 "defaultMessage": "!!!Help", 563 "defaultMessage": "!!!Help",
551 "file": "src/lib/Menu.js", 564 "file": "src/lib/Menu.js",
552 "start": { 565 "start": {
553 "line": 184, 566 "line": 188,
554 "column": 8 567 "column": 8
555 }, 568 },
556 "end": { 569 "end": {
557 "line": 187, 570 "line": 191,
558 "column": 3 571 "column": 3
559 } 572 }
560 }, 573 },
@@ -563,11 +576,11 @@
563 "defaultMessage": "!!!About Ferdi", 576 "defaultMessage": "!!!About Ferdi",
564 "file": "src/lib/Menu.js", 577 "file": "src/lib/Menu.js",
565 "start": { 578 "start": {
566 "line": 188, 579 "line": 192,
567 "column": 9 580 "column": 9
568 }, 581 },
569 "end": { 582 "end": {
570 "line": 191, 583 "line": 195,
571 "column": 3 584 "column": 3
572 } 585 }
573 }, 586 },
@@ -576,11 +589,11 @@
576 "defaultMessage": "!!!What's new?", 589 "defaultMessage": "!!!What's new?",
577 "file": "src/lib/Menu.js", 590 "file": "src/lib/Menu.js",
578 "start": { 591 "start": {
579 "line": 192, 592 "line": 196,
580 "column": 16 593 "column": 16
581 }, 594 },
582 "end": { 595 "end": {
583 "line": 195, 596 "line": 199,
584 "column": 3 597 "column": 3
585 } 598 }
586 }, 599 },
@@ -589,11 +602,11 @@
589 "defaultMessage": "!!!Settings", 602 "defaultMessage": "!!!Settings",
590 "file": "src/lib/Menu.js", 603 "file": "src/lib/Menu.js",
591 "start": { 604 "start": {
592 "line": 196, 605 "line": 200,
593 "column": 12 606 "column": 12
594 }, 607 },
595 "end": { 608 "end": {
596 "line": 199, 609 "line": 203,
597 "column": 3 610 "column": 3
598 } 611 }
599 }, 612 },
@@ -602,11 +615,11 @@
602 "defaultMessage": "!!!Check for updates", 615 "defaultMessage": "!!!Check for updates",
603 "file": "src/lib/Menu.js", 616 "file": "src/lib/Menu.js",
604 "start": { 617 "start": {
605 "line": 200, 618 "line": 204,
606 "column": 19 619 "column": 19
607 }, 620 },
608 "end": { 621 "end": {
609 "line": 203, 622 "line": 207,
610 "column": 3 623 "column": 3
611 } 624 }
612 }, 625 },
@@ -615,11 +628,11 @@
615 "defaultMessage": "!!!Hide", 628 "defaultMessage": "!!!Hide",
616 "file": "src/lib/Menu.js", 629 "file": "src/lib/Menu.js",
617 "start": { 630 "start": {
618 "line": 204, 631 "line": 208,
619 "column": 8 632 "column": 8
620 }, 633 },
621 "end": { 634 "end": {
622 "line": 207, 635 "line": 211,
623 "column": 3 636 "column": 3
624 } 637 }
625 }, 638 },
@@ -628,11 +641,11 @@
628 "defaultMessage": "!!!Hide Others", 641 "defaultMessage": "!!!Hide Others",
629 "file": "src/lib/Menu.js", 642 "file": "src/lib/Menu.js",
630 "start": { 643 "start": {
631 "line": 208, 644 "line": 212,
632 "column": 14 645 "column": 14
633 }, 646 },
634 "end": { 647 "end": {
635 "line": 211, 648 "line": 215,
636 "column": 3 649 "column": 3
637 } 650 }
638 }, 651 },
@@ -641,11 +654,11 @@
641 "defaultMessage": "!!!Unhide", 654 "defaultMessage": "!!!Unhide",
642 "file": "src/lib/Menu.js", 655 "file": "src/lib/Menu.js",
643 "start": { 656 "start": {
644 "line": 212, 657 "line": 216,
645 "column": 10 658 "column": 10
646 }, 659 },
647 "end": { 660 "end": {
648 "line": 215, 661 "line": 219,
649 "column": 3 662 "column": 3
650 } 663 }
651 }, 664 },
@@ -654,11 +667,11 @@
654 "defaultMessage": "!!!Auto-hide menu bar", 667 "defaultMessage": "!!!Auto-hide menu bar",
655 "file": "src/lib/Menu.js", 668 "file": "src/lib/Menu.js",
656 "start": { 669 "start": {
657 "line": 216, 670 "line": 220,
658 "column": 19 671 "column": 19
659 }, 672 },
660 "end": { 673 "end": {
661 "line": 219, 674 "line": 223,
662 "column": 3 675 "column": 3
663 } 676 }
664 }, 677 },
@@ -667,11 +680,11 @@
667 "defaultMessage": "!!!Quit", 680 "defaultMessage": "!!!Quit",
668 "file": "src/lib/Menu.js", 681 "file": "src/lib/Menu.js",
669 "start": { 682 "start": {
670 "line": 220, 683 "line": 224,
671 "column": 8 684 "column": 8
672 }, 685 },
673 "end": { 686 "end": {
674 "line": 223, 687 "line": 227,
675 "column": 3 688 "column": 3
676 } 689 }
677 }, 690 },
@@ -680,11 +693,11 @@
680 "defaultMessage": "!!!Add New Service...", 693 "defaultMessage": "!!!Add New Service...",
681 "file": "src/lib/Menu.js", 694 "file": "src/lib/Menu.js",
682 "start": { 695 "start": {
683 "line": 224, 696 "line": 228,
684 "column": 17 697 "column": 17
685 }, 698 },
686 "end": { 699 "end": {
687 "line": 227, 700 "line": 231,
688 "column": 3 701 "column": 3
689 } 702 }
690 }, 703 },
@@ -693,11 +706,11 @@
693 "defaultMessage": "!!!Add New Workspace...", 706 "defaultMessage": "!!!Add New Workspace...",
694 "file": "src/lib/Menu.js", 707 "file": "src/lib/Menu.js",
695 "start": { 708 "start": {
696 "line": 228, 709 "line": 232,
697 "column": 19 710 "column": 19
698 }, 711 },
699 "end": { 712 "end": {
700 "line": 231, 713 "line": 235,
701 "column": 3 714 "column": 3
702 } 715 }
703 }, 716 },
@@ -706,11 +719,11 @@
706 "defaultMessage": "!!!Open workspace drawer", 719 "defaultMessage": "!!!Open workspace drawer",
707 "file": "src/lib/Menu.js", 720 "file": "src/lib/Menu.js",
708 "start": { 721 "start": {
709 "line": 232, 722 "line": 236,
710 "column": 23 723 "column": 23
711 }, 724 },
712 "end": { 725 "end": {
713 "line": 235, 726 "line": 239,
714 "column": 3 727 "column": 3
715 } 728 }
716 }, 729 },
@@ -719,11 +732,11 @@
719 "defaultMessage": "!!!Close workspace drawer", 732 "defaultMessage": "!!!Close workspace drawer",
720 "file": "src/lib/Menu.js", 733 "file": "src/lib/Menu.js",
721 "start": { 734 "start": {
722 "line": 236, 735 "line": 240,
723 "column": 24 736 "column": 24
724 }, 737 },
725 "end": { 738 "end": {
726 "line": 239, 739 "line": 243,
727 "column": 3 740 "column": 3
728 } 741 }
729 }, 742 },
@@ -732,11 +745,11 @@
732 "defaultMessage": "!!!Activate next service...", 745 "defaultMessage": "!!!Activate next service...",
733 "file": "src/lib/Menu.js", 746 "file": "src/lib/Menu.js",
734 "start": { 747 "start": {
735 "line": 240, 748 "line": 244,
736 "column": 23 749 "column": 23
737 }, 750 },
738 "end": { 751 "end": {
739 "line": 243, 752 "line": 247,
740 "column": 3 753 "column": 3
741 } 754 }
742 }, 755 },
@@ -745,11 +758,11 @@
745 "defaultMessage": "!!!Activate previous service...", 758 "defaultMessage": "!!!Activate previous service...",
746 "file": "src/lib/Menu.js", 759 "file": "src/lib/Menu.js",
747 "start": { 760 "start": {
748 "line": 244, 761 "line": 248,
749 "column": 27 762 "column": 27
750 }, 763 },
751 "end": { 764 "end": {
752 "line": 247, 765 "line": 251,
753 "column": 3 766 "column": 3
754 } 767 }
755 }, 768 },
@@ -758,11 +771,11 @@
758 "defaultMessage": "!!!Disable notifications & audio", 771 "defaultMessage": "!!!Disable notifications & audio",
759 "file": "src/lib/Menu.js", 772 "file": "src/lib/Menu.js",
760 "start": { 773 "start": {
761 "line": 248, 774 "line": 252,
762 "column": 11 775 "column": 11
763 }, 776 },
764 "end": { 777 "end": {
765 "line": 251, 778 "line": 255,
766 "column": 3 779 "column": 3
767 } 780 }
768 }, 781 },
@@ -771,11 +784,11 @@
771 "defaultMessage": "!!!Enable notifications & audio", 784 "defaultMessage": "!!!Enable notifications & audio",
772 "file": "src/lib/Menu.js", 785 "file": "src/lib/Menu.js",
773 "start": { 786 "start": {
774 "line": 252, 787 "line": 256,
775 "column": 13 788 "column": 13
776 }, 789 },
777 "end": { 790 "end": {
778 "line": 255, 791 "line": 259,
779 "column": 3 792 "column": 3
780 } 793 }
781 }, 794 },
@@ -784,11 +797,11 @@
784 "defaultMessage": "!!!Workspaces", 797 "defaultMessage": "!!!Workspaces",
785 "file": "src/lib/Menu.js", 798 "file": "src/lib/Menu.js",
786 "start": { 799 "start": {
787 "line": 256, 800 "line": 260,
788 "column": 14 801 "column": 14
789 }, 802 },
790 "end": { 803 "end": {
791 "line": 259, 804 "line": 263,
792 "column": 3 805 "column": 3
793 } 806 }
794 }, 807 },
@@ -797,11 +810,11 @@
797 "defaultMessage": "!!!Default", 810 "defaultMessage": "!!!Default",
798 "file": "src/lib/Menu.js", 811 "file": "src/lib/Menu.js",
799 "start": { 812 "start": {
800 "line": 260, 813 "line": 264,
801 "column": 20 814 "column": 20
802 }, 815 },
803 "end": { 816 "end": {
804 "line": 263, 817 "line": 267,
805 "column": 3 818 "column": 3
806 } 819 }
807 }, 820 },
@@ -810,11 +823,11 @@
810 "defaultMessage": "!!!Todos", 823 "defaultMessage": "!!!Todos",
811 "file": "src/lib/Menu.js", 824 "file": "src/lib/Menu.js",
812 "start": { 825 "start": {
813 "line": 264, 826 "line": 268,
814 "column": 9 827 "column": 9
815 }, 828 },
816 "end": { 829 "end": {
817 "line": 267, 830 "line": 271,
818 "column": 3 831 "column": 3
819 } 832 }
820 }, 833 },
@@ -823,11 +836,11 @@
823 "defaultMessage": "!!!Open Todos drawer", 836 "defaultMessage": "!!!Open Todos drawer",
824 "file": "src/lib/Menu.js", 837 "file": "src/lib/Menu.js",
825 "start": { 838 "start": {
826 "line": 268, 839 "line": 272,
827 "column": 19 840 "column": 19
828 }, 841 },
829 "end": { 842 "end": {
830 "line": 271, 843 "line": 275,
831 "column": 3 844 "column": 3
832 } 845 }
833 }, 846 },
@@ -836,11 +849,11 @@
836 "defaultMessage": "!!!Close Todos drawer", 849 "defaultMessage": "!!!Close Todos drawer",
837 "file": "src/lib/Menu.js", 850 "file": "src/lib/Menu.js",
838 "start": { 851 "start": {
839 "line": 272, 852 "line": 276,
840 "column": 20 853 "column": 20
841 }, 854 },
842 "end": { 855 "end": {
843 "line": 275, 856 "line": 279,
844 "column": 3 857 "column": 3
845 } 858 }
846 }, 859 },
@@ -849,11 +862,11 @@
849 "defaultMessage": "!!!Enable Todos", 862 "defaultMessage": "!!!Enable Todos",
850 "file": "src/lib/Menu.js", 863 "file": "src/lib/Menu.js",
851 "start": { 864 "start": {
852 "line": 276, 865 "line": 280,
853 "column": 15 866 "column": 15
854 }, 867 },
855 "end": { 868 "end": {
856 "line": 279, 869 "line": 283,
857 "column": 3 870 "column": 3
858 } 871 }
859 } 872 }
diff --git a/src/lib/Menu.js b/src/lib/Menu.js
index 2898fcad1..5b04346b5 100644
--- a/src/lib/Menu.js
+++ b/src/lib/Menu.js
@@ -69,6 +69,10 @@ const menuItems = defineMessages({
69 id: 'menu.edit.emojiSymbols', 69 id: 'menu.edit.emojiSymbols',
70 defaultMessage: '!!!Emoji & Symbols', 70 defaultMessage: '!!!Emoji & Symbols',
71 }, 71 },
72 openQuickSwitch: {
73 id: 'menu.view.openQuickSwitch',
74 defaultMessage: '!!!Open Quick Switch',
75 },
72 back: { 76 back: {
73 id: 'menu.view.back', 77 id: 'menu.view.back',
74 defaultMessage: '!!!Back', 78 defaultMessage: '!!!Back',
@@ -336,6 +340,16 @@ const _templateFactory = intl => [
336 type: 'separator', 340 type: 'separator',
337 }, 341 },
338 { 342 {
343 label: intl.formatMessage(menuItems.openQuickSwitch),
344 accelerator: 'CmdOrCtrl+P',
345 click() {
346 window.ferdi.features.quickSwitch.state.isModalVisible = true;
347 },
348 },
349 {
350 type: 'separator',
351 },
352 {
339 label: intl.formatMessage(menuItems.back), 353 label: intl.formatMessage(menuItems.back),
340 accelerator: 'CmdOrCtrl+Left', 354 accelerator: 'CmdOrCtrl+Left',
341 click() { 355 click() {
diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js
index cf28b6bec..c39b6d7f3 100644
--- a/src/stores/FeaturesStore.js
+++ b/src/stores/FeaturesStore.js
@@ -13,6 +13,7 @@ import spellchecker from '../features/spellchecker';
13import serviceProxy from '../features/serviceProxy'; 13import serviceProxy from '../features/serviceProxy';
14import basicAuth from '../features/basicAuth'; 14import basicAuth from '../features/basicAuth';
15import workspaces from '../features/workspaces'; 15import workspaces from '../features/workspaces';
16import quickSwitch from '../features/quickSwitch';
16import shareFranz from '../features/shareFranz'; 17import shareFranz from '../features/shareFranz';
17import announcements from '../features/announcements'; 18import announcements from '../features/announcements';
18import settingsWS from '../features/settingsWS'; 19import settingsWS from '../features/settingsWS';
@@ -75,6 +76,7 @@ export default class FeaturesStore extends Store {
75 serviceProxy(this.stores, this.actions); 76 serviceProxy(this.stores, this.actions);
76 basicAuth(this.stores, this.actions); 77 basicAuth(this.stores, this.actions);
77 workspaces(this.stores, this.actions); 78 workspaces(this.stores, this.actions);
79 quickSwitch(this.stores, this.actions);
78 shareFranz(this.stores, this.actions); 80 shareFranz(this.stores, this.actions);
79 announcements(this.stores, this.actions); 81 announcements(this.stores, this.actions);
80 settingsWS(this.stores, this.actions); 82 settingsWS(this.stores, this.actions);