diff options
Diffstat (limited to 'src/lib/Menu.js')
-rw-r--r-- | src/lib/Menu.js | 104 |
1 files changed, 103 insertions, 1 deletions
diff --git a/src/lib/Menu.js b/src/lib/Menu.js index e0dfd736e..81efaf18f 100644 --- a/src/lib/Menu.js +++ b/src/lib/Menu.js | |||
@@ -1,4 +1,4 @@ | |||
1 | import { remote, shell } from 'electron'; | 1 | import { remote, shell, clipboard } from 'electron'; |
2 | import { observable, autorun } from 'mobx'; | 2 | import { observable, autorun } from 'mobx'; |
3 | import { defineMessages } from 'react-intl'; | 3 | import { defineMessages } from 'react-intl'; |
4 | 4 | ||
@@ -8,6 +8,9 @@ import { workspaceActions } from '../features/workspaces/actions'; | |||
8 | import { gaEvent } from './analytics'; | 8 | import { gaEvent } from './analytics'; |
9 | import { announcementActions } from '../features/announcements/actions'; | 9 | import { announcementActions } from '../features/announcements/actions'; |
10 | import { announcementsStore } from '../features/announcements'; | 10 | import { announcementsStore } from '../features/announcements'; |
11 | import TodoStore from '../features/todos/store'; | ||
12 | import { GA_CATEGORY_TODOS, todosStore } from '../features/todos'; | ||
13 | import { todoActions } from '../features/todos/actions'; | ||
11 | 14 | ||
12 | const { app, Menu, dialog } = remote; | 15 | const { app, Menu, dialog } = remote; |
13 | 16 | ||
@@ -96,6 +99,10 @@ const menuItems = defineMessages({ | |||
96 | id: 'menu.view.toggleDevTools', | 99 | id: 'menu.view.toggleDevTools', |
97 | defaultMessage: '!!!Toggle Developer Tools', | 100 | defaultMessage: '!!!Toggle Developer Tools', |
98 | }, | 101 | }, |
102 | toggleTodosDevTools: { | ||
103 | id: 'menu.view.toggleTodosDevTools', | ||
104 | defaultMessage: '!!!Toggle Todos Developer Tools', | ||
105 | }, | ||
99 | toggleServiceDevTools: { | 106 | toggleServiceDevTools: { |
100 | id: 'menu.view.toggleServiceDevTools', | 107 | id: 'menu.view.toggleServiceDevTools', |
101 | defaultMessage: '!!!Toggle Service Developer Tools', | 108 | defaultMessage: '!!!Toggle Service Developer Tools', |
@@ -128,6 +135,18 @@ const menuItems = defineMessages({ | |||
128 | id: 'menu.help.support', | 135 | id: 'menu.help.support', |
129 | defaultMessage: '!!!Support', | 136 | defaultMessage: '!!!Support', |
130 | }, | 137 | }, |
138 | debugInfo: { | ||
139 | id: 'menu.help.debugInfo', | ||
140 | defaultMessage: '!!!Copy Debug Information', | ||
141 | }, | ||
142 | debugInfoCopiedHeadline: { | ||
143 | id: 'menu.help.debugInfoCopiedHeadline', | ||
144 | defaultMessage: '!!!Franz Debug Information', | ||
145 | }, | ||
146 | debugInfoCopiedBody: { | ||
147 | id: 'menu.help.debugInfoCopiedBody', | ||
148 | defaultMessage: '!!!Your Debug Information has been copied to your clipboard.', | ||
149 | }, | ||
131 | tos: { | 150 | tos: { |
132 | id: 'menu.help.tos', | 151 | id: 'menu.help.tos', |
133 | defaultMessage: '!!!Terms of Service', | 152 | defaultMessage: '!!!Terms of Service', |
@@ -228,6 +247,18 @@ const menuItems = defineMessages({ | |||
228 | id: 'menu.workspaces.defaultWorkspace', | 247 | id: 'menu.workspaces.defaultWorkspace', |
229 | defaultMessage: '!!!Default', | 248 | defaultMessage: '!!!Default', |
230 | }, | 249 | }, |
250 | todos: { | ||
251 | id: 'menu.todos', | ||
252 | defaultMessage: '!!!Todos', | ||
253 | }, | ||
254 | openTodosDrawer: { | ||
255 | id: 'menu.Todoss.openTodosDrawer', | ||
256 | defaultMessage: '!!!Open Todos drawer', | ||
257 | }, | ||
258 | closeTodosDrawer: { | ||
259 | id: 'menu.Todoss.closeTodosDrawer', | ||
260 | defaultMessage: '!!!Close Todos drawer', | ||
261 | }, | ||
231 | }); | 262 | }); |
232 | 263 | ||
233 | function getActiveWebview() { | 264 | function getActiveWebview() { |
@@ -336,6 +367,11 @@ const _templateFactory = intl => [ | |||
336 | visible: workspaceStore.isFeatureEnabled, | 367 | visible: workspaceStore.isFeatureEnabled, |
337 | }, | 368 | }, |
338 | { | 369 | { |
370 | label: intl.formatMessage(menuItems.todos), | ||
371 | submenu: [], | ||
372 | visible: todosStore.isFeatureEnabled, | ||
373 | }, | ||
374 | { | ||
339 | label: intl.formatMessage(menuItems.window), | 375 | label: intl.formatMessage(menuItems.window), |
340 | role: 'window', | 376 | role: 'window', |
341 | submenu: [ | 377 | submenu: [ |
@@ -608,6 +644,17 @@ export default class FranzMenu { | |||
608 | enabled: this.stores.user.isLoggedIn && this.stores.services.enabled.length > 0, | 644 | enabled: this.stores.user.isLoggedIn && this.stores.services.enabled.length > 0, |
609 | }); | 645 | }); |
610 | 646 | ||
647 | if (this.stores.features.features.isTodosEnabled) { | ||
648 | tpl[1].submenu.push({ | ||
649 | label: intl.formatMessage(menuItems.toggleTodosDevTools), | ||
650 | accelerator: `${cmdKey}+Shift+Alt+O`, | ||
651 | click: () => { | ||
652 | const webview = document.querySelector('webview[partition="persist:todos"]'); | ||
653 | if (webview) webview.openDevTools(); | ||
654 | }, | ||
655 | }); | ||
656 | } | ||
657 | |||
611 | tpl[1].submenu.unshift({ | 658 | tpl[1].submenu.unshift({ |
612 | label: intl.formatMessage(menuItems.reloadService), | 659 | label: intl.formatMessage(menuItems.reloadService), |
613 | id: 'reloadService', // TODO: needed? | 660 | id: 'reloadService', // TODO: needed? |
@@ -760,6 +807,14 @@ export default class FranzMenu { | |||
760 | tpl[4].submenu = this.workspacesMenu(); | 807 | tpl[4].submenu = this.workspacesMenu(); |
761 | } | 808 | } |
762 | 809 | ||
810 | if (todosStore.isFeatureEnabled) { | ||
811 | tpl[5].submenu = this.todosMenu(); | ||
812 | } | ||
813 | |||
814 | tpl[tpl.length - 1].submenu.push({ | ||
815 | type: 'separator', | ||
816 | }, this.debugMenu()); | ||
817 | |||
763 | this.currentTemplate = tpl; | 818 | this.currentTemplate = tpl; |
764 | const menu = Menu.buildFromTemplate(tpl); | 819 | const menu = Menu.buildFromTemplate(tpl); |
765 | Menu.setApplicationMenu(menu); | 820 | Menu.setApplicationMenu(menu); |
@@ -870,6 +925,53 @@ export default class FranzMenu { | |||
870 | return menu; | 925 | return menu; |
871 | } | 926 | } |
872 | 927 | ||
928 | todosMenu() { | ||
929 | const { isTodosPanelVisible } = TodoStore; | ||
930 | const { intl } = window.franz; | ||
931 | const menu = []; | ||
932 | |||
933 | // Open todos drawer: | ||
934 | const drawerLabel = ( | ||
935 | isTodosPanelVisible ? menuItems.closeTodosDrawer : menuItems.openTodosDrawer | ||
936 | ); | ||
937 | menu.push({ | ||
938 | label: intl.formatMessage(drawerLabel), | ||
939 | accelerator: `${cmdKey}+T`, | ||
940 | click: () => { | ||
941 | todoActions.toggleTodosPanel(); | ||
942 | gaEvent(GA_CATEGORY_TODOS, 'toggleDrawer', 'menu'); | ||
943 | }, | ||
944 | enabled: this.stores.user.isLoggedIn, | ||
945 | }, { | ||
946 | type: 'separator', | ||
947 | }); | ||
948 | |||
949 | return menu; | ||
950 | } | ||
951 | |||
952 | |||
953 | debugMenu() { | ||
954 | const { intl } = window.franz; | ||
955 | |||
956 | return { | ||
957 | label: intl.formatMessage(menuItems.debugInfo), | ||
958 | click: () => { | ||
959 | const { debugInfo } = this.stores.app; | ||
960 | |||
961 | clipboard.write({ | ||
962 | text: JSON.stringify(debugInfo), | ||
963 | }); | ||
964 | |||
965 | this.actions.app.notify({ | ||
966 | title: intl.formatMessage(menuItems.debugInfoCopiedHeadline), | ||
967 | options: { | ||
968 | body: intl.formatMessage(menuItems.debugInfoCopiedBody), | ||
969 | }, | ||
970 | }); | ||
971 | }, | ||
972 | }; | ||
973 | } | ||
974 | |||
873 | _getServiceName(service) { | 975 | _getServiceName(service) { |
874 | if (service.name) { | 976 | if (service.name) { |
875 | return service.name; | 977 | return service.name; |