Merge pull request #633 from yuya-oc/simplify-two-config
Simplify and split config.json into defaultPreferences and buildConfig
This commit is contained in:
commit
3a865f3d24
33
NOTICE.txt
33
NOTICE.txt
|
@ -1734,36 +1734,3 @@ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## deepmerge
|
|
||||||
|
|
||||||
This product contains 'deepmerge', a library for deep merging of JavaScript objects, by Kyle Mathews.
|
|
||||||
|
|
||||||
* HOMEPAGE:
|
|
||||||
* https://github.com/KyleAMathews/deepmerge
|
|
||||||
|
|
||||||
* LICENSE:
|
|
||||||
|
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2012 Nicholas Fisher
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
12
package.json
12
package.json
|
@ -27,15 +27,15 @@
|
||||||
"serve": "gulp watch",
|
"serve": "gulp watch",
|
||||||
"test": "npm-run-all test:* lint:*",
|
"test": "npm-run-all test:* lint:*",
|
||||||
"test:app": "npm run build && mocha --reporter mocha-circleci-reporter --recursive test/specs",
|
"test:app": "npm run build && mocha --reporter mocha-circleci-reporter --recursive test/specs",
|
||||||
"package:all": "npm-run-all package:windows package:mac package:linux",
|
"package:all": "npm-run-all check-build-config package:windows package:mac package:linux",
|
||||||
"package:windows": "npm run build && build --win --x64 --ia32 --em.name=mattermost --publish=never && npm run manipulate-windows-zip",
|
"package:windows": "npm-run-all check-build-config build && build --win --x64 --ia32 --em.name=mattermost --publish=never && npm run manipulate-windows-zip",
|
||||||
"package:mac": "npm run build && build --mac --publish=never",
|
"package:mac": "npm-run-all check-build-config build && build --mac --publish=never",
|
||||||
"package:linux": "npm run build && build --linux --x64 --ia32 --em.name=mattermost-desktop --publish=never",
|
"package:linux": "npm-run-all check-build-config build && build --linux --x64 --ia32 --em.name=mattermost-desktop --publish=never",
|
||||||
"manipulate-windows-zip": "node scripts/manipulate_windows_zip.js",
|
"manipulate-windows-zip": "node scripts/manipulate_windows_zip.js",
|
||||||
"lint:js": "eslint --ext .js --ext .jsx ."
|
"lint:js": "eslint --ext .js --ext .jsx .",
|
||||||
|
"check-build-config": "node scripts/check_build_config.js"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"deepmerge": "^1.5.2",
|
|
||||||
"7zip-bin": "^2.0.4",
|
"7zip-bin": "^2.0.4",
|
||||||
"babel-core": "^6.24.1",
|
"babel-core": "^6.24.1",
|
||||||
"babel-eslint": "^7.2.3",
|
"babel-eslint": "^7.2.3",
|
||||||
|
|
16
scripts/check_build_config.js
Normal file
16
scripts/check_build_config.js
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
const buildConfig = require('../src/common/config/buildConfig');
|
||||||
|
|
||||||
|
function validateBuildConfig(config) {
|
||||||
|
if (config.enableServerManagement === false && config.defaultTeams && config.defaultTeams.length === 0) {
|
||||||
|
return {
|
||||||
|
result: false,
|
||||||
|
message: `Specify at least one server for "defaultTeams" in buildConfig.js when "enableServerManagement is set to false.\n${JSON.stringify(config, null, 2)}`
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return {result: true};
|
||||||
|
}
|
||||||
|
|
||||||
|
const ret = validateBuildConfig(buildConfig);
|
||||||
|
if (ret.result === false) {
|
||||||
|
throw new Error(ret.message);
|
||||||
|
}
|
|
@ -8,6 +8,7 @@ const {ipcRenderer, remote} = require('electron');
|
||||||
const AutoLaunch = require('auto-launch');
|
const AutoLaunch = require('auto-launch');
|
||||||
const {debounce} = require('underscore');
|
const {debounce} = require('underscore');
|
||||||
|
|
||||||
|
const buildConfig = require('../../common/config/buildConfig');
|
||||||
const settings = require('../../common/settings');
|
const settings = require('../../common/settings');
|
||||||
|
|
||||||
const TeamList = require('./TeamList.jsx');
|
const TeamList = require('./TeamList.jsx');
|
||||||
|
@ -29,7 +30,8 @@ const CONFIG_TYPE_APP_OPTIONS = 'appOptions';
|
||||||
|
|
||||||
const SettingsPage = createReactClass({
|
const SettingsPage = createReactClass({
|
||||||
propTypes: {
|
propTypes: {
|
||||||
configFile: PropTypes.string
|
configFile: PropTypes.string,
|
||||||
|
enableServerManagement: PropTypes.bool
|
||||||
},
|
},
|
||||||
|
|
||||||
getInitialState() {
|
getInitialState() {
|
||||||
|
@ -301,8 +303,10 @@ const SettingsPage = createReactClass({
|
||||||
onTeamsChange={this.handleTeamsChange}
|
onTeamsChange={this.handleTeamsChange}
|
||||||
updateTeam={this.updateTeam}
|
updateTeam={this.updateTeam}
|
||||||
addServer={this.addServer}
|
addServer={this.addServer}
|
||||||
onTeamClick={backToIndex}
|
|
||||||
allowTeamEdit={this.state.enableTeamModification}
|
allowTeamEdit={this.state.enableTeamModification}
|
||||||
|
onTeamClick={(index) => {
|
||||||
|
backToIndex(index + buildConfig.defaultTeams.length);
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
|
@ -339,7 +343,7 @@ const SettingsPage = createReactClass({
|
||||||
);
|
);
|
||||||
|
|
||||||
var srvMgmt;
|
var srvMgmt;
|
||||||
if (this.state.enableServerManagement || this.state.teams.length === 0) {
|
if (this.props.enableServerManagement === true) {
|
||||||
srvMgmt = (
|
srvMgmt = (
|
||||||
<div>
|
<div>
|
||||||
{serversRow}
|
{serversRow}
|
||||||
|
@ -514,7 +518,7 @@ const SettingsPage = createReactClass({
|
||||||
bsStyle='link'
|
bsStyle='link'
|
||||||
style={settingsPage.close}
|
style={settingsPage.close}
|
||||||
onClick={this.handleCancel}
|
onClick={this.handleCancel}
|
||||||
disabled={this.state.teams.length === 0}
|
disabled={settings.mergeDefaultTeams(this.state.teams).length === 0}
|
||||||
>
|
>
|
||||||
<span>{'×'}</span>
|
<span>{'×'}</span>
|
||||||
</Button>
|
</Button>
|
||||||
|
|
|
@ -12,14 +12,18 @@ const {remote, ipcRenderer} = require('electron');
|
||||||
const MainPage = require('./components/MainPage.jsx');
|
const MainPage = require('./components/MainPage.jsx');
|
||||||
|
|
||||||
const AppConfig = require('./config/AppConfig.js');
|
const AppConfig = require('./config/AppConfig.js');
|
||||||
|
const buildConfig = require('../common/config/buildConfig');
|
||||||
|
const settings = require('../common/settings');
|
||||||
const url = require('url');
|
const url = require('url');
|
||||||
|
|
||||||
const badge = require('./js/badge');
|
const badge = require('./js/badge');
|
||||||
const utils = require('../utils/util');
|
const utils = require('../utils/util');
|
||||||
|
|
||||||
|
const teams = settings.mergeDefaultTeams(AppConfig.data.teams);
|
||||||
|
|
||||||
remote.getCurrentWindow().removeAllListeners('focus');
|
remote.getCurrentWindow().removeAllListeners('focus');
|
||||||
|
|
||||||
if (AppConfig.data.teams.length === 0) {
|
if (teams.length === 0) {
|
||||||
window.location = 'settings.html';
|
window.location = 'settings.html';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,8 +94,9 @@ function showUnreadBadge(unreadCount, mentionCount) {
|
||||||
const permissionRequestQueue = [];
|
const permissionRequestQueue = [];
|
||||||
const requestingPermission = new Array(AppConfig.data.teams.length);
|
const requestingPermission = new Array(AppConfig.data.teams.length);
|
||||||
|
|
||||||
function teamConfigChange(teams) {
|
function teamConfigChange(updatedTeams) {
|
||||||
AppConfig.set('teams', teams);
|
AppConfig.set('teams', updatedTeams.slice(buildConfig.defaultTeams.length));
|
||||||
|
teams.splice(0, teams.length, ...updatedTeams);
|
||||||
requestingPermission.length = teams.length;
|
requestingPermission.length = teams.length;
|
||||||
ipcRenderer.send('update-menu', AppConfig.data);
|
ipcRenderer.send('update-menu', AppConfig.data);
|
||||||
ipcRenderer.send('update-config');
|
ipcRenderer.send('update-config');
|
||||||
|
@ -157,14 +162,14 @@ if (!parsedURL.query.index || parsedURL.query.index === null) {
|
||||||
|
|
||||||
ReactDOM.render(
|
ReactDOM.render(
|
||||||
<MainPage
|
<MainPage
|
||||||
teams={AppConfig.data.teams}
|
teams={teams}
|
||||||
initialIndex={initialIndex}
|
initialIndex={initialIndex}
|
||||||
onUnreadCountChange={showUnreadBadge}
|
onUnreadCountChange={showUnreadBadge}
|
||||||
onTeamConfigChange={teamConfigChange}
|
onTeamConfigChange={teamConfigChange}
|
||||||
useSpellChecker={AppConfig.data.useSpellChecker}
|
useSpellChecker={AppConfig.data.useSpellChecker}
|
||||||
onSelectSpellCheckerLocale={handleSelectSpellCheckerLocale}
|
onSelectSpellCheckerLocale={handleSelectSpellCheckerLocale}
|
||||||
deeplinkingUrl={deeplinkingUrl}
|
deeplinkingUrl={deeplinkingUrl}
|
||||||
showAddServerButton={AppConfig.data.enableServerManagement}
|
showAddServerButton={buildConfig.enableServerManagement}
|
||||||
requestingPermission={requestingPermission}
|
requestingPermission={requestingPermission}
|
||||||
onClickPermissionDialog={handleClickPermissionDialog}
|
onClickPermissionDialog={handleClickPermissionDialog}
|
||||||
/>,
|
/>,
|
||||||
|
|
|
@ -9,13 +9,17 @@ const React = require('react');
|
||||||
const ReactDOM = require('react-dom');
|
const ReactDOM = require('react-dom');
|
||||||
const SettingsPage = require('./components/SettingsPage.jsx');
|
const SettingsPage = require('./components/SettingsPage.jsx');
|
||||||
const contextMenu = require('./js/contextMenu');
|
const contextMenu = require('./js/contextMenu');
|
||||||
|
const buildConfig = require('../common/config/buildConfig');
|
||||||
|
|
||||||
const configFile = remote.app.getPath('userData') + '/config.json';
|
const configFile = remote.app.getPath('userData') + '/config.json';
|
||||||
|
|
||||||
contextMenu.setup(remote.getCurrentWindow());
|
contextMenu.setup(remote.getCurrentWindow());
|
||||||
|
|
||||||
ReactDOM.render(
|
ReactDOM.render(
|
||||||
<SettingsPage configFile={configFile}/>,
|
<SettingsPage
|
||||||
|
configFile={configFile}
|
||||||
|
enableServerManagement={buildConfig.enableServerManagement}
|
||||||
|
/>,
|
||||||
document.getElementById('content')
|
document.getElementById('content')
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -1,32 +0,0 @@
|
||||||
{
|
|
||||||
"default": {
|
|
||||||
"teams": [],
|
|
||||||
"showTrayIcon": false,
|
|
||||||
"trayIconTheme": "light",
|
|
||||||
"minimizeToTray": false,
|
|
||||||
"version": 1,
|
|
||||||
"notifications": {
|
|
||||||
"flashWindow": 0
|
|
||||||
},
|
|
||||||
"showUnreadBadge": true,
|
|
||||||
"useSpellChecker": true,
|
|
||||||
"spellCheckerLocale": "en-US",
|
|
||||||
"helpLink": "https://docs.mattermost.com/help/apps/desktop-guide.html",
|
|
||||||
"enableServerManagement": true
|
|
||||||
},
|
|
||||||
"1": {
|
|
||||||
"teams": [],
|
|
||||||
"showTrayIcon": false,
|
|
||||||
"trayIconTheme": "light",
|
|
||||||
"minimizeToTray": false,
|
|
||||||
"version": 1,
|
|
||||||
"notifications": {
|
|
||||||
"flashWindow": 0
|
|
||||||
},
|
|
||||||
"showUnreadBadge": true,
|
|
||||||
"useSpellChecker": true,
|
|
||||||
"spellCheckerLocale": "en-US",
|
|
||||||
"helpLink": "https://docs.mattermost.com/help/apps/desktop-guide.html",
|
|
||||||
"enableServerManagement": true
|
|
||||||
}
|
|
||||||
}
|
|
23
src/common/config/buildConfig.js
Normal file
23
src/common/config/buildConfig.js
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/**
|
||||||
|
* Build-time configuration. End-users can't change these parameters.
|
||||||
|
* @prop {Object[]} defaultTeams
|
||||||
|
* @prop {string} defaultTeams[].name - The tab name for default team.
|
||||||
|
* @prop {string} defaultTeams[].url - The URL for default team.
|
||||||
|
* @prop {string} helpLink - The URL for "Help->Learn More..." menu item.
|
||||||
|
* If null is specified, the menu disappears.
|
||||||
|
* @prop {boolean} enableServerManagement - Whether users can edit servers configuration.
|
||||||
|
* Specify at least one server for "defaultTeams"
|
||||||
|
* when "enableServerManagement is set to false
|
||||||
|
*/
|
||||||
|
const buildConfig = {
|
||||||
|
defaultTeams: [/*
|
||||||
|
{
|
||||||
|
name: 'example',
|
||||||
|
url: 'https://example.com'
|
||||||
|
}*/
|
||||||
|
],
|
||||||
|
helpLink: 'https://docs.mattermost.com/help/apps/desktop-guide.html',
|
||||||
|
enableServerManagement: true
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = buildConfig;
|
19
src/common/config/defaultPreferences.js
Normal file
19
src/common/config/defaultPreferences.js
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
/**
|
||||||
|
* Default user preferences. End-users can change these parameters by editing config.json
|
||||||
|
* @param {number} version - Scheme version. (Not application version)
|
||||||
|
*/
|
||||||
|
const defaultPreferences = {
|
||||||
|
version: 1,
|
||||||
|
teams: [],
|
||||||
|
showTrayIcon: false,
|
||||||
|
trayIconTheme: 'light',
|
||||||
|
minimizeToTray: false,
|
||||||
|
notifications: {
|
||||||
|
flashWindow: 0
|
||||||
|
},
|
||||||
|
showUnreadBadge: true,
|
||||||
|
useSpellChecker: true,
|
||||||
|
spellCheckerLocale: 'en-US'
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = defaultPreferences;
|
|
@ -1,3 +0,0 @@
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
11
src/common/config/pastDefaultPreferences.js
Normal file
11
src/common/config/pastDefaultPreferences.js
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
const defaultPreferences = require('./defaultPreferences');
|
||||||
|
|
||||||
|
const pastDefaultPreferences = {
|
||||||
|
0: {
|
||||||
|
url: ''
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
pastDefaultPreferences[`${defaultPreferences.version}`] = defaultPreferences;
|
||||||
|
|
||||||
|
module.exports = pastDefaultPreferences;
|
29
src/common/config/upgradePreferences.js
Normal file
29
src/common/config/upgradePreferences.js
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
const pastDefaultPreferences = require('./pastDefaultPreferences');
|
||||||
|
|
||||||
|
function deepCopy(object) {
|
||||||
|
return JSON.parse(JSON.stringify(object));
|
||||||
|
}
|
||||||
|
|
||||||
|
function upgradeV0toV1(configV0) {
|
||||||
|
const config = deepCopy(pastDefaultPreferences['1']);
|
||||||
|
if (config.version !== 1) {
|
||||||
|
throw new Error('pastDefaultPreferences[\'1\'].version is not equal to 1');
|
||||||
|
}
|
||||||
|
config.teams.push({
|
||||||
|
name: 'Primary team',
|
||||||
|
url: configV0.url
|
||||||
|
});
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
function upgradeToLatest(config) {
|
||||||
|
var configVersion = config.version ? config.version : 0;
|
||||||
|
switch (configVersion) {
|
||||||
|
case 0:
|
||||||
|
return upgradeToLatest(upgradeV0toV1(config));
|
||||||
|
default:
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = upgradeToLatest;
|
|
@ -1,90 +1,56 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const deepmerge = require('./deepmerge');
|
const buildConfig = require('./config/buildConfig');
|
||||||
|
|
||||||
const settingsVersion = 1;
|
|
||||||
const baseConfig = require('./config/base.json');
|
|
||||||
const overrideConfig = require('./config/override.json');
|
|
||||||
|
|
||||||
function merge(base, target) {
|
function merge(base, target) {
|
||||||
return Object.assign({}, base, target);
|
return Object.assign({}, base, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
function deepMergeArray(source, dest) {
|
const defaultPreferences = require('./config/defaultPreferences');
|
||||||
return dest;
|
const upgradePreferences = require('./config/upgradePreferences');
|
||||||
}
|
|
||||||
|
|
||||||
function loadDefault(version, spellCheckerLocale) {
|
function loadDefault(spellCheckerLocale) {
|
||||||
var ver = version;
|
const config = JSON.parse(JSON.stringify(defaultPreferences));
|
||||||
if (version == null) {
|
return Object.assign({}, config, {
|
||||||
ver = settingsVersion;
|
spellCheckerLocale: spellCheckerLocale || defaultPreferences.pellCheckerLocale || 'en-US'
|
||||||
}
|
|
||||||
|
|
||||||
const base = baseConfig[ver] || baseConfig.default;
|
|
||||||
const override = overrideConfig[ver] || {};
|
|
||||||
|
|
||||||
const defaults = deepmerge(base, override, {arrayMerge: deepMergeArray});
|
|
||||||
|
|
||||||
return Object.assign(defaults, {
|
|
||||||
spellCheckerLocale: spellCheckerLocale || defaults.spellCheckerLocale || 'en-US'
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function upgradeV0toV1(configV0) {
|
function hasBuildConfigDefaultTeams(config) {
|
||||||
var config = loadDefault(1);
|
return config.defaultTeams.length > 0;
|
||||||
config.teams.push({
|
|
||||||
name: 'Primary team',
|
|
||||||
url: configV0.url
|
|
||||||
});
|
|
||||||
return config;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function upgrade(config, newAppVersion) {
|
function upgrade(config) {
|
||||||
var configVersion = config.version ? config.version : 0;
|
return upgradePreferences(config);
|
||||||
if (newAppVersion) {
|
|
||||||
config.lastMattermostVersion = newAppVersion;
|
|
||||||
}
|
|
||||||
switch (configVersion) {
|
|
||||||
case 0:
|
|
||||||
return upgrade(upgradeV0toV1(config));
|
|
||||||
default:
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
version: settingsVersion,
|
version: defaultPreferences.version,
|
||||||
|
|
||||||
upgrade,
|
upgrade,
|
||||||
|
|
||||||
readFileSync(configFile) {
|
readFileSync(configFile) {
|
||||||
var config = JSON.parse(fs.readFileSync(configFile, 'utf8'));
|
const config = JSON.parse(fs.readFileSync(configFile, 'utf8'));
|
||||||
|
if (config.version === defaultPreferences.version) {
|
||||||
// need to be able to compare 1 to '1'
|
const defaultConfig = loadDefault();
|
||||||
if (config.version == settingsVersion) { // eslint-disable-line
|
return merge(defaultConfig, config);
|
||||||
var defaultConfig = this.loadDefault();
|
|
||||||
config = merge(defaultConfig, config);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return config;
|
return config;
|
||||||
},
|
},
|
||||||
|
|
||||||
writeFile(configFile, config, callback) {
|
writeFile(configFile, config, callback) {
|
||||||
// need to be able to compare 1 to '1'
|
if (config.version !== defaultPreferences.version) {
|
||||||
if (config.version != settingsVersion) { // eslint-disable-line
|
throw new Error('version ' + config.version + ' is not equal to ' + defaultPreferences.version);
|
||||||
throw new Error('version ' + config.version + ' is not equal to ' + settingsVersion);
|
|
||||||
}
|
}
|
||||||
var data = JSON.stringify(config, null, ' ');
|
var data = JSON.stringify(config, null, ' ');
|
||||||
fs.writeFile(configFile, data, 'utf8', callback);
|
fs.writeFile(configFile, data, 'utf8', callback);
|
||||||
},
|
},
|
||||||
|
|
||||||
writeFileSync(configFile, config) {
|
writeFileSync(configFile, config) {
|
||||||
// need to be able to compare 1 to '1'
|
if (config.version !== defaultPreferences.version) {
|
||||||
if (config.version != settingsVersion) { // eslint-disable-line
|
throw new Error('version ' + config.version + ' is not equal to ' + defaultPreferences.version);
|
||||||
throw new Error('version ' + config.version + ' is not equal to ' + settingsVersion);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const dir = path.dirname(configFile);
|
const dir = path.dirname(configFile);
|
||||||
|
@ -96,5 +62,16 @@ module.exports = {
|
||||||
fs.writeFileSync(configFile, data, 'utf8');
|
fs.writeFileSync(configFile, data, 'utf8');
|
||||||
},
|
},
|
||||||
|
|
||||||
loadDefault
|
loadDefault,
|
||||||
|
|
||||||
|
mergeDefaultTeams(teams) {
|
||||||
|
const newTeams = [];
|
||||||
|
if (hasBuildConfigDefaultTeams(buildConfig)) {
|
||||||
|
newTeams.push(...JSON.parse(JSON.stringify(buildConfig.defaultTeams)));
|
||||||
|
}
|
||||||
|
if (buildConfig.enableServerManagement) {
|
||||||
|
newTeams.push(...JSON.parse(JSON.stringify(teams)));
|
||||||
|
}
|
||||||
|
return newTeams;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -69,7 +69,7 @@ try {
|
||||||
config = settings.readFileSync(configFile);
|
config = settings.readFileSync(configFile);
|
||||||
if (config.version !== settings.version || wasUpdated()) {
|
if (config.version !== settings.version || wasUpdated()) {
|
||||||
clearAppCache();
|
clearAppCache();
|
||||||
config = settings.upgrade(config, app.getVersion());
|
config = settings.upgrade(config);
|
||||||
settings.writeFileSync(configFile, config);
|
settings.writeFileSync(configFile, config);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const electron = require('electron');
|
const electron = require('electron');
|
||||||
|
const settings = require('../../common/settings');
|
||||||
|
const buildConfig = require('../../common/config/buildConfig');
|
||||||
|
|
||||||
const Menu = electron.Menu;
|
const Menu = electron.Menu;
|
||||||
|
|
||||||
|
@ -38,7 +40,7 @@ function createTemplate(mainWindow, config, isDev) {
|
||||||
}
|
}
|
||||||
}];
|
}];
|
||||||
|
|
||||||
if (config.enableServerManagement === true || config.teams.length === 0) {
|
if (buildConfig.enableServerManagement === true) {
|
||||||
platformAppMenu.push({
|
platformAppMenu.push({
|
||||||
label: 'Sign in to Another Server',
|
label: 'Sign in to Another Server',
|
||||||
click() {
|
click() {
|
||||||
|
@ -173,13 +175,14 @@ function createTemplate(mainWindow, config, isDev) {
|
||||||
}]
|
}]
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const teams = settings.mergeDefaultTeams(config.teams);
|
||||||
const windowMenu = {
|
const windowMenu = {
|
||||||
label: '&Window',
|
label: '&Window',
|
||||||
submenu: [{
|
submenu: [{
|
||||||
role: 'minimize'
|
role: 'minimize'
|
||||||
}, {
|
}, {
|
||||||
role: 'close'
|
role: 'close'
|
||||||
}, separatorItem, ...config.teams.slice(0, 9).map((team, i) => {
|
}, separatorItem, ...teams.slice(0, 9).map((team, i) => {
|
||||||
return {
|
return {
|
||||||
label: team.name,
|
label: team.name,
|
||||||
accelerator: `CmdOrCtrl+${i + 1}`,
|
accelerator: `CmdOrCtrl+${i + 1}`,
|
||||||
|
@ -194,23 +197,23 @@ function createTemplate(mainWindow, config, isDev) {
|
||||||
click() {
|
click() {
|
||||||
mainWindow.webContents.send('select-next-tab');
|
mainWindow.webContents.send('select-next-tab');
|
||||||
},
|
},
|
||||||
enabled: (config.teams.length > 1)
|
enabled: (teams.length > 1)
|
||||||
}, {
|
}, {
|
||||||
label: 'Select Previous Server',
|
label: 'Select Previous Server',
|
||||||
accelerator: 'Ctrl+Shift+Tab',
|
accelerator: 'Ctrl+Shift+Tab',
|
||||||
click() {
|
click() {
|
||||||
mainWindow.webContents.send('select-previous-tab');
|
mainWindow.webContents.send('select-previous-tab');
|
||||||
},
|
},
|
||||||
enabled: (config.teams.length > 1)
|
enabled: (teams.length > 1)
|
||||||
}]
|
}]
|
||||||
};
|
};
|
||||||
template.push(windowMenu);
|
template.push(windowMenu);
|
||||||
var submenu = [];
|
var submenu = [];
|
||||||
if (config.helpLink) {
|
if (buildConfig.helpLink) {
|
||||||
submenu.push({
|
submenu.push({
|
||||||
label: 'Learn More...',
|
label: 'Learn More...',
|
||||||
click() {
|
click() {
|
||||||
electron.shell.openExternal(config.helpLink);
|
electron.shell.openExternal(buildConfig.helpLink);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
submenu.push(separatorItem);
|
submenu.push(separatorItem);
|
||||||
|
|
|
@ -4,11 +4,13 @@ const {
|
||||||
app,
|
app,
|
||||||
Menu
|
Menu
|
||||||
} = require('electron');
|
} = require('electron');
|
||||||
|
const settings = require('../../common/settings');
|
||||||
|
|
||||||
function createTemplate(mainWindow, config, isDev) {
|
function createTemplate(mainWindow, config, isDev) {
|
||||||
const settingsURL = isDev ? 'http://localhost:8080/browser/settings.html' : `file://${app.getAppPath()}/browser/settings.html`;
|
const settingsURL = isDev ? 'http://localhost:8080/browser/settings.html' : `file://${app.getAppPath()}/browser/settings.html`;
|
||||||
|
const teams = settings.mergeDefaultTeams(config.teams);
|
||||||
var template = [
|
var template = [
|
||||||
...config.teams.slice(0, 9).map((team, i) => {
|
...teams.slice(0, 9).map((team, i) => {
|
||||||
return {
|
return {
|
||||||
label: team.name,
|
label: team.name,
|
||||||
click: () => {
|
click: () => {
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
"auto-launch": "^5.0.1",
|
"auto-launch": "^5.0.1",
|
||||||
"bootstrap": "^3.3.7",
|
"bootstrap": "^3.3.7",
|
||||||
"create-react-class": "^15.6.2",
|
"create-react-class": "^15.6.2",
|
||||||
"deepmerge": "^1.5.2",
|
|
||||||
"electron-context-menu": "^0.9.0",
|
"electron-context-menu": "^0.9.0",
|
||||||
"electron-devtools-installer": "^2.2.1",
|
"electron-devtools-installer": "^2.2.1",
|
||||||
"electron-is-dev": "^0.3.0",
|
"electron-is-dev": "^0.3.0",
|
||||||
|
|
|
@ -141,10 +141,6 @@ decamelize@^1.1.1:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
|
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
|
||||||
|
|
||||||
deepmerge@^1.5.2:
|
|
||||||
version "1.5.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753"
|
|
||||||
|
|
||||||
dom-helpers@^3.2.0, dom-helpers@^3.2.1:
|
dom-helpers@^3.2.0, dom-helpers@^3.2.1:
|
||||||
version "3.2.1"
|
version "3.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.2.1.tgz#3203e07fed217bd1f424b019735582fc37b2825a"
|
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.2.1.tgz#3203e07fed217bd1f424b019735582fc37b2825a"
|
||||||
|
|
|
@ -39,6 +39,12 @@ module.exports = {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
createTestUserDataDir() {
|
||||||
|
if (!fs.existsSync(userDataDir)) {
|
||||||
|
fs.mkdirSync(userDataDir);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
getSpectronApp() {
|
getSpectronApp() {
|
||||||
return new Application({
|
return new Application({
|
||||||
path: electronBinaryPath,
|
path: electronBinaryPath,
|
||||||
|
|
|
@ -8,17 +8,15 @@ describe('application', function desc() {
|
||||||
this.timeout(30000);
|
this.timeout(30000);
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
env.createTestUserDataDir();
|
||||||
env.cleanTestConfig();
|
env.cleanTestConfig();
|
||||||
this.app = env.getSpectronApp();
|
this.app = env.getSpectronApp();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
if (this.app && this.app.isRunning()) {
|
if (this.app && this.app.isRunning()) {
|
||||||
return this.app.stop().then(() => {
|
return this.app.stop();
|
||||||
env.cleanTestConfig();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
env.cleanTestConfig();
|
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -1,15 +1,9 @@
|
||||||
const settings = require('../../src/common/settings');
|
const settings = require('../../src/common/settings');
|
||||||
const deepmerge = require('deepmerge');
|
const buildConfig = require('../../src/common/config/buildConfig');
|
||||||
|
const defaultPreferences = require('../../src/common/config/defaultPreferences');
|
||||||
|
const pastDefaultPreferences = require('../../src/common/config/pastDefaultPreferences');
|
||||||
|
|
||||||
describe('common/settings.js', () => {
|
describe('common/settings.js', () => {
|
||||||
before(() => {
|
|
||||||
process.env.TEST = 1;
|
|
||||||
});
|
|
||||||
|
|
||||||
after(() => {
|
|
||||||
delete process.env.TEST;
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should upgrade v0 config file', () => {
|
it('should upgrade v0 config file', () => {
|
||||||
const v0Config = {
|
const v0Config = {
|
||||||
url: 'https://example.com/team'
|
url: 'https://example.com/team'
|
||||||
|
@ -20,13 +14,34 @@ describe('common/settings.js', () => {
|
||||||
config.version.should.equal(settings.version);
|
config.version.should.equal(settings.version);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should loadDefault config for version 1', () => {
|
it('should merge teams with buildConfig.defaultTeams', () => {
|
||||||
const baseConfig = require('../../src/common/config/base.json');
|
const teams = [
|
||||||
const overrideConfig = require('../../src/common/config/override.json');
|
{
|
||||||
const expectedDefaults = deepmerge(
|
name: 'test',
|
||||||
baseConfig[1], overrideConfig[1] || {}, {clone: true, arrayMerge: settings.deepMergeArray}
|
url: 'https://example.com'
|
||||||
);
|
}
|
||||||
const defaultConfig = settings.loadDefault();
|
];
|
||||||
defaultConfig.should.eql(expectedDefaults);
|
|
||||||
|
const mergedTeams = settings.mergeDefaultTeams(teams);
|
||||||
|
mergedTeams.should.deep.equal([
|
||||||
|
{
|
||||||
|
name: 'test',
|
||||||
|
url: 'https://example.com'
|
||||||
|
},
|
||||||
|
...buildConfig.defaultTeams
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('common/config/', () => {
|
||||||
|
it('pastDefaultPreferences should have each past version of defaultPreferences', () => {
|
||||||
|
for (let version = 0; version <= defaultPreferences.version; version++) {
|
||||||
|
pastDefaultPreferences[`${version}`].should.exist; // eslint-disable-line no-unused-expressions
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it('defaultPreferences equal to one of pastDefaultPreferences', () => {
|
||||||
|
const pastPreferences = pastDefaultPreferences[`${defaultPreferences.version}`];
|
||||||
|
pastPreferences.should.deep.equal(defaultPreferences);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1352,10 +1352,6 @@ deep-is@~0.1.3:
|
||||||
version "0.1.3"
|
version "0.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
|
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
|
||||||
|
|
||||||
deepmerge@^1.5.2:
|
|
||||||
version "1.5.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753"
|
|
||||||
|
|
||||||
deepmerge@~1.3.2:
|
deepmerge@~1.3.2:
|
||||||
version "1.3.2"
|
version "1.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.3.2.tgz#1663691629d4dbfe364fa12a2a4f0aa86aa3a050"
|
resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.3.2.tgz#1663691629d4dbfe364fa12a2a4f0aa86aa3a050"
|
||||||
|
|
Loading…
Reference in a new issue