mirror of
https://github.com/zulip/zulip-desktop.git
synced 2025-11-04 22:13:13 +00:00
Compare commits
26 Commits
v1.4.0
...
disable-au
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7194e788e4 | ||
|
|
6dd79b205c | ||
|
|
538c18fa90 | ||
|
|
29e347c511 | ||
|
|
ad37a5e0a6 | ||
|
|
352b775e27 | ||
|
|
38cec25680 | ||
|
|
f77ab92202 | ||
|
|
e843a29316 | ||
|
|
85837242e7 | ||
|
|
9f6da5712e | ||
|
|
158685a869 | ||
|
|
288b1cb3f2 | ||
|
|
e24a966d48 | ||
|
|
306feb2eff | ||
|
|
f426c932b0 | ||
|
|
26172d8508 | ||
|
|
99da0a338f | ||
|
|
9599249b31 | ||
|
|
4bdd2564b7 | ||
|
|
4dcf22a53c | ||
|
|
0dc97648a0 | ||
|
|
787f097cf3 | ||
|
|
5481d55c66 | ||
|
|
2a052b2c38 | ||
|
|
bcabb615b4 |
@@ -49,6 +49,10 @@ function createMainWindow() {
|
|||||||
defaultWidth: 1000,
|
defaultWidth: 1000,
|
||||||
defaultHeight: 600
|
defaultHeight: 600
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Let's keep the window position global so that we can access it in other process
|
||||||
|
global.mainWindowState = mainWindowState;
|
||||||
|
|
||||||
const win = new electron.BrowserWindow({
|
const win = new electron.BrowserWindow({
|
||||||
// This settings needs to be saved in config
|
// This settings needs to be saved in config
|
||||||
title: 'Zulip',
|
title: 'Zulip',
|
||||||
@@ -188,6 +192,12 @@ app.on('ready', () => {
|
|||||||
page.send('destroytray');
|
page.send('destroytray');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ipcMain.on('clear-app-settings', () => {
|
||||||
|
global.mainWindowState.unmanage(mainWindow);
|
||||||
|
app.relaunch();
|
||||||
|
app.exit();
|
||||||
|
});
|
||||||
|
|
||||||
ipcMain.on('toggle-app', () => {
|
ipcMain.on('toggle-app', () => {
|
||||||
if (mainWindow.isVisible()) {
|
if (mainWindow.isVisible()) {
|
||||||
mainWindow.hide();
|
mainWindow.hide();
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
const os = require('os');
|
const os = require('os');
|
||||||
const {dialog, app, shell, BrowserWindow, Menu} = require('electron');
|
const path = require('path');
|
||||||
|
|
||||||
|
const { app, shell, BrowserWindow, Menu } = require('electron');
|
||||||
|
|
||||||
|
const fs = require('fs-extra');
|
||||||
|
|
||||||
const ConfigUtil = require(__dirname + '/../renderer/js/utils/config-util.js');
|
const ConfigUtil = require(__dirname + '/../renderer/js/utils/config-util.js');
|
||||||
|
|
||||||
@@ -164,7 +168,7 @@ class AppMenu {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getDarwinTpl(props) {
|
getDarwinTpl(props) {
|
||||||
const {tabs, activeTabIndex} = props;
|
const { tabs, activeTabIndex } = props;
|
||||||
|
|
||||||
return [{
|
return [{
|
||||||
label: `${app.getName()}`,
|
label: `${app.getName()}`,
|
||||||
@@ -196,9 +200,10 @@ class AppMenu {
|
|||||||
}, {
|
}, {
|
||||||
type: 'separator'
|
type: 'separator'
|
||||||
}, {
|
}, {
|
||||||
label: 'Clear Cache',
|
label: 'Reset App Settings',
|
||||||
|
accelerator: 'Command+Shift+D',
|
||||||
click() {
|
click() {
|
||||||
AppMenu.clearCache();
|
AppMenu.resetAppSettings();
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
label: 'Log Out',
|
label: 'Log Out',
|
||||||
@@ -263,7 +268,7 @@ class AppMenu {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getOtherTpl(props) {
|
getOtherTpl(props) {
|
||||||
const {tabs, activeTabIndex} = props;
|
const { tabs, activeTabIndex } = props;
|
||||||
|
|
||||||
return [{
|
return [{
|
||||||
label: 'File',
|
label: 'File',
|
||||||
@@ -297,9 +302,10 @@ class AppMenu {
|
|||||||
}, {
|
}, {
|
||||||
type: 'separator'
|
type: 'separator'
|
||||||
}, {
|
}, {
|
||||||
label: 'Clear Cache',
|
label: 'Reset App Settings',
|
||||||
|
accelerator: 'Ctrl+Shift+D',
|
||||||
click() {
|
click() {
|
||||||
AppMenu.clearCache();
|
AppMenu.resetAppSettings();
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
label: 'Log Out',
|
label: 'Log Out',
|
||||||
@@ -363,11 +369,11 @@ class AppMenu {
|
|||||||
win.webContents.send(action, ...params);
|
win.webContents.send(action, ...params);
|
||||||
}
|
}
|
||||||
|
|
||||||
static clearCache() {
|
static resetAppSettings() {
|
||||||
const win = BrowserWindow.getAllWindows()[0];
|
const getAppPath = path.join(app.getPath('appData'), appName, 'window-state.json');
|
||||||
const ses = win.webContents.session;
|
|
||||||
ses.clearCache(() => {
|
fs.unlink(getAppPath, () => {
|
||||||
dialog.showMessageBox({type: 'info', buttons: [], message: 'Cache cleared!'});
|
setTimeout(() => AppMenu.sendAction('clear-app-data'), 1000);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,11 +4,49 @@ body {
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
cursor: default;
|
cursor: default;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
|
font-family: menu, "Helvetica Neue", sans-serif;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
color: #333;
|
color: #333;
|
||||||
background: #efefef;
|
background: #efefef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kbd {
|
||||||
|
padding: 0.1em 0.6em;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
font-size: 12px;
|
||||||
|
font-family: Arial,Helvetica,sans-serif;
|
||||||
|
background-color: #f7f7f7;
|
||||||
|
color: #333;
|
||||||
|
-moz-box-shadow: 0 1px 0px rgba(0, 0, 0, 0.2),0 0 0 2px #ffffff inset;
|
||||||
|
-webkit-box-shadow: 0 1px 0px rgba(0, 0, 0, 0.2),0 0 0 2px #ffffff inset;
|
||||||
|
box-shadow: 0 1px 0px rgba(0, 0, 0, 0.2),0 0 0 2px #ffffff inset;
|
||||||
|
-moz-border-radius: 3px;
|
||||||
|
-webkit-border-radius: 3px;
|
||||||
|
border-radius: 3px;
|
||||||
|
display: inline-block;
|
||||||
|
margin: 0 0.1em;
|
||||||
|
text-shadow: 0 1px 0 #fff;
|
||||||
|
line-height: 1.4;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
table, th, td {
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
|
||||||
|
table { width: 85%; }
|
||||||
|
|
||||||
|
table tr:nth-child(even) { background-color: #f2f2f2; }
|
||||||
|
|
||||||
|
td { padding: 5px; }
|
||||||
|
|
||||||
|
td:nth-child(odd) {
|
||||||
|
text-align: right;
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Material Icons';
|
font-family: 'Material Icons';
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
@@ -247,4 +285,30 @@ i.open-tab-button {
|
|||||||
padding: 0 5px;
|
padding: 0 5px;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.reset-data-button {
|
||||||
|
display: inline-block;
|
||||||
|
width: 120px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 11px;
|
||||||
|
transition: background-color 0.2s ease;
|
||||||
|
text-decoration: none;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.reset-data-button:hover {
|
||||||
|
background-color: #32a692;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
#open-shortcuts-url {
|
||||||
|
color: #08c;
|
||||||
|
cursor: pointer;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#open-shortcuts-url:hover {
|
||||||
|
color: #005580;;
|
||||||
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
require(__dirname + '/js/tray.js');
|
require(__dirname + '/js/tray.js');
|
||||||
const {ipcRenderer, remote} = require('electron');
|
const { ipcRenderer, remote } = require('electron');
|
||||||
|
|
||||||
const {session} = remote;
|
const { session } = remote;
|
||||||
|
|
||||||
const DomainUtil = require(__dirname + '/js/utils/domain-util.js');
|
const DomainUtil = require(__dirname + '/js/utils/domain-util.js');
|
||||||
const WebView = require(__dirname + '/js/components/webview.js');
|
const WebView = require(__dirname + '/js/components/webview.js');
|
||||||
@@ -116,17 +116,17 @@ class ServerManagerView {
|
|||||||
this.$settingsButton.addEventListener('click', () => {
|
this.$settingsButton.addEventListener('click', () => {
|
||||||
this.openSettings('General');
|
this.openSettings('General');
|
||||||
});
|
});
|
||||||
this.$reloadButton.addEventListener('mouseover', () => {
|
|
||||||
this.$reloadTooltip.removeAttribute('style');
|
this.sidebarHoverEvent(this.$settingsButton, this.$settingsTooltip);
|
||||||
|
this.sidebarHoverEvent(this.$reloadButton, this.$reloadTooltip);
|
||||||
|
}
|
||||||
|
|
||||||
|
sidebarHoverEvent(SidebarButton, SidebarTooltip) {
|
||||||
|
SidebarButton.addEventListener('mouseover', () => {
|
||||||
|
SidebarTooltip.removeAttribute('style');
|
||||||
});
|
});
|
||||||
this.$reloadButton.addEventListener('mouseout', () => {
|
SidebarButton.addEventListener('mouseout', () => {
|
||||||
this.$reloadTooltip.style.display = 'none';
|
SidebarTooltip.style.display = 'none';
|
||||||
});
|
|
||||||
this.$settingsButton.addEventListener('mouseover', () => {
|
|
||||||
this.$settingsTooltip.removeAttribute('style');
|
|
||||||
});
|
|
||||||
this.$settingsButton.addEventListener('mouseout', () => {
|
|
||||||
this.$settingsTooltip.style.display = 'none';
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -301,6 +301,10 @@ class ServerManagerView {
|
|||||||
ipcRenderer.send('reload-full-app');
|
ipcRenderer.send('reload-full-app');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ipcRenderer.on('clear-app-data', () => {
|
||||||
|
ipcRenderer.send('clear-app-settings');
|
||||||
|
});
|
||||||
|
|
||||||
ipcRenderer.on('switch-server-tab', (event, index) => {
|
ipcRenderer.on('switch-server-tab', (event, index) => {
|
||||||
this.activateTab(index);
|
this.activateTab(index);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const {remote} = require('electron');
|
const { remote } = require('electron');
|
||||||
|
|
||||||
const ConfigUtil = require(__dirname + '/utils/config-util.js');
|
const ConfigUtil = require(__dirname + '/utils/config-util.js');
|
||||||
|
|
||||||
@@ -12,11 +12,13 @@ app.setAppUserModelId('org.zulip.zulip-electron');
|
|||||||
|
|
||||||
const NativeNotification = window.Notification;
|
const NativeNotification = window.Notification;
|
||||||
|
|
||||||
class SilentNotification extends NativeNotification {
|
class baseNotification extends NativeNotification {
|
||||||
constructor(title, opts) {
|
constructor(title, opts) {
|
||||||
opts.silent = ConfigUtil.getConfigItem('silent') || false;
|
opts.silent = ConfigUtil.getConfigItem('silent') || false;
|
||||||
super(title, opts);
|
// calling super without passing arguments will fail to constuct Notification
|
||||||
|
// and will result in no notification. It's a hack (not an ideal way) for deleting the window notification
|
||||||
|
ConfigUtil.getConfigItem('showNotification') ? super(title, opts) : super(); // eslint-disable-line no-unused-expressions
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
window.Notification = SilentNotification;
|
window.Notification = baseNotification;
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
const { ipcRenderer } = require('electron');
|
const { ipcRenderer } = require('electron');
|
||||||
|
const { app, dialog } = require('electron').remote;
|
||||||
|
|
||||||
|
const fs = require('fs-extra');
|
||||||
|
|
||||||
const BaseSection = require(__dirname + '/base-section.js');
|
const BaseSection = require(__dirname + '/base-section.js');
|
||||||
const ConfigUtil = require(__dirname + '/../../utils/config-util.js');
|
const ConfigUtil = require(__dirname + '/../../utils/config-util.js');
|
||||||
@@ -29,9 +34,13 @@ class GeneralSection extends BaseSection {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="title">Desktop Notification</div>
|
<div class="title">Desktop Notification</div>
|
||||||
<div class="settings-card">
|
<div class="settings-card">
|
||||||
|
<div class="setting-row" id="show-notification-option">
|
||||||
|
<div class="setting-description">Show Desktop Notifications</div>
|
||||||
|
<div class="setting-control"></div>
|
||||||
|
</div>
|
||||||
<div class="setting-row" id="silent-option">
|
<div class="setting-row" id="silent-option">
|
||||||
<div class="setting-description">Mute all sounds from Zulip (requires reload)</div>
|
<div class="setting-description">Mute all sounds from Zulip</div>
|
||||||
<div class="setting-control"></div>
|
<div class="setting-control"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -41,6 +50,10 @@ class GeneralSection extends BaseSection {
|
|||||||
<div class="setting-description">Get beta updates</div>
|
<div class="setting-description">Get beta updates</div>
|
||||||
<div class="setting-control"></div>
|
<div class="setting-control"></div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="setting-row" id="autoupdate-option">
|
||||||
|
<div class="setting-description">Automatically install new updates</div>
|
||||||
|
<div class="setting-control"></div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="title">Functionality</div>
|
<div class="title">Functionality</div>
|
||||||
<div class="settings-card">
|
<div class="settings-card">
|
||||||
@@ -49,6 +62,14 @@ class GeneralSection extends BaseSection {
|
|||||||
<div class="setting-control"></div>
|
<div class="setting-control"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="title">Reset Application Data</div>
|
||||||
|
<div class="settings-card">
|
||||||
|
<div class="setting-row" id="resetdata-option">
|
||||||
|
<div class="setting-description">This will delete all application data including all added accounts and preferences
|
||||||
|
</div>
|
||||||
|
<button class="reset-data-button green">Reset App Data</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
@@ -58,9 +79,12 @@ class GeneralSection extends BaseSection {
|
|||||||
this.updateTrayOption();
|
this.updateTrayOption();
|
||||||
this.updateBadgeOption();
|
this.updateBadgeOption();
|
||||||
this.updateUpdateOption();
|
this.updateUpdateOption();
|
||||||
|
this.updateAutoUpdateOption();
|
||||||
this.updateSilentOption();
|
this.updateSilentOption();
|
||||||
this.updateSidebarOption();
|
this.updateSidebarOption();
|
||||||
this.updateStartAtLoginOption();
|
this.updateStartAtLoginOption();
|
||||||
|
this.updateResetDataOption();
|
||||||
|
this.showDesktopNotification();
|
||||||
}
|
}
|
||||||
|
|
||||||
updateTrayOption() {
|
updateTrayOption() {
|
||||||
@@ -101,6 +125,18 @@ class GeneralSection extends BaseSection {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateAutoUpdateOption() {
|
||||||
|
this.generateSettingOption({
|
||||||
|
$element: document.querySelector('#autoupdate-option .setting-control'),
|
||||||
|
value: ConfigUtil.getConfigItem('autoUpdate', true),
|
||||||
|
clickHandler: () => {
|
||||||
|
const newValue = !ConfigUtil.getConfigItem('autoUpdate');
|
||||||
|
ConfigUtil.setConfigItem('autoUpdate', newValue);
|
||||||
|
this.updateAutoUpdateOption();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
updateSilentOption() {
|
updateSilentOption() {
|
||||||
this.generateSettingOption({
|
this.generateSettingOption({
|
||||||
$element: document.querySelector('#silent-option .setting-control'),
|
$element: document.querySelector('#silent-option .setting-control'),
|
||||||
@@ -113,6 +149,18 @@ class GeneralSection extends BaseSection {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
showDesktopNotification() {
|
||||||
|
this.generateSettingOption({
|
||||||
|
$element: document.querySelector('#show-notification-option .setting-control'),
|
||||||
|
value: ConfigUtil.getConfigItem('showNotification', true),
|
||||||
|
clickHandler: () => {
|
||||||
|
const newValue = !ConfigUtil.getConfigItem('showNotification', true);
|
||||||
|
ConfigUtil.setConfigItem('showNotification', newValue);
|
||||||
|
this.showDesktopNotification();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
updateSidebarOption() {
|
updateSidebarOption() {
|
||||||
this.generateSettingOption({
|
this.generateSettingOption({
|
||||||
$element: document.querySelector('#sidebar-option .setting-control'),
|
$element: document.querySelector('#sidebar-option .setting-control'),
|
||||||
@@ -139,6 +187,31 @@ class GeneralSection extends BaseSection {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clearAppDataDialog() {
|
||||||
|
const clearAppDataMessage = 'By clicking proceed you will be removing all added accounts and preferences from Zulip. When the application restarts, it will be as if you are starting Zulip for the first time.';
|
||||||
|
const getAppPath = path.join(app.getPath('appData'), app.getName());
|
||||||
|
|
||||||
|
dialog.showMessageBox({
|
||||||
|
type: 'warning',
|
||||||
|
buttons: ['YES', 'NO'],
|
||||||
|
defaultId: 0,
|
||||||
|
message: 'Are you sure',
|
||||||
|
detail: clearAppDataMessage
|
||||||
|
}, response => {
|
||||||
|
if (response === 0) {
|
||||||
|
fs.remove(getAppPath);
|
||||||
|
setTimeout(() => ipcRenderer.send('forward-message', 'hard-reload'), 1000);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
updateResetDataOption() {
|
||||||
|
const resetDataButton = document.querySelector('#resetdata-option .reset-data-button');
|
||||||
|
resetDataButton.addEventListener('click', () => {
|
||||||
|
this.clearAppDataDialog();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = GeneralSection;
|
module.exports = GeneralSection;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ class PreferenceNav extends BaseComponent {
|
|||||||
|
|
||||||
this.props = props;
|
this.props = props;
|
||||||
|
|
||||||
this.navItems = ['General', 'Network', 'Servers'];
|
this.navItems = ['General', 'Network', 'Servers', 'Shortcuts'];
|
||||||
|
|
||||||
this.init();
|
this.init();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ const Nav = require(__dirname + '/js/pages/preference/nav.js');
|
|||||||
const ServersSection = require(__dirname + '/js/pages/preference/servers-section.js');
|
const ServersSection = require(__dirname + '/js/pages/preference/servers-section.js');
|
||||||
const GeneralSection = require(__dirname + '/js/pages/preference/general-section.js');
|
const GeneralSection = require(__dirname + '/js/pages/preference/general-section.js');
|
||||||
const NetworkSection = require(__dirname + '/js/pages/preference/network-section.js');
|
const NetworkSection = require(__dirname + '/js/pages/preference/network-section.js');
|
||||||
|
const ShortcutsSection = require(__dirname + '/js/pages/preference/shortcuts-section.js');
|
||||||
|
|
||||||
class PreferenceView extends BaseComponent {
|
class PreferenceView extends BaseComponent {
|
||||||
constructor() {
|
constructor() {
|
||||||
@@ -56,6 +57,12 @@ class PreferenceView extends BaseComponent {
|
|||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 'Shortcuts': {
|
||||||
|
this.section = new ShortcutsSection({
|
||||||
|
$root: this.$settingsContainer
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
this.section.init();
|
this.section.init();
|
||||||
|
|||||||
311
app/renderer/js/pages/preference/shortcuts-section.js
Normal file
311
app/renderer/js/pages/preference/shortcuts-section.js
Normal file
@@ -0,0 +1,311 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const BaseSection = require(__dirname + '/base-section.js');
|
||||||
|
|
||||||
|
class ShortcutsSection extends BaseSection {
|
||||||
|
constructor(props) {
|
||||||
|
super();
|
||||||
|
this.props = props;
|
||||||
|
}
|
||||||
|
|
||||||
|
templateMac() {
|
||||||
|
const userOSKey = '⌘';
|
||||||
|
|
||||||
|
return `
|
||||||
|
<div class="settings-pane">
|
||||||
|
<div class="title">Application Shortcuts</div>
|
||||||
|
<div class="settings-card">
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>,</kbd></td>
|
||||||
|
<td>Settings</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>K</kbd></td>
|
||||||
|
<td>Keyboard Shortcuts</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>Shift</kbd><kbd>${userOSKey}</kbd><kbd>D</kbd></td>
|
||||||
|
<td>Reset App Settings</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>L</kbd></td>
|
||||||
|
<td>Log Out</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>H</kbd></td>
|
||||||
|
<td>Hide Zulip</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>Option</kbd><kbd>${userOSKey}</kbd><kbd>H</kbd></td>
|
||||||
|
<td>Hide Others</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>Q</kbd></td>
|
||||||
|
<td>Quit Zulip</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div class="setting-control"></div>
|
||||||
|
</div>
|
||||||
|
<div class="title">Edit Shortcuts</div>
|
||||||
|
<div class="settings-card">
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>Z</kbd></td>
|
||||||
|
<td>Undo</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>Shift</kbd><kbd>${userOSKey}</kbd><kbd>Z</kbd></td>
|
||||||
|
<td>Redo</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>X</kbd></td>
|
||||||
|
<td>Cut</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>C</kbd></td>
|
||||||
|
<td>Copy</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>V</kbd></td>
|
||||||
|
<td>Paste</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>Shift</kbd><kbd>${userOSKey}</kbd><kbd>V</kbd></td>
|
||||||
|
<td>Paste and Match Style</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>A</kbd></td>
|
||||||
|
<td>Select All</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>F</kbd></td>
|
||||||
|
<td>Find</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>G</kbd></td>
|
||||||
|
<td>Find Next</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>Control</kbd><kbd>${userOSKey}</kbd><kbd>Space</kbd></td>
|
||||||
|
<td>Emoji & Symbols</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div class="setting-control"></div>
|
||||||
|
</div>
|
||||||
|
<div class="title">View Shortcuts</div>
|
||||||
|
<div class="settings-card">
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>R</kbd></td>
|
||||||
|
<td>Reload</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>Shift</kbd><kbd>${userOSKey}</kbd><kbd>R</kbd></td>
|
||||||
|
<td>Hard Reload</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>Control</kbd><kbd>${userOSKey}</kbd><kbd>F</kbd></td>
|
||||||
|
<td>Enter Full Screen</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>=</kbd></td>
|
||||||
|
<td>Zoom In</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>-</kbd></td>
|
||||||
|
<td>Zoom Out</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>0</kbd></td>
|
||||||
|
<td>Actual Size</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>S</kbd></td>
|
||||||
|
<td>Toggle Sidebar</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>Option</kbd><kbd>${userOSKey}</kbd><kbd>I</kbd></td>
|
||||||
|
<td>Toggle DevTools for Zulip App</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>Option</kbd><kbd>${userOSKey}</kbd><kbd>U</kbd></td>
|
||||||
|
<td>Toggle DevTools for Active Tab</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div class="setting-control"></div>
|
||||||
|
</div>
|
||||||
|
<div class="title">History Shortcuts</div>
|
||||||
|
<div class="settings-card">
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>←</kbd></td>
|
||||||
|
<td>Back</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>→</kbd></td>
|
||||||
|
<td>Forward</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div class="setting-control"></div>
|
||||||
|
</div>
|
||||||
|
<div class="title">Window Shortcuts</div>
|
||||||
|
<div class="settings-card">
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>M</kbd></td>
|
||||||
|
<td>Minimize</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd><kbd>W</kbd></td>
|
||||||
|
<td>Close</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div class="setting-control"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
templateWinLin() {
|
||||||
|
const userOSKey = 'Ctrl';
|
||||||
|
|
||||||
|
return `
|
||||||
|
<div class="settings-pane">
|
||||||
|
<div class="title">Application Shortcuts</div>
|
||||||
|
<div class="settings-card">
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>,</kbd></td>
|
||||||
|
<td>Settings</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>K</kbd></td>
|
||||||
|
<td>Keyboard Shortcuts</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>L</kbd></td>
|
||||||
|
<td>Log Out</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>Q</kbd></td>
|
||||||
|
<td>Quit Zulip</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div class="setting-control"></div>
|
||||||
|
</div>
|
||||||
|
<div class="title">Edit Shortcuts</div>
|
||||||
|
<div class="settings-card">
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>Z</kbd></td>
|
||||||
|
<td>Undo</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>Y</kbd></td>
|
||||||
|
<td>Redo</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>X</kbd></td>
|
||||||
|
<td>Cut</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>C</kbd></td>
|
||||||
|
<td>Copy</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>V</kbd></td>
|
||||||
|
<td>Paste</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>Shift</kbd> + <kbd>V</kbd></td>
|
||||||
|
<td>Paste and Match Style</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>A</kbd></td>
|
||||||
|
<td>Select All</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div class="setting-control"></div>
|
||||||
|
</div>
|
||||||
|
<div class="title">View Shortcuts</div>
|
||||||
|
<div class="settings-card">
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>R</kbd></td>
|
||||||
|
<td>Reload</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>Shift</kbd> + <kbd>R</kbd></td>
|
||||||
|
<td>Hard Reload</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>F11</kbd></td>
|
||||||
|
<td>Toggle Full Screen</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>=</kbd></td>
|
||||||
|
<td>Zoom In</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>-</kbd></td>
|
||||||
|
<td>Zoom Out</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>0</kbd></td>
|
||||||
|
<td>Actual Size</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>S</kbd></td>
|
||||||
|
<td>Toggle Sidebar</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>Shift</kbd> + <kbd>I</kbd></td>
|
||||||
|
<td>Toggle DevTools for Zulip App</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>Shift</kbd> + <kbd>U</kbd></td>
|
||||||
|
<td>Toggle DevTools for Active Tab</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div class="setting-control"></div>
|
||||||
|
</div>
|
||||||
|
<div class="title">History Shortcuts</div>
|
||||||
|
<div class="settings-card">
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>Alt</kbd> + <kbd>←</kbd></td>
|
||||||
|
<td>Back</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>Alt</kbd> + <kbd>→</kbd></td>
|
||||||
|
<td>Forward</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div class="setting-control"></div>
|
||||||
|
</div>
|
||||||
|
<div class="title">Window Shortcuts</div>
|
||||||
|
<div class="settings-card">
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>M</kbd></td>
|
||||||
|
<td>Minimize</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><kbd>${userOSKey}</kbd> + <kbd>W</kbd></td>
|
||||||
|
<td>Close</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div class="setting-control"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
|
init() {
|
||||||
|
this.props.$root.innerHTML = (process.platform === 'darwin') ?
|
||||||
|
this.templateMac() : this.templateWinLin();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = ShortcutsSection;
|
||||||
@@ -180,11 +180,10 @@ ipcRenderer.on('tray', (event, arg) => {
|
|||||||
if (!window.tray) {
|
if (!window.tray) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// We don't want to create tray from unread messages on windows and macOS since these systems already have dock badges and taskbar overlay icon.
|
// We don't want to create tray from unread messages on macOS since it already has dock badges.
|
||||||
if (process.platform === 'linux') {
|
if (process.platform === 'linux' || process.platform === 'win32') {
|
||||||
if (arg === 0) {
|
if (arg === 0) {
|
||||||
unread = arg;
|
unread = arg;
|
||||||
// Message Count // console.log("message count is zero.");
|
|
||||||
window.tray.setImage(iconPath());
|
window.tray.setImage(iconPath());
|
||||||
window.tray.setToolTip('No unread messages');
|
window.tray.setToolTip('No unread messages');
|
||||||
} else {
|
} else {
|
||||||
@@ -206,7 +205,7 @@ function toggleTray() {
|
|||||||
ConfigUtil.setConfigItem('trayIcon', false);
|
ConfigUtil.setConfigItem('trayIcon', false);
|
||||||
} else {
|
} else {
|
||||||
createTray();
|
createTray();
|
||||||
if (process.platform === 'linux') {
|
if (process.platform === 'linux' || process.platform === 'win32') {
|
||||||
renderNativeImage(unread).then(image => {
|
renderNativeImage(unread).then(image => {
|
||||||
window.tray.setImage(image);
|
window.tray.setImage(image);
|
||||||
window.tray.setToolTip(unread + ' unread messages');
|
window.tray.setToolTip(unread + ' unread messages');
|
||||||
|
|||||||
@@ -1 +1,58 @@
|
|||||||
** Windows Set up instructions **
|
** Windows Set up instructions **
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
* [Git](http://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
|
||||||
|
* [Node.js](https://nodejs.org) >= v6.9.0
|
||||||
|
* [python](https://www.python.org/downloads/release/python-2713/) (v2.7.x recommended)
|
||||||
|
* [node-gyp](https://github.com/nodejs/node-gyp#installation) (installed via powershell)
|
||||||
|
|
||||||
|
## System specific dependencies
|
||||||
|
|
||||||
|
* use only 32bit or 64bit for all of the installers, do not mix architectures
|
||||||
|
* install using default settings
|
||||||
|
* open Windows Powershell as Admin
|
||||||
|
```powershell
|
||||||
|
C:\Windows\system32> npm install --global --production windows-build-tools
|
||||||
|
```
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Clone the source locally:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ git clone https://github.com/zulip/zulip-electron
|
||||||
|
$ cd zulip-electron
|
||||||
|
```
|
||||||
|
|
||||||
|
Install project dependencies:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
Start the app:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ npm start
|
||||||
|
```
|
||||||
|
|
||||||
|
Start and watch changes
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ npm run dev
|
||||||
|
```
|
||||||
|
### Making a release
|
||||||
|
|
||||||
|
To package app into an installer use command:
|
||||||
|
```
|
||||||
|
npm run pack
|
||||||
|
npm run dist
|
||||||
|
```
|
||||||
|
It will start the packaging process. The ready for distribution file (e.g. dmg, windows installer, deb package) will be outputted to the `dist` directory.
|
||||||
|
|
||||||
|
# Troubleshooting
|
||||||
|
If you have any problems running the app please see the [most common issues](./troubleshooting.md).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user