From c32090618e535eb48fb4dc377659ff97dae1a9ee Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Mon, 10 Dec 2018 16:34:53 +0100 Subject: merge default and fetched feature configs --- src/stores/FeaturesStore.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js index 0adee6adf..eb2b21af3 100644 --- a/src/stores/FeaturesStore.js +++ b/src/stores/FeaturesStore.js @@ -37,7 +37,7 @@ export default class FeaturesStore extends Store { @computed get features() { if (this.stores.user.isLoggedIn) { - return this.featuresRequest.execute().result || DEFAULT_FEATURES_CONFIG; + return Object.assign({}, DEFAULT_FEATURES_CONFIG, this.featuresRequest.execute().result); } return DEFAULT_FEATURES_CONFIG; -- cgit v1.2.3-54-g00ecf From f9835b491c51b417fc69be755faf5c694d9a8448 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Mon, 10 Dec 2018 16:35:26 +0100 Subject: ignore intellij project files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 192a261f0..245057c46 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.idea node_modules flow-typed out -- cgit v1.2.3-54-g00ecf From 4a537e890d95e8666985ce77df4c6327582332be Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Mon, 10 Dec 2018 17:15:37 +0100 Subject: basic setup for workspaces feature --- src/config.js | 1 + src/features/workspaces/api.js | 9 +++++++++ src/features/workspaces/index.js | 34 ++++++++++++++++++++++++++++++++++ src/features/workspaces/store.js | 29 +++++++++++++++++++++++++++++ src/stores/FeaturesStore.js | 2 ++ 5 files changed, 75 insertions(+) create mode 100644 src/features/workspaces/api.js create mode 100644 src/features/workspaces/index.js create mode 100644 src/features/workspaces/store.js diff --git a/src/config.js b/src/config.js index 789ddd1a0..d7a485b8a 100644 --- a/src/config.js +++ b/src/config.js @@ -37,6 +37,7 @@ export const DEFAULT_FEATURES_CONFIG = { }, isServiceProxyEnabled: false, isServiceProxyPremiumFeature: true, + isWorkspaceEnabled: true, }; export const DEFAULT_WINDOW_OPTIONS = { diff --git a/src/features/workspaces/api.js b/src/features/workspaces/api.js new file mode 100644 index 000000000..1ee2440fe --- /dev/null +++ b/src/features/workspaces/api.js @@ -0,0 +1,9 @@ +// TODO: use real server instead +const workspaces = [ + { id: 'workspace-1', name: 'Private' }, + { id: 'workspace-2', name: 'Office' }, +]; + +export default { + getUserWorkspaces: () => Promise.resolve(workspaces), +}; diff --git a/src/features/workspaces/index.js b/src/features/workspaces/index.js new file mode 100644 index 000000000..b7e1090e8 --- /dev/null +++ b/src/features/workspaces/index.js @@ -0,0 +1,34 @@ +import { observable, reaction } from 'mobx'; +import { merge } from 'lodash'; +import WorkspacesStore from './store'; +import api from './api'; + +const debug = require('debug')('Franz:feature:workspaces'); + +let store = null; +const defaultState = { workspaces: [] }; + +export const state = observable(defaultState); + +export default function initWorkspaces(stores, actions) { + const { features, user } = stores; + reaction( + () => features.features.isWorkspaceEnabled && user.isLoggedIn, + (isEnabled) => { + if (isEnabled) { + debug('Initializing `workspaces` feature'); + store = new WorkspacesStore(stores, api, actions, state); + store.initialize(); + } else if (store) { + debug('Disabling `workspaces` feature'); + store.teardown(); + store = null; + // Reset state to default + merge(state, defaultState); + } + }, + { + fireImmediately: true, + }, + ); +} diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js new file mode 100644 index 000000000..4b4e729ed --- /dev/null +++ b/src/features/workspaces/store.js @@ -0,0 +1,29 @@ +import { observable, reaction } from 'mobx'; +import Store from '../../stores/lib/Store'; +import CachedRequest from '../../stores/lib/CachedRequest'; + +const debug = require('debug')('Franz:feature:workspaces'); + +export default class WorkspacesStore extends Store { + @observable allWorkspacesRequest = new CachedRequest(this.api, 'getUserWorkspaces'); + + constructor(stores, api, actions, state) { + super(stores, api, actions); + this.state = state; + } + + setup() { + debug('fetching user workspaces'); + this.allWorkspacesRequest.execute(); + + reaction( + () => this.allWorkspacesRequest.result, + workspaces => this.setWorkspaces(workspaces), + ); + } + + setWorkspaces = (workspaces) => { + debug('setting user workspaces', workspaces.slice()); + this.state.workspaces = workspaces; + }; +} diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js index eb2b21af3..05a620f0b 100644 --- a/src/stores/FeaturesStore.js +++ b/src/stores/FeaturesStore.js @@ -7,6 +7,7 @@ import delayApp from '../features/delayApp'; import spellchecker from '../features/spellchecker'; import serviceProxy from '../features/serviceProxy'; import basicAuth from '../features/basicAuth'; +import workspaces from '../features/workspaces'; import { DEFAULT_FEATURES_CONFIG } from '../config'; @@ -56,5 +57,6 @@ export default class FeaturesStore extends Store { spellchecker(this.stores, this.actions); serviceProxy(this.stores, this.actions); basicAuth(this.stores, this.actions); + workspaces(this.stores, this.actions); } } -- cgit v1.2.3-54-g00ecf From fd04044be1fe7207e75ed7cb1ddb622cc9cc93bf Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Thu, 10 Jan 2019 13:43:23 +0100 Subject: define workspaces as premium feature --- src/config.js | 1 + src/features/workspaces/index.js | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/config.js b/src/config.js index d7a485b8a..d327185f0 100644 --- a/src/config.js +++ b/src/config.js @@ -37,6 +37,7 @@ export const DEFAULT_FEATURES_CONFIG = { }, isServiceProxyEnabled: false, isServiceProxyPremiumFeature: true, + isWorkspacePremiumFeature: true, isWorkspaceEnabled: true, }; diff --git a/src/features/workspaces/index.js b/src/features/workspaces/index.js index b7e1090e8..b4cfd3c2d 100644 --- a/src/features/workspaces/index.js +++ b/src/features/workspaces/index.js @@ -13,7 +13,11 @@ export const state = observable(defaultState); export default function initWorkspaces(stores, actions) { const { features, user } = stores; reaction( - () => features.features.isWorkspaceEnabled && user.isLoggedIn, + () => ( + features.features.isWorkspaceEnabled && ( + !features.features.isWorkspacePremiumFeature || user.data.isPremium + ) + ), (isEnabled) => { if (isEnabled) { debug('Initializing `workspaces` feature'); -- cgit v1.2.3-54-g00ecf From 912bca432ebf005a1680e9cc28bf7ee92cb0d36b Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Thu, 10 Jan 2019 13:43:45 +0100 Subject: add workspaces menu item in settings dialog --- src/components/settings/navigation/SettingsNavigation.js | 12 ++++++++++++ src/i18n/locales/en-US.json | 1 + 2 files changed, 13 insertions(+) diff --git a/src/components/settings/navigation/SettingsNavigation.js b/src/components/settings/navigation/SettingsNavigation.js index 953f702f8..4a80bb126 100644 --- a/src/components/settings/navigation/SettingsNavigation.js +++ b/src/components/settings/navigation/SettingsNavigation.js @@ -14,6 +14,10 @@ const messages = defineMessages({ id: 'settings.navigation.yourServices', defaultMessage: '!!!Your services', }, + yourWorkspaces: { + id: 'settings.navigation.yourWorkspaces', + defaultMessage: '!!!Your workspaces', + }, account: { id: 'settings.navigation.account', defaultMessage: '!!!Account', @@ -63,6 +67,14 @@ export default @inject('stores') @observer class SettingsNavigation extends Comp {' '} {serviceCount} + + {intl.formatMessage(messages.yourWorkspaces)} + {' '} + Date: Mon, 14 Jan 2019 17:11:27 +0100 Subject: basic setup of workspaces settings screen --- src/api/utils/auth.js | 24 ++++++++++ src/app.js | 2 + .../settings/workspaces/WorkspaceItem.js | 41 ++++++++++++++++ .../settings/workspaces/WorkspacesDashboard.js | 56 ++++++++++++++++++++++ src/containers/settings/WorkspacesScreen.js | 29 +++++++++++ src/environment.js | 1 + src/features/workspaces/api.js | 16 ++++--- src/features/workspaces/index.js | 10 ++-- src/features/workspaces/state.js | 12 +++++ src/features/workspaces/store.js | 15 ++++-- src/i18n/locales/en-US.json | 1 + src/models/Workspace.js | 25 ++++++++++ 12 files changed, 216 insertions(+), 16 deletions(-) create mode 100644 src/api/utils/auth.js create mode 100644 src/components/settings/workspaces/WorkspaceItem.js create mode 100644 src/components/settings/workspaces/WorkspacesDashboard.js create mode 100644 src/containers/settings/WorkspacesScreen.js create mode 100644 src/features/workspaces/state.js create mode 100644 src/models/Workspace.js diff --git a/src/api/utils/auth.js b/src/api/utils/auth.js new file mode 100644 index 000000000..47ac94c19 --- /dev/null +++ b/src/api/utils/auth.js @@ -0,0 +1,24 @@ +import { remote } from 'electron'; +import localStorage from 'mobx-localstorage'; + +const { app } = remote; + +export const prepareAuthRequest = (options, auth = true) => { + const request = Object.assign(options, { + mode: 'cors', + headers: Object.assign({ + 'Content-Type': 'application/json', + 'X-Franz-Source': 'desktop', + 'X-Franz-Version': app.getVersion(), + 'X-Franz-platform': process.platform, + 'X-Franz-Timezone-Offset': new Date().getTimezoneOffset(), + 'X-Franz-System-Locale': app.getLocale(), + }, options.headers), + }); + + if (auth) { + request.headers.Authorization = `Bearer ${localStorage.getItem('authToken')}`; + } + + return request; +}; diff --git a/src/app.js b/src/app.js index 6660feb46..ee1b12939 100644 --- a/src/app.js +++ b/src/app.js @@ -39,6 +39,7 @@ import PricingScreen from './containers/auth/PricingScreen'; import InviteScreen from './containers/auth/InviteScreen'; import AuthLayoutContainer from './containers/auth/AuthLayoutContainer'; import SubscriptionPopupScreen from './containers/subscription/SubscriptionPopupScreen'; +import WorkspacesScreen from './containers/settings/WorkspacesScreen'; // Add Polyfills smoothScroll.polyfill(); @@ -75,6 +76,7 @@ window.addEventListener('load', () => { + diff --git a/src/components/settings/workspaces/WorkspaceItem.js b/src/components/settings/workspaces/WorkspaceItem.js new file mode 100644 index 000000000..82a578ebd --- /dev/null +++ b/src/components/settings/workspaces/WorkspaceItem.js @@ -0,0 +1,41 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { defineMessages, intlShape } from 'react-intl'; +import { observer } from 'mobx-react'; +import classnames from 'classnames'; +import Workspace from '../../../models/Workspace'; + +// const messages = defineMessages({}); + +@observer +class WorkspaceItem extends Component { + static propTypes = { + workspace: PropTypes.instanceOf(Workspace).isRequired, + }; + + static contextTypes = { + intl: intlShape, + }; + + render() { + const { workspace } = this.props; + // const { intl } = this.context; + + return ( + + console.log('go to workspace', workspace.name)} + > + {workspace.name} + + + ); + } +} + +export default WorkspaceItem; diff --git a/src/components/settings/workspaces/WorkspacesDashboard.js b/src/components/settings/workspaces/WorkspacesDashboard.js new file mode 100644 index 000000000..830f32f08 --- /dev/null +++ b/src/components/settings/workspaces/WorkspacesDashboard.js @@ -0,0 +1,56 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { observer, PropTypes as MobxPropTypes } from 'mobx-react'; +import { defineMessages, intlShape } from 'react-intl'; + +import Loader from '../../ui/Loader'; +import WorkspaceItem from './WorkspaceItem'; + +const messages = defineMessages({ + headline: { + id: 'settings.workspaces.headline', + defaultMessage: '!!!Your workspaces', + }, + noServicesAdded: { + id: 'settings.workspaces.noWorkspacesAdded', + defaultMessage: '!!!You haven\'t added any workspaces yet.', + }, +}); + +@observer +class WorkspacesDashboard extends Component { + static propTypes = { + workspaces: MobxPropTypes.arrayOrObservableArray.isRequired, + isLoading: PropTypes.bool.isRequired, + }; + + static contextTypes = { + intl: intlShape, + }; + + render() { + const { workspaces, isLoading } = this.props; + const { intl } = this.context; + + return ( +
+
+

{intl.formatMessage(messages.headline)}

+
+
+ {isLoading ? ( + + ) : ( + + + {workspaces.map(workspace => )} + +
+ )} +
+
+ ); + } +} + +export default WorkspacesDashboard; diff --git a/src/containers/settings/WorkspacesScreen.js b/src/containers/settings/WorkspacesScreen.js new file mode 100644 index 000000000..e767fdfbe --- /dev/null +++ b/src/containers/settings/WorkspacesScreen.js @@ -0,0 +1,29 @@ +import React, { Component } from 'react'; +import { observer } from 'mobx-react'; +import { gaPage } from '../../lib/analytics'; +import { state } from '../../features/workspaces/state'; + +import WorkspacesDashboard from '../../components/settings/workspaces/WorkspacesDashboard'; +import ErrorBoundary from '../../components/util/ErrorBoundary'; + +@observer +class WorkspacesScreen extends Component { + static propTypes = {}; + + componentDidMount() { + gaPage('Settings/Workspaces Dashboard'); + } + + render() { + return ( + + + + ); + } +} + +export default WorkspacesScreen; diff --git a/src/environment.js b/src/environment.js index 73b1c7ab2..d67fd6adb 100644 --- a/src/environment.js +++ b/src/environment.js @@ -28,3 +28,4 @@ if (!isDevMode || (isDevMode && useLiveAPI)) { } export const API = api; +export const API_VERSION = 'v1'; diff --git a/src/features/workspaces/api.js b/src/features/workspaces/api.js index 1ee2440fe..97badbd01 100644 --- a/src/features/workspaces/api.js +++ b/src/features/workspaces/api.js @@ -1,9 +1,13 @@ -// TODO: use real server instead -const workspaces = [ - { id: 'workspace-1', name: 'Private' }, - { id: 'workspace-2', name: 'Office' }, -]; +import { prepareAuthRequest } from '../../api/utils/auth'; +import { API, API_VERSION } from '../../environment'; export default { - getUserWorkspaces: () => Promise.resolve(workspaces), + getUserWorkspaces: async () => { + const url = `${API}/${API_VERSION}/workspace`; + const request = await window.fetch(url, prepareAuthRequest({ + method: 'GET', + })); + if (!request.ok) throw request; + return request.json(); + }, }; diff --git a/src/features/workspaces/index.js b/src/features/workspaces/index.js index b4cfd3c2d..50ac3b414 100644 --- a/src/features/workspaces/index.js +++ b/src/features/workspaces/index.js @@ -1,14 +1,11 @@ -import { observable, reaction } from 'mobx'; -import { merge } from 'lodash'; +import { reaction } from 'mobx'; import WorkspacesStore from './store'; import api from './api'; +import { state, resetState } from './state'; const debug = require('debug')('Franz:feature:workspaces'); let store = null; -const defaultState = { workspaces: [] }; - -export const state = observable(defaultState); export default function initWorkspaces(stores, actions) { const { features, user } = stores; @@ -27,8 +24,7 @@ export default function initWorkspaces(stores, actions) { debug('Disabling `workspaces` feature'); store.teardown(); store = null; - // Reset state to default - merge(state, defaultState); + resetState(); // Reset state to default } }, { diff --git a/src/features/workspaces/state.js b/src/features/workspaces/state.js new file mode 100644 index 000000000..ed3fe9f00 --- /dev/null +++ b/src/features/workspaces/state.js @@ -0,0 +1,12 @@ +import { observable } from 'mobx'; + +const defaultState = { + isLoading: false, + workspaces: [], +}; + +export const state = observable(defaultState); + +export function resetState() { + Object.assign(state, defaultState); +} diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index 4b4e729ed..2b6d55cc7 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -1,6 +1,7 @@ import { observable, reaction } from 'mobx'; import Store from '../../stores/lib/Store'; import CachedRequest from '../../stores/lib/CachedRequest'; +import Workspace from '../../models/Workspace'; const debug = require('debug')('Franz:feature:workspaces'); @@ -18,12 +19,20 @@ export default class WorkspacesStore extends Store { reaction( () => this.allWorkspacesRequest.result, - workspaces => this.setWorkspaces(workspaces), + workspaces => this._setWorkspaces(workspaces), + ); + reaction( + () => this.allWorkspacesRequest.isExecuting, + isExecuting => this._setIsLoading(isExecuting), ); } - setWorkspaces = (workspaces) => { + _setWorkspaces = (workspaces) => { debug('setting user workspaces', workspaces.slice()); - this.state.workspaces = workspaces; + this.state.workspaces = workspaces.map(data => new Workspace(data)); + }; + + _setIsLoading = (isLoading) => { + this.state.isLoading = isLoading; }; } diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 1b869aff1..1652b5585 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -196,6 +196,7 @@ "settings.user.form.accountType.individual": "Individual", "settings.user.form.accountType.non-profit": "Non-Profit", "settings.user.form.accountType.company": "Company", + "settings.workspaces.headline": "Your workspaces", "subscription.type.free": "free", "subscription.type.month": "month", "subscription.type.year": "year", diff --git a/src/models/Workspace.js b/src/models/Workspace.js new file mode 100644 index 000000000..ede2710dc --- /dev/null +++ b/src/models/Workspace.js @@ -0,0 +1,25 @@ +import { observable } from 'mobx'; + +export default class Workspace { + id = null; + + @observable name = null; + + @observable order = null; + + @observable services = []; + + @observable userId = null; + + constructor(data) { + if (!data.id) { + throw Error('Workspace requires Id'); + } + + this.id = data.id; + this.name = data.name; + this.order = data.order; + this.services = data.services; + this.userId = data.userId; + } +} -- cgit v1.2.3-54-g00ecf From e3a9a93581c52e93ad984c39e80bf3e456797a0b Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Mon, 14 Jan 2019 17:12:22 +0100 Subject: fix eslint error --- src/components/settings/workspaces/WorkspaceItem.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/settings/workspaces/WorkspaceItem.js b/src/components/settings/workspaces/WorkspaceItem.js index 82a578ebd..49d67d429 100644 --- a/src/components/settings/workspaces/WorkspaceItem.js +++ b/src/components/settings/workspaces/WorkspaceItem.js @@ -1,6 +1,6 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import { defineMessages, intlShape } from 'react-intl'; +import { intlShape } from 'react-intl'; import { observer } from 'mobx-react'; import classnames from 'classnames'; import Workspace from '../../../models/Workspace'; -- cgit v1.2.3-54-g00ecf From 73fcc05f34d5e707df5abbc744f7fe3313efb226 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Mon, 14 Jan 2019 17:56:03 +0100 Subject: assign react key prop to workspace items --- src/components/settings/workspaces/WorkspacesDashboard.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/settings/workspaces/WorkspacesDashboard.js b/src/components/settings/workspaces/WorkspacesDashboard.js index 830f32f08..c6378ac1e 100644 --- a/src/components/settings/workspaces/WorkspacesDashboard.js +++ b/src/components/settings/workspaces/WorkspacesDashboard.js @@ -43,7 +43,12 @@ class WorkspacesDashboard extends Component { ) : ( - {workspaces.map(workspace => )} + {workspaces.map(workspace => ( + + ))}
)} -- cgit v1.2.3-54-g00ecf From 981679154096517037c6732c9ecca1fe89733d00 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Mon, 14 Jan 2019 17:56:19 +0100 Subject: add styles for workspace table --- .../settings/workspaces/WorkspaceItem.js | 4 +- .../settings/workspaces/WorkspacesDashboard.js | 2 +- src/styles/main.scss | 1 + src/styles/workspace-table.scss | 53 ++++++++++++++++++++++ 4 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 src/styles/workspace-table.scss diff --git a/src/components/settings/workspaces/WorkspaceItem.js b/src/components/settings/workspaces/WorkspaceItem.js index 49d67d429..a71e6583d 100644 --- a/src/components/settings/workspaces/WorkspaceItem.js +++ b/src/components/settings/workspaces/WorkspaceItem.js @@ -24,11 +24,11 @@ class WorkspaceItem extends Component { return ( console.log('go to workspace', workspace.name)} > {workspace.name} diff --git a/src/components/settings/workspaces/WorkspacesDashboard.js b/src/components/settings/workspaces/WorkspacesDashboard.js index c6378ac1e..b286adc68 100644 --- a/src/components/settings/workspaces/WorkspacesDashboard.js +++ b/src/components/settings/workspaces/WorkspacesDashboard.js @@ -41,7 +41,7 @@ class WorkspacesDashboard extends Component { {isLoading ? ( ) : ( - +
{workspaces.map(workspace => ( Date: Mon, 14 Jan 2019 19:01:46 +0100 Subject: setup logic to display workspace edit page --- src/actions/index.js | 2 + src/actions/workspace.js | 8 ++++ src/app.js | 2 + .../settings/workspaces/WorkspaceItem.js | 5 +- .../settings/workspaces/WorkspacesDashboard.js | 4 +- src/containers/settings/EditWorkspaceScreen.js | 54 ++++++++++++++++++++++ src/containers/settings/WorkspacesScreen.js | 16 +++++-- src/features/workspaces/state.js | 1 + src/features/workspaces/store.js | 32 ++++++++++++- 9 files changed, 116 insertions(+), 8 deletions(-) create mode 100644 src/actions/workspace.js create mode 100644 src/containers/settings/EditWorkspaceScreen.js diff --git a/src/actions/index.js b/src/actions/index.js index 59acabb0b..a406af50a 100644 --- a/src/actions/index.js +++ b/src/actions/index.js @@ -11,6 +11,7 @@ import payment from './payment'; import news from './news'; import settings from './settings'; import requests from './requests'; +import workspace from './workspace'; const actions = Object.assign({}, { service, @@ -23,6 +24,7 @@ const actions = Object.assign({}, { news, settings, requests, + workspace, }); export default defineActions(actions, PropTypes.checkPropTypes); diff --git a/src/actions/workspace.js b/src/actions/workspace.js new file mode 100644 index 000000000..ab07a96c0 --- /dev/null +++ b/src/actions/workspace.js @@ -0,0 +1,8 @@ +import PropTypes from 'prop-types'; +import Workspace from '../models/Workspace'; + +export default { + edit: { + workspace: PropTypes.instanceOf(Workspace).isRequired, + }, +}; diff --git a/src/app.js b/src/app.js index ee1b12939..320ba679f 100644 --- a/src/app.js +++ b/src/app.js @@ -40,6 +40,7 @@ import InviteScreen from './containers/auth/InviteScreen'; import AuthLayoutContainer from './containers/auth/AuthLayoutContainer'; import SubscriptionPopupScreen from './containers/subscription/SubscriptionPopupScreen'; import WorkspacesScreen from './containers/settings/WorkspacesScreen'; +import EditWorkspaceScreen from './containers/settings/EditWorkspaceScreen'; // Add Polyfills smoothScroll.polyfill(); @@ -77,6 +78,7 @@ window.addEventListener('load', () => { + diff --git a/src/components/settings/workspaces/WorkspaceItem.js b/src/components/settings/workspaces/WorkspaceItem.js index a71e6583d..088d61433 100644 --- a/src/components/settings/workspaces/WorkspaceItem.js +++ b/src/components/settings/workspaces/WorkspaceItem.js @@ -11,6 +11,7 @@ import Workspace from '../../../models/Workspace'; class WorkspaceItem extends Component { static propTypes = { workspace: PropTypes.instanceOf(Workspace).isRequired, + onItemClick: PropTypes.func.isRequired, }; static contextTypes = { @@ -18,7 +19,7 @@ class WorkspaceItem extends Component { }; render() { - const { workspace } = this.props; + const { workspace, onItemClick } = this.props; // const { intl } = this.context; return ( @@ -29,7 +30,7 @@ class WorkspaceItem extends Component { > diff --git a/src/components/settings/workspaces/WorkspacesDashboard.js b/src/components/settings/workspaces/WorkspacesDashboard.js index b286adc68..a5bb18cb7 100644 --- a/src/components/settings/workspaces/WorkspacesDashboard.js +++ b/src/components/settings/workspaces/WorkspacesDashboard.js @@ -22,6 +22,7 @@ class WorkspacesDashboard extends Component { static propTypes = { workspaces: MobxPropTypes.arrayOrObservableArray.isRequired, isLoading: PropTypes.bool.isRequired, + onWorkspaceClick: PropTypes.func.isRequired, }; static contextTypes = { @@ -29,7 +30,7 @@ class WorkspacesDashboard extends Component { }; render() { - const { workspaces, isLoading } = this.props; + const { workspaces, isLoading, onWorkspaceClick } = this.props; const { intl } = this.context; return ( @@ -47,6 +48,7 @@ class WorkspacesDashboard extends Component { onWorkspaceClick(w)} /> ))} diff --git a/src/containers/settings/EditWorkspaceScreen.js b/src/containers/settings/EditWorkspaceScreen.js new file mode 100644 index 000000000..665b405bd --- /dev/null +++ b/src/containers/settings/EditWorkspaceScreen.js @@ -0,0 +1,54 @@ +import React, { Component } from 'react'; +import { inject, observer } from 'mobx-react'; +import { defineMessages, intlShape } from 'react-intl'; +import Form from '../../lib/Form'; +import ErrorBoundary from '../../components/util/ErrorBoundary'; +import { gaPage } from '../../lib/analytics'; +import { state } from '../../features/workspaces/state'; + +const messages = defineMessages({ + name: { + id: 'settings.workspace.form.name', + defaultMessage: '!!!Name', + }, +}); + +@inject('stores', 'actions') @observer +class EditWorkspaceScreen extends Component { + static contextTypes = { + intl: intlShape, + }; + + componentDidMount() { + gaPage('Settings/Workspace/Edit'); + } + + prepareForm(workspace) { + const { intl } = this.context; + const config = { + fields: { + name: { + label: intl.formatMessage(messages.name), + placeholder: intl.formatMessage(messages.name), + value: workspace.name, + }, + }, + }; + return new Form(config); + } + + render() { + const { workspaceBeingEdited } = state; + if (!workspaceBeingEdited) return null; + + // const form = this.prepareForm(workspaceBeingEdited); + + return ( + +
{workspaceBeingEdited.name}
+
+ ); + } +} + +export default EditWorkspaceScreen; diff --git a/src/containers/settings/WorkspacesScreen.js b/src/containers/settings/WorkspacesScreen.js index e767fdfbe..5e91f7673 100644 --- a/src/containers/settings/WorkspacesScreen.js +++ b/src/containers/settings/WorkspacesScreen.js @@ -1,25 +1,33 @@ import React, { Component } from 'react'; -import { observer } from 'mobx-react'; +import { inject, observer } from 'mobx-react'; +import PropTypes from 'prop-types'; import { gaPage } from '../../lib/analytics'; import { state } from '../../features/workspaces/state'; - import WorkspacesDashboard from '../../components/settings/workspaces/WorkspacesDashboard'; import ErrorBoundary from '../../components/util/ErrorBoundary'; -@observer +@inject('actions') @observer class WorkspacesScreen extends Component { - static propTypes = {}; + static propTypes = { + actions: PropTypes.shape({ + workspace: PropTypes.shape({ + edit: PropTypes.func.isRequired, + }), + }).isRequired, + }; componentDidMount() { gaPage('Settings/Workspaces Dashboard'); } render() { + const { workspace } = this.props.actions; return ( workspace.edit({ workspace: w })} /> ); diff --git a/src/features/workspaces/state.js b/src/features/workspaces/state.js index ed3fe9f00..f938c1470 100644 --- a/src/features/workspaces/state.js +++ b/src/features/workspaces/state.js @@ -3,6 +3,7 @@ import { observable } from 'mobx'; const defaultState = { isLoading: false, workspaces: [], + workspaceBeingEdited: null, }; export const state = observable(defaultState); diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index 2b6d55cc7..aab66708b 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -2,6 +2,7 @@ import { observable, reaction } from 'mobx'; import Store from '../../stores/lib/Store'; import CachedRequest from '../../stores/lib/CachedRequest'; import Workspace from '../../models/Workspace'; +import { matchRoute } from '../../helpers/routing-helpers'; const debug = require('debug')('Franz:feature:workspaces'); @@ -14,17 +15,40 @@ export default class WorkspacesStore extends Store { } setup() { - debug('fetching user workspaces'); + debug('fetching workspaces'); this.allWorkspacesRequest.execute(); + /** + * Update the state workspaces array when workspaces request has results. + */ reaction( () => this.allWorkspacesRequest.result, workspaces => this._setWorkspaces(workspaces), ); + /** + * Update the loading state when workspace request is executing. + */ reaction( () => this.allWorkspacesRequest.isExecuting, isExecuting => this._setIsLoading(isExecuting), ); + /** + * Update the state with the workspace to be edited when route matches. + */ + reaction( + () => ({ + pathname: this.stores.router.location.pathname, + workspaces: this.state.workspaces, + }), + ({ pathname }) => { + const match = matchRoute('/settings/workspaces/edit/:id', pathname); + if (match) { + this.state.workspaceBeingEdited = this._getWorkspaceById(match.id); + } + }, + ); + + this.actions.workspace.edit.listen(this._edit); } _setWorkspaces = (workspaces) => { @@ -35,4 +59,10 @@ export default class WorkspacesStore extends Store { _setIsLoading = (isLoading) => { this.state.isLoading = isLoading; }; + + _getWorkspaceById = id => this.state.workspaces.find(w => w.id === id); + + _edit = ({ workspace }) => { + this.stores.router.push(`/settings/workspaces/edit/${workspace.id}`); + } } -- cgit v1.2.3-54-g00ecf From 90399cc608b93cc185b0ee1c9b79e98cfafb8bc1 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Tue, 12 Feb 2019 14:59:58 +0100 Subject: consolidate workspace feature for further development --- src/actions/index.js | 2 +- src/actions/workspace.js | 8 --- src/app.js | 4 +- .../settings/workspaces/WorkspaceItem.js | 42 ------------ .../settings/workspaces/WorkspacesDashboard.js | 63 ------------------ src/containers/settings/EditWorkspaceScreen.js | 54 ---------------- src/containers/settings/WorkspacesScreen.js | 37 ----------- src/features/workspaces/actions.js | 8 +++ .../workspaces/components/WorkspaceItem.js | 42 ++++++++++++ .../workspaces/components/WorkspacesDashboard.js | 63 ++++++++++++++++++ .../workspaces/containers/EditWorkspaceScreen.js | 75 ++++++++++++++++++++++ .../workspaces/containers/WorkspacesScreen.js | 37 +++++++++++ src/features/workspaces/models/Workspace.js | 25 ++++++++ src/features/workspaces/store.js | 2 +- .../workspaces/styles/workspaces-table.scss | 53 +++++++++++++++ src/i18n/locales/de.json | 3 + src/i18n/locales/en-US.json | 1 + src/models/Workspace.js | 25 -------- src/styles/main.scss | 2 +- src/styles/workspace-table.scss | 53 --------------- 20 files changed, 312 insertions(+), 287 deletions(-) delete mode 100644 src/actions/workspace.js delete mode 100644 src/components/settings/workspaces/WorkspaceItem.js delete mode 100644 src/components/settings/workspaces/WorkspacesDashboard.js delete mode 100644 src/containers/settings/EditWorkspaceScreen.js delete mode 100644 src/containers/settings/WorkspacesScreen.js create mode 100644 src/features/workspaces/actions.js create mode 100644 src/features/workspaces/components/WorkspaceItem.js create mode 100644 src/features/workspaces/components/WorkspacesDashboard.js create mode 100644 src/features/workspaces/containers/EditWorkspaceScreen.js create mode 100644 src/features/workspaces/containers/WorkspacesScreen.js create mode 100644 src/features/workspaces/models/Workspace.js create mode 100644 src/features/workspaces/styles/workspaces-table.scss delete mode 100644 src/models/Workspace.js delete mode 100644 src/styles/workspace-table.scss diff --git a/src/actions/index.js b/src/actions/index.js index a406af50a..45e6da515 100644 --- a/src/actions/index.js +++ b/src/actions/index.js @@ -11,7 +11,7 @@ import payment from './payment'; import news from './news'; import settings from './settings'; import requests from './requests'; -import workspace from './workspace'; +import workspace from '../features/workspaces/actions'; const actions = Object.assign({}, { service, diff --git a/src/actions/workspace.js b/src/actions/workspace.js deleted file mode 100644 index ab07a96c0..000000000 --- a/src/actions/workspace.js +++ /dev/null @@ -1,8 +0,0 @@ -import PropTypes from 'prop-types'; -import Workspace from '../models/Workspace'; - -export default { - edit: { - workspace: PropTypes.instanceOf(Workspace).isRequired, - }, -}; diff --git a/src/app.js b/src/app.js index 320ba679f..d3b540f62 100644 --- a/src/app.js +++ b/src/app.js @@ -39,8 +39,8 @@ import PricingScreen from './containers/auth/PricingScreen'; import InviteScreen from './containers/auth/InviteScreen'; import AuthLayoutContainer from './containers/auth/AuthLayoutContainer'; import SubscriptionPopupScreen from './containers/subscription/SubscriptionPopupScreen'; -import WorkspacesScreen from './containers/settings/WorkspacesScreen'; -import EditWorkspaceScreen from './containers/settings/EditWorkspaceScreen'; +import WorkspacesScreen from './features/workspaces/containers/WorkspacesScreen'; +import EditWorkspaceScreen from './features/workspaces/containers/EditWorkspaceScreen'; // Add Polyfills smoothScroll.polyfill(); diff --git a/src/components/settings/workspaces/WorkspaceItem.js b/src/components/settings/workspaces/WorkspaceItem.js deleted file mode 100644 index 088d61433..000000000 --- a/src/components/settings/workspaces/WorkspaceItem.js +++ /dev/null @@ -1,42 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { intlShape } from 'react-intl'; -import { observer } from 'mobx-react'; -import classnames from 'classnames'; -import Workspace from '../../../models/Workspace'; - -// const messages = defineMessages({}); - -@observer -class WorkspaceItem extends Component { - static propTypes = { - workspace: PropTypes.instanceOf(Workspace).isRequired, - onItemClick: PropTypes.func.isRequired, - }; - - static contextTypes = { - intl: intlShape, - }; - - render() { - const { workspace, onItemClick } = this.props; - // const { intl } = this.context; - - return ( - - - - ); - } -} - -export default WorkspaceItem; diff --git a/src/components/settings/workspaces/WorkspacesDashboard.js b/src/components/settings/workspaces/WorkspacesDashboard.js deleted file mode 100644 index a5bb18cb7..000000000 --- a/src/components/settings/workspaces/WorkspacesDashboard.js +++ /dev/null @@ -1,63 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { observer, PropTypes as MobxPropTypes } from 'mobx-react'; -import { defineMessages, intlShape } from 'react-intl'; - -import Loader from '../../ui/Loader'; -import WorkspaceItem from './WorkspaceItem'; - -const messages = defineMessages({ - headline: { - id: 'settings.workspaces.headline', - defaultMessage: '!!!Your workspaces', - }, - noServicesAdded: { - id: 'settings.workspaces.noWorkspacesAdded', - defaultMessage: '!!!You haven\'t added any workspaces yet.', - }, -}); - -@observer -class WorkspacesDashboard extends Component { - static propTypes = { - workspaces: MobxPropTypes.arrayOrObservableArray.isRequired, - isLoading: PropTypes.bool.isRequired, - onWorkspaceClick: PropTypes.func.isRequired, - }; - - static contextTypes = { - intl: intlShape, - }; - - render() { - const { workspaces, isLoading, onWorkspaceClick } = this.props; - const { intl } = this.context; - - return ( -
-
-

{intl.formatMessage(messages.headline)}

-
-
- {isLoading ? ( - - ) : ( -
console.log('go to workspace', workspace.name)} + onClick={() => onItemClick(workspace)} > {workspace.name}
onItemClick(workspace)} - > - {workspace.name} -
- - {workspaces.map(workspace => ( - onWorkspaceClick(w)} - /> - ))} - -
- )} - - - ); - } -} - -export default WorkspacesDashboard; diff --git a/src/containers/settings/EditWorkspaceScreen.js b/src/containers/settings/EditWorkspaceScreen.js deleted file mode 100644 index 665b405bd..000000000 --- a/src/containers/settings/EditWorkspaceScreen.js +++ /dev/null @@ -1,54 +0,0 @@ -import React, { Component } from 'react'; -import { inject, observer } from 'mobx-react'; -import { defineMessages, intlShape } from 'react-intl'; -import Form from '../../lib/Form'; -import ErrorBoundary from '../../components/util/ErrorBoundary'; -import { gaPage } from '../../lib/analytics'; -import { state } from '../../features/workspaces/state'; - -const messages = defineMessages({ - name: { - id: 'settings.workspace.form.name', - defaultMessage: '!!!Name', - }, -}); - -@inject('stores', 'actions') @observer -class EditWorkspaceScreen extends Component { - static contextTypes = { - intl: intlShape, - }; - - componentDidMount() { - gaPage('Settings/Workspace/Edit'); - } - - prepareForm(workspace) { - const { intl } = this.context; - const config = { - fields: { - name: { - label: intl.formatMessage(messages.name), - placeholder: intl.formatMessage(messages.name), - value: workspace.name, - }, - }, - }; - return new Form(config); - } - - render() { - const { workspaceBeingEdited } = state; - if (!workspaceBeingEdited) return null; - - // const form = this.prepareForm(workspaceBeingEdited); - - return ( - -
{workspaceBeingEdited.name}
-
- ); - } -} - -export default EditWorkspaceScreen; diff --git a/src/containers/settings/WorkspacesScreen.js b/src/containers/settings/WorkspacesScreen.js deleted file mode 100644 index 5e91f7673..000000000 --- a/src/containers/settings/WorkspacesScreen.js +++ /dev/null @@ -1,37 +0,0 @@ -import React, { Component } from 'react'; -import { inject, observer } from 'mobx-react'; -import PropTypes from 'prop-types'; -import { gaPage } from '../../lib/analytics'; -import { state } from '../../features/workspaces/state'; -import WorkspacesDashboard from '../../components/settings/workspaces/WorkspacesDashboard'; -import ErrorBoundary from '../../components/util/ErrorBoundary'; - -@inject('actions') @observer -class WorkspacesScreen extends Component { - static propTypes = { - actions: PropTypes.shape({ - workspace: PropTypes.shape({ - edit: PropTypes.func.isRequired, - }), - }).isRequired, - }; - - componentDidMount() { - gaPage('Settings/Workspaces Dashboard'); - } - - render() { - const { workspace } = this.props.actions; - return ( - - workspace.edit({ workspace: w })} - /> - - ); - } -} - -export default WorkspacesScreen; diff --git a/src/features/workspaces/actions.js b/src/features/workspaces/actions.js new file mode 100644 index 000000000..30866af96 --- /dev/null +++ b/src/features/workspaces/actions.js @@ -0,0 +1,8 @@ +import PropTypes from 'prop-types'; +import Workspace from './models/Workspace'; + +export default { + edit: { + workspace: PropTypes.instanceOf(Workspace).isRequired, + }, +}; diff --git a/src/features/workspaces/components/WorkspaceItem.js b/src/features/workspaces/components/WorkspaceItem.js new file mode 100644 index 000000000..b2c2a4830 --- /dev/null +++ b/src/features/workspaces/components/WorkspaceItem.js @@ -0,0 +1,42 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { intlShape } from 'react-intl'; +import { observer } from 'mobx-react'; +import classnames from 'classnames'; +import Workspace from '../models/Workspace'; + +// const messages = defineMessages({}); + +@observer +class WorkspaceItem extends Component { + static propTypes = { + workspace: PropTypes.instanceOf(Workspace).isRequired, + onItemClick: PropTypes.func.isRequired, + }; + + static contextTypes = { + intl: intlShape, + }; + + render() { + const { workspace, onItemClick } = this.props; + // const { intl } = this.context; + + return ( + + onItemClick(workspace)} + > + {workspace.name} + + + ); + } +} + +export default WorkspaceItem; diff --git a/src/features/workspaces/components/WorkspacesDashboard.js b/src/features/workspaces/components/WorkspacesDashboard.js new file mode 100644 index 000000000..2a8b3a5ee --- /dev/null +++ b/src/features/workspaces/components/WorkspacesDashboard.js @@ -0,0 +1,63 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { observer, PropTypes as MobxPropTypes } from 'mobx-react'; +import { defineMessages, intlShape } from 'react-intl'; + +import Loader from '../../../components/ui/Loader'; +import WorkspaceItem from './WorkspaceItem'; + +const messages = defineMessages({ + headline: { + id: 'settings.workspaces.headline', + defaultMessage: '!!!Your workspaces', + }, + noServicesAdded: { + id: 'settings.workspaces.noWorkspacesAdded', + defaultMessage: '!!!You haven\'t added any workspaces yet.', + }, +}); + +@observer +class WorkspacesDashboard extends Component { + static propTypes = { + workspaces: MobxPropTypes.arrayOrObservableArray.isRequired, + isLoading: PropTypes.bool.isRequired, + onWorkspaceClick: PropTypes.func.isRequired, + }; + + static contextTypes = { + intl: intlShape, + }; + + render() { + const { workspaces, isLoading, onWorkspaceClick } = this.props; + const { intl } = this.context; + + return ( +
+
+

{intl.formatMessage(messages.headline)}

+
+
+ {isLoading ? ( + + ) : ( + + + {workspaces.map(workspace => ( + onWorkspaceClick(w)} + /> + ))} + +
+ )} +
+
+ ); + } +} + +export default WorkspacesDashboard; diff --git a/src/features/workspaces/containers/EditWorkspaceScreen.js b/src/features/workspaces/containers/EditWorkspaceScreen.js new file mode 100644 index 000000000..d8c52f586 --- /dev/null +++ b/src/features/workspaces/containers/EditWorkspaceScreen.js @@ -0,0 +1,75 @@ +import React, { Component } from 'react'; +import { inject, observer } from 'mobx-react'; +import { defineMessages, intlShape } from 'react-intl'; +import { Link } from 'react-router'; +import Form from '../../../lib/Form'; +import ErrorBoundary from '../../../components/util/ErrorBoundary'; +import { gaPage } from '../../../lib/analytics'; +import { state } from '../state'; + +const messages = defineMessages({ + name: { + id: 'settings.workspace.form.name', + defaultMessage: '!!!Name', + }, + yourWorkspaces: { + id: 'settings.workspace.form.yourWorkspaces', + defaultMessage: '!!!Your workspaces', + }, +}); + +@inject('stores', 'actions') @observer +class EditWorkspaceScreen extends Component { + static contextTypes = { + intl: intlShape, + }; + + componentDidMount() { + gaPage('Settings/Workspace/Edit'); + } + + prepareForm(workspace) { + const { intl } = this.context; + const config = { + fields: { + name: { + label: intl.formatMessage(messages.name), + placeholder: intl.formatMessage(messages.name), + value: workspace.name, + }, + }, + }; + return new Form(config); + } + + render() { + const { intl } = this.context; + const { workspaceBeingEdited } = state; + if (!workspaceBeingEdited) return null; + + // const form = this.prepareForm(workspaceBeingEdited); + + return ( + +
+
+ + + {intl.formatMessage(messages.yourWorkspaces)} + + + + + {workspaceBeingEdited.name} + +
+
+ test +
+
+
+ ); + } +} + +export default EditWorkspaceScreen; diff --git a/src/features/workspaces/containers/WorkspacesScreen.js b/src/features/workspaces/containers/WorkspacesScreen.js new file mode 100644 index 000000000..f129edec5 --- /dev/null +++ b/src/features/workspaces/containers/WorkspacesScreen.js @@ -0,0 +1,37 @@ +import React, { Component } from 'react'; +import { inject, observer } from 'mobx-react'; +import PropTypes from 'prop-types'; +import { gaPage } from '../../../lib/analytics'; +import { state } from '../state'; +import WorkspacesDashboard from '../components/WorkspacesDashboard'; +import ErrorBoundary from '../../../components/util/ErrorBoundary'; + +@inject('actions') @observer +class WorkspacesScreen extends Component { + static propTypes = { + actions: PropTypes.shape({ + workspace: PropTypes.shape({ + edit: PropTypes.func.isRequired, + }), + }).isRequired, + }; + + componentDidMount() { + gaPage('Settings/Workspaces Dashboard'); + } + + render() { + const { workspace } = this.props.actions; + return ( + + workspace.edit({ workspace: w })} + /> + + ); + } +} + +export default WorkspacesScreen; diff --git a/src/features/workspaces/models/Workspace.js b/src/features/workspaces/models/Workspace.js new file mode 100644 index 000000000..ede2710dc --- /dev/null +++ b/src/features/workspaces/models/Workspace.js @@ -0,0 +1,25 @@ +import { observable } from 'mobx'; + +export default class Workspace { + id = null; + + @observable name = null; + + @observable order = null; + + @observable services = []; + + @observable userId = null; + + constructor(data) { + if (!data.id) { + throw Error('Workspace requires Id'); + } + + this.id = data.id; + this.name = data.name; + this.order = data.order; + this.services = data.services; + this.userId = data.userId; + } +} diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index aab66708b..ea61cec31 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -1,7 +1,7 @@ import { observable, reaction } from 'mobx'; import Store from '../../stores/lib/Store'; import CachedRequest from '../../stores/lib/CachedRequest'; -import Workspace from '../../models/Workspace'; +import Workspace from './models/Workspace'; import { matchRoute } from '../../helpers/routing-helpers'; const debug = require('debug')('Franz:feature:workspaces'); diff --git a/src/features/workspaces/styles/workspaces-table.scss b/src/features/workspaces/styles/workspaces-table.scss new file mode 100644 index 000000000..6d0e7b4f5 --- /dev/null +++ b/src/features/workspaces/styles/workspaces-table.scss @@ -0,0 +1,53 @@ +@import '../../../styles/config'; + +.theme__dark .workspace-table { + .workspace-table__column-info .mdi { color: $dark-theme-gray-lightest; } + + .workspace-table__row { + border-bottom: 1px solid $dark-theme-gray-darker; + + &:hover { background: $dark-theme-gray-darker; } + &.workspace-table__row--disabled { color: $dark-theme-gray; } + } +} + +.workspace-table { + width: 100%; + + .workspace-table__toggle { + width: 60px; + + .franz-form__field { + margin-bottom: 0; + } + } + + .workspace-table__column-action { + width: 40px + } + + .workspace-table__column-info { + width: 40px; + + .mdi { + color: $theme-gray-light; + display: block; + font-size: 18px; + } + } + + .workspace-table__row { + border-bottom: 1px solid $theme-gray-lightest; + + &:hover { + cursor: initial; + background: $theme-gray-lightest; + } + + &.workspace-table__row--disabled { + color: $theme-gray-light; + } + } + + td { padding: 10px; } +} diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index b5abb56d4..5cb8c6bd3 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -158,6 +158,7 @@ "settings.navigation.logout" : "Abmelden", "settings.navigation.settings" : "Einstellungen", "settings.navigation.yourServices" : "Deine Dienste", + "settings.navigation.yourWorkspaces": "Deine Workspaces", "settings.recipes.all" : "Alle Dienste", "settings.recipes.dev" : "Entwicklung", "settings.recipes.headline" : "Verfügbare Dienste", @@ -216,6 +217,8 @@ "settings.services.tooltip.isMuted" : "Alle Töne sind deaktiviert", "settings.services.tooltip.notificationsDisabled" : "Benachrichtigungen deaktiviert", "settings.services.updatedInfo" : "Deine Änderungen wurden gespeichert", + "settings.workspaces.headline": "Deine Workspaces", + "settings.workspace.form.yourWorkspaces": "Deine Workspaces", "settings.user.form.accountType.company" : "Firma", "settings.user.form.accountType.individual" : "Einzelperson", "settings.user.form.accountType.label" : "Konto-Typ", diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 1652b5585..9b323e323 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -197,6 +197,7 @@ "settings.user.form.accountType.non-profit": "Non-Profit", "settings.user.form.accountType.company": "Company", "settings.workspaces.headline": "Your workspaces", + "settings.workspace.form.yourWorkspaces": "Your workspaces", "subscription.type.free": "free", "subscription.type.month": "month", "subscription.type.year": "year", diff --git a/src/models/Workspace.js b/src/models/Workspace.js deleted file mode 100644 index ede2710dc..000000000 --- a/src/models/Workspace.js +++ /dev/null @@ -1,25 +0,0 @@ -import { observable } from 'mobx'; - -export default class Workspace { - id = null; - - @observable name = null; - - @observable order = null; - - @observable services = []; - - @observable userId = null; - - constructor(data) { - if (!data.id) { - throw Error('Workspace requires Id'); - } - - this.id = data.id; - this.name = data.name; - this.order = data.order; - this.services = data.services; - this.userId = data.userId; - } -} diff --git a/src/styles/main.scss b/src/styles/main.scss index 30f43532f..a941d89d0 100644 --- a/src/styles/main.scss +++ b/src/styles/main.scss @@ -30,7 +30,7 @@ $mdi-font-path: '../node_modules/mdi/fonts'; @import './content-tabs.scss'; @import './invite.scss'; @import './title-bar.scss'; -@import './workspace-table.scss'; +@import '../features/workspaces/styles/workspaces-table'; // form @import './input.scss'; diff --git a/src/styles/workspace-table.scss b/src/styles/workspace-table.scss deleted file mode 100644 index 05ebfa629..000000000 --- a/src/styles/workspace-table.scss +++ /dev/null @@ -1,53 +0,0 @@ -@import './config.scss'; - -.theme__dark .workspace-table { - .workspace-table__column-info .mdi { color: $dark-theme-gray-lightest; } - - .workspace-table__row { - border-bottom: 1px solid $dark-theme-gray-darker; - - &:hover { background: $dark-theme-gray-darker; } - &.workspace-table__row--disabled { color: $dark-theme-gray; } - } -} - -.workspace-table { - width: 100%; - - .workspace-table__toggle { - width: 60px; - - .franz-form__field { - margin-bottom: 0; - } - } - - .workspace-table__column-action { - width: 40px - } - - .workspace-table__column-info { - width: 40px; - - .mdi { - color: $theme-gray-light; - display: block; - font-size: 18px; - } - } - - .workspace-table__row { - border-bottom: 1px solid $theme-gray-lightest; - - &:hover { - cursor: initial; - background: $theme-gray-lightest; - } - - &.workspace-table__row--disabled { - color: $theme-gray-light; - } - } - - td { padding: 10px; } -} -- cgit v1.2.3-54-g00ecf From a421ba151f40695f54a4890219c5ec8af0a24a45 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Tue, 19 Feb 2019 15:02:11 +0100 Subject: prepare basic workspace edit form --- .../workspaces/components/EditWorkspaceForm.js | 142 +++++++++++++++++++++ .../workspaces/containers/EditWorkspaceScreen.js | 67 +++------- src/i18n/locales/de.json | 3 + src/i18n/locales/en-US.json | 3 + 4 files changed, 164 insertions(+), 51 deletions(-) create mode 100644 src/features/workspaces/components/EditWorkspaceForm.js diff --git a/src/features/workspaces/components/EditWorkspaceForm.js b/src/features/workspaces/components/EditWorkspaceForm.js new file mode 100644 index 000000000..9e87b56dd --- /dev/null +++ b/src/features/workspaces/components/EditWorkspaceForm.js @@ -0,0 +1,142 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { observer } from 'mobx-react'; +import { defineMessages, intlShape } from 'react-intl'; +import { Link } from 'react-router'; +import { Input, Button } from '@meetfranz/forms'; + +import Form from '../../../lib/Form'; +import Workspace from '../models/Workspace'; + +const messages = defineMessages({ + buttonDelete: { + id: 'settings.workspace.form.buttonDelete', + defaultMessage: '!!!Delete workspace', + }, + buttonSave: { + id: 'settings.workspace.form.buttonSave', + defaultMessage: '!!!Save workspace', + }, + name: { + id: 'settings.workspace.form.name', + defaultMessage: '!!!Name', + }, + yourWorkspaces: { + id: 'settings.workspace.form.yourWorkspaces', + defaultMessage: '!!!Your workspaces', + }, +}); + +@observer +class EditWorkspaceForm extends Component { + static contextTypes = { + intl: intlShape, + }; + + static propTypes = { + workspace: PropTypes.instanceOf(Workspace).isRequired, + onSave: PropTypes.func.isRequired, + onDelete: PropTypes.func.isRequired, + isSaving: PropTypes.bool.isRequired, + isDeleting: PropTypes.bool.isRequired, + }; + + prepareForm(workspace) { + const { intl } = this.context; + const config = { + fields: { + name: { + label: intl.formatMessage(messages.name), + placeholder: intl.formatMessage(messages.name), + value: workspace.name, + }, + }, + }; + return new Form(config); + } + + submitForm(submitEvent, form) { + submitEvent.preventDefault(); + form.submit({ + onSuccess: async (f) => { + const { onSave } = this.props; + const values = f.values(); + onSave(values); + }, + onError: async () => {}, + }); + } + + render() { + const { intl } = this.context; + const { + workspace, + isDeleting, + isSaving, + onDelete, + } = this.props; + if (!workspace) return null; + + const form = this.prepareForm(workspace); + + return ( +
+
+ + + {intl.formatMessage(messages.yourWorkspaces)} + + + + + {workspace.name} + +
+
+
this.submitForm(e, form)} id="form"> +
+ +
+
+
+
+ {/* ===== Delete Button ===== */} + {isDeleting ? ( +
+
+ ); + } +} + +export default EditWorkspaceForm; diff --git a/src/features/workspaces/containers/EditWorkspaceScreen.js b/src/features/workspaces/containers/EditWorkspaceScreen.js index d8c52f586..ed54b194e 100644 --- a/src/features/workspaces/containers/EditWorkspaceScreen.js +++ b/src/features/workspaces/containers/EditWorkspaceScreen.js @@ -1,72 +1,37 @@ import React, { Component } from 'react'; import { inject, observer } from 'mobx-react'; -import { defineMessages, intlShape } from 'react-intl'; -import { Link } from 'react-router'; -import Form from '../../../lib/Form'; + import ErrorBoundary from '../../../components/util/ErrorBoundary'; import { gaPage } from '../../../lib/analytics'; import { state } from '../state'; - -const messages = defineMessages({ - name: { - id: 'settings.workspace.form.name', - defaultMessage: '!!!Name', - }, - yourWorkspaces: { - id: 'settings.workspace.form.yourWorkspaces', - defaultMessage: '!!!Your workspaces', - }, -}); +import EditWorkspaceForm from '../components/EditWorkspaceForm'; @inject('stores', 'actions') @observer class EditWorkspaceScreen extends Component { - static contextTypes = { - intl: intlShape, - }; - componentDidMount() { gaPage('Settings/Workspace/Edit'); } - prepareForm(workspace) { - const { intl } = this.context; - const config = { - fields: { - name: { - label: intl.formatMessage(messages.name), - placeholder: intl.formatMessage(messages.name), - value: workspace.name, - }, - }, - }; - return new Form(config); - } + onDelete = () => { + console.log('delete workspace'); + }; + + onSave = (values) => { + console.log('save workspace', values); + }; render() { - const { intl } = this.context; const { workspaceBeingEdited } = state; if (!workspaceBeingEdited) return null; - - // const form = this.prepareForm(workspaceBeingEdited); - return ( -
-
- - - {intl.formatMessage(messages.yourWorkspaces)} - - - - - {workspaceBeingEdited.name} - -
-
- test -
-
+
); } diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index 5cb8c6bd3..ffad8b835 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -219,6 +219,9 @@ "settings.services.updatedInfo" : "Deine Änderungen wurden gespeichert", "settings.workspaces.headline": "Deine Workspaces", "settings.workspace.form.yourWorkspaces": "Deine Workspaces", + "settings.workspace.form.name": "Name", + "settings.workspace.form.buttonDelete": "Workspace löschen", + "settings.workspace.form.buttonSave": "Workspace speichern", "settings.user.form.accountType.company" : "Firma", "settings.user.form.accountType.individual" : "Einzelperson", "settings.user.form.accountType.label" : "Konto-Typ", diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 9b323e323..899c62651 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -198,6 +198,9 @@ "settings.user.form.accountType.company": "Company", "settings.workspaces.headline": "Your workspaces", "settings.workspace.form.yourWorkspaces": "Your workspaces", + "settings.workspace.form.name": "Name", + "settings.workspace.form.buttonDelete": "Delete Workspace", + "settings.workspace.form.buttonSave": "Save Workspace", "subscription.type.free": "free", "subscription.type.month": "month", "subscription.type.year": "year", -- cgit v1.2.3-54-g00ecf From 58a5df079320ad99f3c8b369dc163455f8895eec Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Fri, 22 Feb 2019 12:32:39 +0100 Subject: add on enter key handler for form input component --- packages/forms/src/input/index.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/forms/src/input/index.tsx b/packages/forms/src/input/index.tsx index de7e7848e..791e0f360 100644 --- a/packages/forms/src/input/index.tsx +++ b/packages/forms/src/input/index.tsx @@ -25,6 +25,7 @@ interface IProps extends React.InputHTMLAttributes, IFormField showPasswordToggle?: boolean; data: IData; inputClassName?: string; + onEnterKey?: Function; } interface IState { @@ -80,6 +81,13 @@ class InputComponent extends Component { } } + onInputKeyPress(e: React.KeyboardEvent) { + if (e.key === "Enter") { + const { onEnterKey } = this.props; + onEnterKey && onEnterKey(); + } + } + render() { const { classes, @@ -100,6 +108,7 @@ class InputComponent extends Component { placeholder, spellCheck, onBlur, + onEnterKey, } = this.props; const { @@ -144,6 +153,7 @@ class InputComponent extends Component { onChange={this.onChange.bind(this)} onBlur={onBlur} disabled={disabled} + onKeyPress={this.onInputKeyPress.bind(this)} /> {suffix && ( -- cgit v1.2.3-54-g00ecf From 7e40b08e2f8ab2448dcbe2ce7b4e38ca66764b9c Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Fri, 22 Feb 2019 12:34:27 +0100 Subject: add form for creating workspaces --- .eslintrc | 2 +- src/features/delayApp/Component.js | 2 +- src/features/workspaces/actions.js | 3 + src/features/workspaces/api.js | 9 +++ .../workspaces/components/CreateWorkspaceForm.js | 94 ++++++++++++++++++++++ .../workspaces/components/WorkspacesDashboard.js | 58 ++++++++----- .../workspaces/containers/WorkspacesScreen.js | 1 + src/features/workspaces/store.js | 14 +++- src/i18n/locales/de.json | 6 +- src/i18n/locales/en-US.json | 2 + src/styles/main.scss | 2 + 11 files changed, 170 insertions(+), 23 deletions(-) create mode 100644 src/features/workspaces/components/CreateWorkspaceForm.js diff --git a/.eslintrc b/.eslintrc index e15148e96..48fb21250 100644 --- a/.eslintrc +++ b/.eslintrc @@ -13,7 +13,7 @@ "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }], - "react/forbid-prop-types": 1, + "react/forbid-prop-types": 0, "react/destructuring-assignment": 1, "prefer-destructuring": 1, "no-underscore-dangle": 0, diff --git a/src/features/delayApp/Component.js b/src/features/delayApp/Component.js index ff84510e8..ff0f1f2f8 100644 --- a/src/features/delayApp/Component.js +++ b/src/features/delayApp/Component.js @@ -38,7 +38,7 @@ export default @inject('actions') @injectSheet(styles) @observer class DelayApp state = { countdown: config.delayDuration, - } + }; countdownInterval = null; diff --git a/src/features/workspaces/actions.js b/src/features/workspaces/actions.js index 30866af96..390af0696 100644 --- a/src/features/workspaces/actions.js +++ b/src/features/workspaces/actions.js @@ -5,4 +5,7 @@ export default { edit: { workspace: PropTypes.instanceOf(Workspace).isRequired, }, + create: { + name: PropTypes.string.isRequired, + }, }; diff --git a/src/features/workspaces/api.js b/src/features/workspaces/api.js index 97badbd01..65108a077 100644 --- a/src/features/workspaces/api.js +++ b/src/features/workspaces/api.js @@ -10,4 +10,13 @@ export default { if (!request.ok) throw request; return request.json(); }, + createWorkspace: async (name) => { + const url = `${API}/${API_VERSION}/workspace`; + const request = await window.fetch(url, prepareAuthRequest({ + method: 'POST', + body: JSON.stringify({ name }), + })); + if (!request.ok) throw request; + return request.json(); + }, }; diff --git a/src/features/workspaces/components/CreateWorkspaceForm.js b/src/features/workspaces/components/CreateWorkspaceForm.js new file mode 100644 index 000000000..d440b9bae --- /dev/null +++ b/src/features/workspaces/components/CreateWorkspaceForm.js @@ -0,0 +1,94 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { observer } from 'mobx-react'; +import { defineMessages, intlShape } from 'react-intl'; +import { Input, Button } from '@meetfranz/forms'; +import injectSheet from 'react-jss'; + +import Form from '../../../lib/Form'; + +const messages = defineMessages({ + submitButton: { + id: 'settings.workspace.add.form.submitButton', + defaultMessage: '!!!Save workspace', + }, + name: { + id: 'settings.workspace.add.form.name', + defaultMessage: '!!!Name', + }, +}); + +const styles = () => ({ + form: { + display: 'flex', + }, + input: { + flexGrow: 1, + marginRight: '10px', + }, + submitButton: { + height: 'inherit', + marginTop: '17px', + }, +}); + +@observer @injectSheet(styles) +class CreateWorkspaceForm extends Component { + static contextTypes = { + intl: intlShape, + }; + + static propTypes = { + classes: PropTypes.object.isRequired, + onSubmit: PropTypes.func.isRequired, + }; + + prepareForm() { + const { intl } = this.context; + const config = { + fields: { + name: { + label: intl.formatMessage(messages.name), + placeholder: intl.formatMessage(messages.name), + value: '', + }, + }, + }; + return new Form(config); + } + + submitForm(form) { + form.submit({ + onSuccess: async (f) => { + const { onSubmit } = this.props; + const values = f.values(); + onSubmit(values); + }, + onError: async () => {}, + }); + } + + render() { + const { intl } = this.context; + const { classes } = this.props; + const form = this.prepareForm(); + + return ( +
+ +
+ ); + } +} + +export default CreateWorkspaceForm; diff --git a/src/features/workspaces/components/WorkspacesDashboard.js b/src/features/workspaces/components/WorkspacesDashboard.js index 2a8b3a5ee..917807302 100644 --- a/src/features/workspaces/components/WorkspacesDashboard.js +++ b/src/features/workspaces/components/WorkspacesDashboard.js @@ -2,9 +2,11 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { observer, PropTypes as MobxPropTypes } from 'mobx-react'; import { defineMessages, intlShape } from 'react-intl'; +import injectSheet from 'react-jss'; import Loader from '../../../components/ui/Loader'; import WorkspaceItem from './WorkspaceItem'; +import CreateWorkspaceForm from './CreateWorkspaceForm'; const messages = defineMessages({ headline: { @@ -17,12 +19,21 @@ const messages = defineMessages({ }, }); -@observer +const styles = () => ({ + createForm: { + height: 'auto', + marginBottom: '20px', + }, +}); + +@observer @injectSheet(styles) class WorkspacesDashboard extends Component { static propTypes = { - workspaces: MobxPropTypes.arrayOrObservableArray.isRequired, + classes: PropTypes.object.isRequired, isLoading: PropTypes.bool.isRequired, + onCreateWorkspaceSubmit: PropTypes.func.isRequired, onWorkspaceClick: PropTypes.func.isRequired, + workspaces: MobxPropTypes.arrayOrObservableArray.isRequired, }; static contextTypes = { @@ -30,7 +41,13 @@ class WorkspacesDashboard extends Component { }; render() { - const { workspaces, isLoading, onWorkspaceClick } = this.props; + const { + workspaces, + isLoading, + onCreateWorkspaceSubmit, + onWorkspaceClick, + classes, + } = this.props; const { intl } = this.context; return ( @@ -39,21 +56,26 @@ class WorkspacesDashboard extends Component {

{intl.formatMessage(messages.headline)}

- {isLoading ? ( - - ) : ( - - - {workspaces.map(workspace => ( - onWorkspaceClick(w)} - /> - ))} - -
- )} +
+
+ +
+ {isLoading ? ( + + ) : ( + + + {workspaces.map(workspace => ( + onWorkspaceClick(w)} + /> + ))} + +
+ )} +
); diff --git a/src/features/workspaces/containers/WorkspacesScreen.js b/src/features/workspaces/containers/WorkspacesScreen.js index f129edec5..eb3287952 100644 --- a/src/features/workspaces/containers/WorkspacesScreen.js +++ b/src/features/workspaces/containers/WorkspacesScreen.js @@ -27,6 +27,7 @@ class WorkspacesScreen extends Component { workspace.create(data)} onWorkspaceClick={w => workspace.edit({ workspace: w })} /> diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index ea61cec31..d90f9caac 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -49,6 +49,7 @@ export default class WorkspacesStore extends Store { ); this.actions.workspace.edit.listen(this._edit); + this.actions.workspace.create.listen(this._create); } _setWorkspaces = (workspaces) => { @@ -64,5 +65,16 @@ export default class WorkspacesStore extends Store { _edit = ({ workspace }) => { this.stores.router.push(`/settings/workspaces/edit/${workspace.id}`); - } + }; + + _create = async ({ name }) => { + try { + const result = await this.api.createWorkspace(name); + const workspace = new Workspace(result); + this.state.workspaces.push(workspace); + this._edit({ workspace }); + } catch (error) { + throw error; + } + }; } diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index ffad8b835..b795b90f8 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -218,10 +218,12 @@ "settings.services.tooltip.notificationsDisabled" : "Benachrichtigungen deaktiviert", "settings.services.updatedInfo" : "Deine Änderungen wurden gespeichert", "settings.workspaces.headline": "Deine Workspaces", + "settings.workspace.add.form.submitButton": "Create Workspace", + "settings.workspace.add.form.name": "Name", "settings.workspace.form.yourWorkspaces": "Deine Workspaces", "settings.workspace.form.name": "Name", - "settings.workspace.form.buttonDelete": "Workspace löschen", - "settings.workspace.form.buttonSave": "Workspace speichern", + "settings.workspace.form.buttonDelete": "Workspace löschen", + "settings.workspace.form.buttonSave": "Workspace speichern", "settings.user.form.accountType.company" : "Firma", "settings.user.form.accountType.individual" : "Einzelperson", "settings.user.form.accountType.label" : "Konto-Typ", diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 899c62651..24c96cb26 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -197,6 +197,8 @@ "settings.user.form.accountType.non-profit": "Non-Profit", "settings.user.form.accountType.company": "Company", "settings.workspaces.headline": "Your workspaces", + "settings.workspace.add.form.submitButton": "Create Workspace", + "settings.workspace.add.form.name": "Name", "settings.workspace.form.yourWorkspaces": "Your workspaces", "settings.workspace.form.name": "Name", "settings.workspace.form.buttonDelete": "Delete Workspace", diff --git a/src/styles/main.scss b/src/styles/main.scss index a941d89d0..9ba7f5827 100644 --- a/src/styles/main.scss +++ b/src/styles/main.scss @@ -30,6 +30,8 @@ $mdi-font-path: '../node_modules/mdi/fonts'; @import './content-tabs.scss'; @import './invite.scss'; @import './title-bar.scss'; + +// Workspaces legacy css @import '../features/workspaces/styles/workspaces-table'; // form -- cgit v1.2.3-54-g00ecf From 18d2b0f988792632d8b9395d06613d08c582ad7b Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Fri, 22 Feb 2019 13:03:40 +0100 Subject: small fixes --- .eslintrc | 1 + src/i18n/locales/de.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.eslintrc b/.eslintrc index 48fb21250..f1051723d 100644 --- a/.eslintrc +++ b/.eslintrc @@ -2,6 +2,7 @@ "parser": "babel-eslint", "extends": "eslint-config-airbnb", "rules": { + "consistent-return": 0, "import/extensions": 0, "import/no-extraneous-dependencies": 0, "import/no-unresolved": [2, { diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index b795b90f8..e1a955176 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -218,7 +218,7 @@ "settings.services.tooltip.notificationsDisabled" : "Benachrichtigungen deaktiviert", "settings.services.updatedInfo" : "Deine Änderungen wurden gespeichert", "settings.workspaces.headline": "Deine Workspaces", - "settings.workspace.add.form.submitButton": "Create Workspace", + "settings.workspace.add.form.submitButton": "Workspace erstellen", "settings.workspace.add.form.name": "Name", "settings.workspace.form.yourWorkspaces": "Deine Workspaces", "settings.workspace.form.name": "Name", -- cgit v1.2.3-54-g00ecf From 3de31efa29b8f2729f968d9d63c42d21c7d8dcf5 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Fri, 22 Feb 2019 13:04:51 +0100 Subject: adds flow for deleting workspaces --- src/api/utils/auth.js | 4 ++++ src/features/workspaces/actions.js | 3 +++ src/features/workspaces/api.js | 18 ++++++++++++------ .../workspaces/containers/EditWorkspaceScreen.js | 14 +++++++++++++- src/features/workspaces/containers/WorkspacesScreen.js | 6 +++--- src/features/workspaces/store.js | 11 +++++++++++ 6 files changed, 46 insertions(+), 10 deletions(-) diff --git a/src/api/utils/auth.js b/src/api/utils/auth.js index 47ac94c19..d469853a5 100644 --- a/src/api/utils/auth.js +++ b/src/api/utils/auth.js @@ -22,3 +22,7 @@ export const prepareAuthRequest = (options, auth = true) => { return request; }; + +export const sendAuthRequest = (url, options) => ( + window.fetch(url, prepareAuthRequest(options)) +); diff --git a/src/features/workspaces/actions.js b/src/features/workspaces/actions.js index 390af0696..83d3447c3 100644 --- a/src/features/workspaces/actions.js +++ b/src/features/workspaces/actions.js @@ -8,4 +8,7 @@ export default { create: { name: PropTypes.string.isRequired, }, + delete: { + workspace: PropTypes.instanceOf(Workspace).isRequired, + }, }; diff --git a/src/features/workspaces/api.js b/src/features/workspaces/api.js index 65108a077..fabc12455 100644 --- a/src/features/workspaces/api.js +++ b/src/features/workspaces/api.js @@ -1,21 +1,27 @@ -import { prepareAuthRequest } from '../../api/utils/auth'; +import { sendAuthRequest } from '../../api/utils/auth'; import { API, API_VERSION } from '../../environment'; export default { getUserWorkspaces: async () => { const url = `${API}/${API_VERSION}/workspace`; - const request = await window.fetch(url, prepareAuthRequest({ - method: 'GET', - })); + const request = await sendAuthRequest(url, { method: 'GET' }); if (!request.ok) throw request; return request.json(); }, + createWorkspace: async (name) => { const url = `${API}/${API_VERSION}/workspace`; - const request = await window.fetch(url, prepareAuthRequest({ + const request = await sendAuthRequest(url, { method: 'POST', body: JSON.stringify({ name }), - })); + }); + if (!request.ok) throw request; + return request.json(); + }, + + deleteWorkspace: async (workspace) => { + const url = `${API}/${API_VERSION}/workspace/${workspace.id}`; + const request = await sendAuthRequest(url, { method: 'DELETE' }); if (!request.ok) throw request; return request.json(); }, diff --git a/src/features/workspaces/containers/EditWorkspaceScreen.js b/src/features/workspaces/containers/EditWorkspaceScreen.js index ed54b194e..87b6062fb 100644 --- a/src/features/workspaces/containers/EditWorkspaceScreen.js +++ b/src/features/workspaces/containers/EditWorkspaceScreen.js @@ -5,15 +5,27 @@ import ErrorBoundary from '../../../components/util/ErrorBoundary'; import { gaPage } from '../../../lib/analytics'; import { state } from '../state'; import EditWorkspaceForm from '../components/EditWorkspaceForm'; +import PropTypes from 'prop-types'; @inject('stores', 'actions') @observer class EditWorkspaceScreen extends Component { + static propTypes = { + actions: PropTypes.shape({ + workspace: PropTypes.shape({ + delete: PropTypes.func.isRequired, + }), + }).isRequired, + }; + componentDidMount() { gaPage('Settings/Workspace/Edit'); } onDelete = () => { - console.log('delete workspace'); + const { workspaceBeingEdited } = state; + const { actions } = this.props; + if (!workspaceBeingEdited) return null; + actions.workspace.delete({ workspace: workspaceBeingEdited }); }; onSave = (values) => { diff --git a/src/features/workspaces/containers/WorkspacesScreen.js b/src/features/workspaces/containers/WorkspacesScreen.js index eb3287952..a3876a01a 100644 --- a/src/features/workspaces/containers/WorkspacesScreen.js +++ b/src/features/workspaces/containers/WorkspacesScreen.js @@ -21,14 +21,14 @@ class WorkspacesScreen extends Component { } render() { - const { workspace } = this.props.actions; + const { actions } = this.props; return ( workspace.create(data)} - onWorkspaceClick={w => workspace.edit({ workspace: w })} + onCreateWorkspaceSubmit={data => actions.workspace.create(data)} + onWorkspaceClick={w => actions.workspace.edit({ workspace: w })} /> ); diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index d90f9caac..a9b93f904 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -50,6 +50,7 @@ export default class WorkspacesStore extends Store { this.actions.workspace.edit.listen(this._edit); this.actions.workspace.create.listen(this._create); + this.actions.workspace.delete.listen(this._delete); } _setWorkspaces = (workspaces) => { @@ -77,4 +78,14 @@ export default class WorkspacesStore extends Store { throw error; } }; + + _delete = async ({ workspace }) => { + try { + await this.api.deleteWorkspace(workspace); + this.state.workspaces.remove(workspace); + this.stores.router.push('/settings/workspaces'); + } catch (error) { + throw error; + } + }; } -- cgit v1.2.3-54-g00ecf From d06c28489168e64c1a4124cedcf205b320b72708 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Fri, 22 Feb 2019 16:34:42 +0100 Subject: stop tracking google analytics in components --- src/features/workspaces/containers/EditWorkspaceScreen.js | 7 +------ src/features/workspaces/containers/WorkspacesScreen.js | 5 ----- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/src/features/workspaces/containers/EditWorkspaceScreen.js b/src/features/workspaces/containers/EditWorkspaceScreen.js index 87b6062fb..1ddf8dfcb 100644 --- a/src/features/workspaces/containers/EditWorkspaceScreen.js +++ b/src/features/workspaces/containers/EditWorkspaceScreen.js @@ -1,11 +1,10 @@ import React, { Component } from 'react'; import { inject, observer } from 'mobx-react'; +import PropTypes from 'prop-types'; import ErrorBoundary from '../../../components/util/ErrorBoundary'; -import { gaPage } from '../../../lib/analytics'; import { state } from '../state'; import EditWorkspaceForm from '../components/EditWorkspaceForm'; -import PropTypes from 'prop-types'; @inject('stores', 'actions') @observer class EditWorkspaceScreen extends Component { @@ -17,10 +16,6 @@ class EditWorkspaceScreen extends Component { }).isRequired, }; - componentDidMount() { - gaPage('Settings/Workspace/Edit'); - } - onDelete = () => { const { workspaceBeingEdited } = state; const { actions } = this.props; diff --git a/src/features/workspaces/containers/WorkspacesScreen.js b/src/features/workspaces/containers/WorkspacesScreen.js index a3876a01a..b89cbcf67 100644 --- a/src/features/workspaces/containers/WorkspacesScreen.js +++ b/src/features/workspaces/containers/WorkspacesScreen.js @@ -1,7 +1,6 @@ import React, { Component } from 'react'; import { inject, observer } from 'mobx-react'; import PropTypes from 'prop-types'; -import { gaPage } from '../../../lib/analytics'; import { state } from '../state'; import WorkspacesDashboard from '../components/WorkspacesDashboard'; import ErrorBoundary from '../../../components/util/ErrorBoundary'; @@ -16,10 +15,6 @@ class WorkspacesScreen extends Component { }).isRequired, }; - componentDidMount() { - gaPage('Settings/Workspaces Dashboard'); - } - render() { const { actions } = this.props; return ( -- cgit v1.2.3-54-g00ecf From 34015cf4872cf921d579bd15befb09020e3dfbc8 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Fri, 22 Feb 2019 16:53:46 +0100 Subject: pin gulp-sass-variables version to 1.1.1 --- package-lock.json | 422 +++++++++++++++++++++++++----------------------------- package.json | 2 +- 2 files changed, 195 insertions(+), 229 deletions(-) diff --git a/package-lock.json b/package-lock.json index b816b421f..f34f0bef9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1442,7 +1442,7 @@ "@lerna/get-packed": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-3.7.0.tgz", - "integrity": "sha512-yuFtjsUZIHjeIvIYQ/QuytC+FQcHwo3peB+yGBST2uWCLUCR5rx6knoQcPzbxdFDCuUb5IFccFGd3B1fHFg3RQ==", + "integrity": "sha1-VJx3OPe+XjsUM+gu2c2pEjvNHtU=", "dev": true, "requires": { "fs-extra": "^7.0.0", @@ -1567,7 +1567,7 @@ "@lerna/npm-conf": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-3.7.0.tgz", - "integrity": "sha512-+WSMDfPKcKzMfqq283ydz9RRpOU6p9wfx0wy4hVSUY/6YUpsyuk8SShjcRtY8zTM5AOrxvFBuuV90H4YpZ5+Ng==", + "integrity": "sha1-8QHU/fB8788RYbz688DxBbQgpFA=", "dev": true, "requires": { "config-chain": "^1.1.11", @@ -1823,7 +1823,7 @@ "@lerna/run-parallel-batches": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@lerna/run-parallel-batches/-/run-parallel-batches-3.0.0.tgz", - "integrity": "sha512-Mj1ravlXF7AkkewKd9YFq9BtVrsStNrvVLedD/b2wIVbNqcxp8lS68vehXVOzoL/VWNEDotvqCQtyDBilCodGw==", + "integrity": "sha1-RocEk0CEx0mR0xJNgGB4V9TfqEA=", "dev": true, "requires": { "p-map": "^1.2.0", @@ -1968,7 +1968,7 @@ "@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "integrity": "sha1-UkryQNGjYFJ7cwR17PoTRKpUDd4=", "dev": true, "requires": { "call-me-maybe": "^1.0.1", @@ -1978,7 +1978,7 @@ "@nodelib/fs.stat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "integrity": "sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs=", "dev": true }, "@octokit/endpoint": { @@ -2354,7 +2354,7 @@ "dependencies": { "mime-types": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", "integrity": "sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4=", "dev": true } @@ -2412,7 +2412,7 @@ "agent-base": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "integrity": "sha1-2J5ZmfeXh1Z0wH2H8mD8Qeg+jKk=", "dev": true, "requires": { "es6-promisify": "^5.0.0" @@ -2421,7 +2421,7 @@ "agentkeepalive": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "integrity": "sha1-oROSTdP6JKC8O3gQjEUMKr7gD2c=", "dev": true, "requires": { "humanize-ms": "^1.2.1" @@ -2468,7 +2468,7 @@ }, "ansi-colors": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "resolved": "http://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, "requires": { @@ -2895,7 +2895,7 @@ }, "util": { "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { @@ -2930,7 +2930,7 @@ }, "async": { "version": "0.1.22", - "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", + "resolved": "http://registry.npmjs.org/async/-/async-0.1.22.tgz", "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=" }, "async-done": { @@ -3742,7 +3742,7 @@ "byte-size": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-4.0.4.tgz", - "integrity": "sha512-82RPeneC6nqCdSwCX2hZUz3JPOvN5at/nTEw/CMf05Smu3Hrpo9Psb7LjN+k+XndNArG1EY8L4+BM3aTM4BCvw==", + "integrity": "sha1-KdOBcJ9BquDYnGMfHIGuyIzUCyM=", "dev": true }, "bytes": { @@ -3754,7 +3754,7 @@ "cacache": { "version": "11.3.2", "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", - "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "integrity": "sha1-LYHjCOPSWMo4Eltna5iyrJzmm/o=", "dev": true, "requires": { "bluebird": "^3.5.3", @@ -3776,7 +3776,7 @@ "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", "dev": true, "requires": { "yallist": "^3.0.2" @@ -4400,16 +4400,7 @@ "debug": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=" }, "readable-stream": { "version": "2.3.6", @@ -4430,6 +4421,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -4473,7 +4465,7 @@ "config-chain": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "integrity": "sha1-D96NCRIA616AjK8l/mGMAvSOTvo=", "dev": true, "requires": { "ini": "^1.3.4", @@ -4519,7 +4511,7 @@ "dependencies": { "debug": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz", + "resolved": "http://registry.npmjs.org/debug/-/debug-1.0.4.tgz", "integrity": "sha1-W5wla9VLbsAigxdvqKDt5tFUy/g=", "dev": true, "requires": { @@ -4789,7 +4781,7 @@ "conventional-recommended-bump": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-4.0.4.tgz", - "integrity": "sha512-9mY5Yoblq+ZMqJpBzgS+RpSq+SUfP2miOR3H/NR9drGf08WCrY9B6HAGJZEm6+ThsVP917VHAahSOjM6k1vhPg==", + "integrity": "sha1-BVQFhGQdPadYyIY8CXiPyutYaHI=", "dev": true, "requires": { "concat-stream": "^1.6.0", @@ -4880,7 +4872,7 @@ "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", "dev": true, "requires": { "aproba": "^1.1.1", @@ -5181,8 +5173,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decamelize-keys": { "version": "1.1.0", @@ -5460,7 +5451,7 @@ "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=", "dev": true }, "diffie-hellman": { @@ -5477,7 +5468,7 @@ "dir-glob": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "integrity": "sha1-CyBdK2rvmCOMooZZioIE0p0KADQ=", "dev": true, "requires": { "arrify": "^1.0.1", @@ -5562,7 +5553,7 @@ "dependencies": { "domelementtype": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" } } @@ -5606,7 +5597,7 @@ }, "dotenv": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", + "resolved": "http://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=", "dev": true }, @@ -5626,7 +5617,7 @@ }, "duplexer": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, @@ -5649,18 +5640,14 @@ "resolved": false, "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "util-deprecate": "~1.0.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "code-point-at": { "version": "1.1.0", "resolved": false, - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "optional": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "concat-map": { "version": "0.0.1", @@ -5670,20 +5657,17 @@ "console-control-strings": { "version": "1.1.0", "resolved": false, - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "optional": true + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "optional": true + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==" }, "deep-extend": { "version": "0.5.1", "resolved": false, - "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", - "optional": true + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==" }, "delegates": { "version": "1.0.0", @@ -5693,8 +5677,7 @@ "detect-libc": { "version": "1.0.3", "resolved": false, - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "optional": true + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, "fs-extra": { "version": "4.0.3", @@ -5710,7 +5693,6 @@ "version": "1.2.5", "resolved": false, "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "optional": true, "requires": { "minipass": "^2.2.1" } @@ -5718,14 +5700,12 @@ "fs.realpath": { "version": "1.0.0", "resolved": false, - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "optional": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "gauge": { "version": "2.7.4", "resolved": false, "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "optional": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -5741,7 +5721,6 @@ "version": "7.1.2", "resolved": false, "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "optional": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5754,14 +5733,12 @@ "has-unicode": { "version": "2.0.1", "resolved": false, - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "optional": true + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "iconv-lite": { "version": "0.4.21", "resolved": false, "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", - "optional": true, "requires": { "safer-buffer": "^2.1.0" } @@ -5770,7 +5747,6 @@ "version": "3.0.1", "resolved": false, "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "optional": true, "requires": { "minimatch": "^3.0.4" } @@ -5779,27 +5755,22 @@ "version": "1.0.6", "resolved": false, "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "optional": true, "requires": { - "safe-buffer": "~5.1.0" + "once": "^1.3.0", + "wrappy": "1" } }, "ini": { "version": "1.3.5", "resolved": false, - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "optional": true + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": false, "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "optional": true, "requires": { - "bluebird-lst": "^1.0.6", - "debug": "^4.1.0", - "fs-extra-p": "^7.0.0", - "sax": "^1.2.4" + "number-is-nan": "^1.0.0" } }, "isarray": { @@ -5817,7 +5788,6 @@ "version": "2.2.4", "resolved": false, "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", - "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -5827,7 +5797,9 @@ "version": "1.1.0", "resolved": false, "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", - "optional": true + "requires": { + "minipass": "^2.2.1" + } }, "ms": { "version": "2.0.0", @@ -5838,7 +5810,6 @@ "version": "2.2.0", "resolved": false, "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", - "optional": true, "requires": { "iconv-lite": "^0.4.4", "sax": "^1.2.4" @@ -5865,7 +5836,6 @@ "version": "4.0.1", "resolved": false, "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "optional": true, "requires": { "abbrev": "1", "osenv": "^0.1.4" @@ -5874,14 +5844,12 @@ "npm-bundled": { "version": "1.0.3", "resolved": false, - "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==", - "optional": true + "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==" }, "npm-packlist": { "version": "1.1.10", "resolved": false, "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", - "optional": true, "requires": { "ignore-walk": "^3.0.1", "npm-bundled": "^1.0.1" @@ -5891,7 +5859,6 @@ "version": "4.1.2", "resolved": false, "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "optional": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -5907,14 +5874,12 @@ "object-assign": { "version": "4.1.1", "resolved": false, - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "optional": true + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "once": { "version": "1.4.0", "resolved": false, "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "optional": true, "requires": { "wrappy": "1" } @@ -5922,20 +5887,17 @@ "os-homedir": { "version": "1.0.2", "resolved": false, - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "optional": true + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-tmpdir": { "version": "1.0.2", "resolved": false, - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "optional": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "osenv": { "version": "0.1.5", "resolved": false, "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "optional": true, "requires": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" @@ -5944,14 +5906,12 @@ "path-is-absolute": { "version": "1.0.1", "resolved": false, - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "optional": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "rc": { "version": "1.2.7", "resolved": false, "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", - "optional": true, "requires": { "deep-extend": "^0.5.1", "ini": "~1.3.0", @@ -5962,14 +5922,13 @@ "minimist": { "version": "1.2.0", "resolved": false, - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "optional": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, "readable-stream": { "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { @@ -5983,7 +5942,6 @@ "version": "2.6.2", "resolved": false, "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "optional": true, "requires": { "glob": "^7.0.5" } @@ -5991,38 +5949,32 @@ "safer-buffer": { "version": "2.1.2", "resolved": false, - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "optional": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sax": { "version": "1.2.4", "resolved": false, - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "optional": true + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "semver": { "version": "5.5.0", "resolved": false, - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "optional": true + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" }, "set-blocking": { "version": "2.0.0", "resolved": false, - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "optional": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "signal-exit": { "version": "3.0.2", "resolved": false, - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "optional": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "string-width": { "version": "1.0.2", "resolved": false, "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -6038,20 +5990,17 @@ "strip-ansi": { "version": "3.0.1", "resolved": false, - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "optional": true + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" }, "strip-json-comments": { "version": "2.0.1", "resolved": false, - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "optional": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "tar": { "version": "4.4.1", "resolved": false, "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==", - "optional": true, "requires": { "chownr": "^1.0.1", "fs-minipass": "^1.2.5", @@ -6066,7 +6015,6 @@ "version": "1.1.2", "resolved": false, "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "optional": true, "requires": { "string-width": "^1.0.2" } @@ -6074,14 +6022,12 @@ "wrappy": { "version": "1.0.2", "resolved": false, - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "optional": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "yallist": { "version": "3.0.2", "resolved": false, - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", - "optional": true + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" } } }, @@ -6464,7 +6410,8 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true }, "encoding": { "version": "0.1.12", @@ -6509,7 +6456,7 @@ }, "debug": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", "dev": true, "requires": { @@ -6518,7 +6465,7 @@ }, "ms": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", "dev": true }, @@ -6552,7 +6499,7 @@ "dependencies": { "debug": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", "dev": true, "requires": { @@ -6561,7 +6508,7 @@ }, "ms": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", "dev": true } @@ -6622,6 +6569,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, "requires": { "is-arrayish": "^0.2.1" }, @@ -6629,7 +6577,8 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true } } }, @@ -6683,12 +6632,12 @@ "es6-promise": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", - "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", + "integrity": "sha1-2m0NVpLvtGHggsFIF/4kJ9j10FQ=", "dev": true }, "es6-promisify": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { @@ -6888,14 +6837,16 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, "requires": { "locate-path": "^2.0.0" } }, "load-json-file": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -6907,6 +6858,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -6916,6 +6868,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, "requires": { "p-try": "^1.0.0" } @@ -6924,6 +6877,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, "requires": { "p-limit": "^1.1.0" } @@ -6931,12 +6885,14 @@ "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, "requires": { "error-ex": "^1.2.0" } @@ -6945,6 +6901,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, "requires": { "pify": "^2.0.0" } @@ -6952,12 +6909,14 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, "requires": { "load-json-file": "^2.0.0", "normalize-package-data": "^2.3.2", @@ -6979,8 +6938,8 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "decamelize": "^1.1.1", + "window-size": "^0.1.4" } } } @@ -7357,16 +7316,18 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true }, "finalhandler": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "dev": true, "requires": { @@ -7401,6 +7362,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, "requires": { "ee-first": "1.1.1" } @@ -7416,13 +7378,8 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", - "unpipe": "~1.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1" } }, "send": { @@ -7690,7 +7647,7 @@ "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "integrity": "sha1-hiRwESkBxyeg5JWoB0S9W6odZ5A=", "dev": true }, "figures": { @@ -7748,7 +7705,7 @@ }, "finalhandler": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.1.0.tgz", + "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-0.1.0.tgz", "integrity": "sha1-2gW7xPX0owyEzh2R88FUAHxOnao=", "dev": true, "requires": { @@ -7758,7 +7715,7 @@ "dependencies": { "debug": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz", + "resolved": "http://registry.npmjs.org/debug/-/debug-1.0.4.tgz", "integrity": "sha1-W5wla9VLbsAigxdvqKDt5tFUy/g=", "dev": true, "requires": { @@ -7767,7 +7724,7 @@ }, "ms": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.6.2.tgz", "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=", "dev": true } @@ -8339,7 +8296,7 @@ "genfun": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", - "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "integrity": "sha1-ndlxCgaQClxKW/V6yl2k5S/nZTc=", "dev": true }, "get-caller-file": { @@ -8878,7 +8835,7 @@ }, "got": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { @@ -9401,7 +9358,8 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "requires": { - "is-posix-bracket": "^0.1.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1" } }, "resolve": { @@ -9459,7 +9417,7 @@ }, "yargs": { "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", "dev": true, "requires": { @@ -9491,10 +9449,14 @@ } }, "gulp-sass-variables": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/gulp-sass-variables/-/gulp-sass-variables-1.1.1.tgz", + "integrity": "sha1-lZIVkPihuEpofryz7Lwwp0vO9E0=", + "dev": true, + "requires": { + "gulp-util": "^3.0.7", + "through2": "^2.0.1" + } }, "gulp-server-livereload": { "version": "1.9.2", @@ -9630,7 +9592,7 @@ }, "lodash": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", "dev": true }, @@ -9690,7 +9652,7 @@ }, "readable-stream": { "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { @@ -10271,7 +10233,7 @@ "http-cache-semantics": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "integrity": "sha1-ObDhat2bYFvwqe89nar0hDtMrNI=", "dev": true }, "http-deceiver": { @@ -10282,7 +10244,7 @@ }, "http-errors": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { @@ -10320,7 +10282,7 @@ "http-proxy-agent": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "integrity": "sha1-5IIb7vWyFCogJr1zkm/lN2McVAU=", "dev": true, "requires": { "agent-base": "4", @@ -10330,7 +10292,7 @@ "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", "dev": true, "requires": { "ms": "2.0.0" @@ -10370,7 +10332,7 @@ "https-proxy-agent": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "integrity": "sha1-UVUpcPoE1yPgTFbQQXjD+SWSu8A=", "dev": true, "requires": { "agent-base": "^4.1.0", @@ -10380,7 +10342,7 @@ "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", "dev": true, "requires": { "ms": "^2.1.1" @@ -10389,7 +10351,7 @@ "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", "dev": true } } @@ -10405,7 +10367,7 @@ }, "hunspell-asm": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hunspell-asm/-/hunspell-asm-1.0.2.tgz", + "resolved": "http://registry.npmjs.org/hunspell-asm/-/hunspell-asm-1.0.2.tgz", "integrity": "sha512-UTLBvc0yZiIcHl9qrgxnFTZbX3zF4CprzEY+u+N0iXlUKZnUJRIgvgppTdgiQTsucm5b0aN/rHsgXz2q/0kBRA==", "requires": { "emscripten-wasm-loader": "^1.0.0", @@ -10483,7 +10445,7 @@ "ignore-walk": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "integrity": "sha1-qD5i59JyrA47VRqqgoMaGbafgvg=", "dev": true, "requires": { "minimatch": "^3.0.4" @@ -10525,7 +10487,7 @@ "import-local": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "integrity": "sha1-Xk/9wD9P5sAJxnKb6yljHC+CJ7w=", "dev": true, "requires": { "pkg-dir": "^2.0.0", @@ -10588,7 +10550,7 @@ "init-package-json": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.10.3.tgz", - "integrity": "sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==", + "integrity": "sha1-Rf/i9hCoyhNPK9HbVjeyNQcPbL4=", "dev": true, "requires": { "glob": "^7.1.1", @@ -10692,7 +10654,7 @@ "inversify": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/inversify/-/inversify-5.0.1.tgz", - "integrity": "sha512-Ieh06s48WnEYGcqHepdsJUIJUXpwH5o5vodAX+DK2JA/gjy4EbEcQZxw+uFfzysmKjiLXGYwNG3qDZsKVMcINQ==", + "integrity": "sha1-UA1wmxQ0iWzloNWJFcSkIQ40+24=", "dev": true }, "invert-kv": { @@ -10721,7 +10683,7 @@ }, "is": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is/-/is-0.3.0.tgz", + "resolved": "http://registry.npmjs.org/is/-/is-0.3.0.tgz", "integrity": "sha1-qPcd/IpuKDcWJ/JskpCYxvTV1dc=", "dev": true }, @@ -10945,7 +10907,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, @@ -10989,7 +10951,8 @@ "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true }, "is-primitive": { "version": "2.0.0", @@ -11126,7 +11089,7 @@ }, "isemail": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=" }, "isexe": { @@ -11157,7 +11120,7 @@ }, "joi": { "version": "6.10.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", + "resolved": "http://registry.npmjs.org/joi/-/joi-6.10.1.tgz", "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=", "requires": { "hoek": "2.x.x", @@ -11554,7 +11517,7 @@ "libnpmaccess": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-3.0.1.tgz", - "integrity": "sha512-RlZ7PNarCBt+XbnP7R6PoVgOq9t+kou5rvhaInoNibhPO7eMlRfS0B8yjatgn2yaHIwWNyoJDolC/6Lc5L/IQA==", + "integrity": "sha1-Wzqd5iHyk9QlGRqi53kQL4QWf6g=", "dev": true, "requires": { "aproba": "^2.0.0", @@ -11566,7 +11529,7 @@ "aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "integrity": "sha1-UlILiuW1aSFbNU78DKo/4eRaitw=", "dev": true } } @@ -12012,7 +11975,7 @@ "make-fetch-happen": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz", - "integrity": "sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ==", + "integrity": "sha1-FBSXy4ePJDupMTbIPYq6EsIWwIM=", "dev": true, "requires": { "agentkeepalive": "^3.4.1", @@ -12103,7 +12066,7 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, @@ -12194,7 +12157,7 @@ }, "readable-stream": { "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { @@ -12225,7 +12188,7 @@ "merge2": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", + "integrity": "sha1-fumdvWm7ZIFoklPwGEiKG5ArDtU=", "dev": true }, "methods": { @@ -12319,7 +12282,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "minimist-options": { @@ -12352,7 +12315,7 @@ "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=", "dev": true, "requires": { "concat-stream": "^1.5.0", @@ -12390,7 +12353,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" @@ -12398,7 +12361,7 @@ "dependencies": { "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" } } @@ -12562,7 +12525,7 @@ }, "multimatch": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", "dev": true, "requires": { @@ -12700,7 +12663,7 @@ "node-fetch-npm": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", - "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", + "integrity": "sha1-cljJBGGC3KNFtCCO2pGNrzNpf/c=", "dev": true, "requires": { "encoding": "^0.1.11", @@ -12736,7 +12699,7 @@ "dependencies": { "semver": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "resolved": "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz", "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", "dev": true }, @@ -13914,7 +13877,7 @@ "p-map": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=", "dev": true }, "p-map-series": { @@ -14087,7 +14050,7 @@ "dependencies": { "color-convert": { "version": "0.5.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "resolved": "http://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", "dev": true } @@ -14221,7 +14184,8 @@ "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true }, "pascalcase": { "version": "0.1.1", @@ -14231,7 +14195,7 @@ }, "path-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "resolved": "http://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", "dev": true }, @@ -14510,7 +14474,7 @@ }, "pretty-hrtime": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "resolved": "http://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", "dev": true }, @@ -14663,7 +14627,7 @@ "protoduck": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", - "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "integrity": "sha1-A8NlnKGAB7aaUP2Cp+vMUWJhFR8=", "dev": true, "requires": { "genfun": "^5.0.0" @@ -15011,7 +14975,7 @@ }, "react-router": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-3.2.1.tgz", + "resolved": "http://registry.npmjs.org/react-router/-/react-router-3.2.1.tgz", "integrity": "sha512-SXkhC0nr3G0ltzVU07IN8jYl0bB6FsrDIqlLC9dK3SITXqyTJyM7yhXlUqs89w3Nqi5OkXsfRUeHX+P874HQrg==", "requires": { "create-react-class": "^15.5.1", @@ -15126,7 +15090,7 @@ "read-package-json": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", - "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==", + "integrity": "sha1-LoLr2fYTuqbS6+Oqcs7+P2jkH0o=", "dev": true, "requires": { "glob": "^7.1.1", @@ -15147,7 +15111,7 @@ "read-package-tree": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.2.1.tgz", - "integrity": "sha512-2CNoRoh95LxY47LvqrehIAfUVda2JbuFE/HaGYs42bNrGG+ojbw1h3zOcPcQ+1GQ3+rkzNndZn85u1XyZ3UsIA==", + "integrity": "sha1-Yhixh9b6yCKJzkOHu7r47vU2rWM=", "dev": true, "requires": { "debuglog": "^1.0.1", @@ -15515,7 +15479,7 @@ }, "htmlparser2": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", "dev": true, "requires": { @@ -15533,7 +15497,7 @@ }, "readable-stream": { "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { @@ -15545,7 +15509,7 @@ }, "string_decoder": { "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true }, @@ -16168,7 +16132,7 @@ "dependencies": { "debug": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz", + "resolved": "http://registry.npmjs.org/debug/-/debug-1.0.4.tgz", "integrity": "sha1-W5wla9VLbsAigxdvqKDt5tFUy/g=", "dev": true, "requires": { @@ -16183,7 +16147,7 @@ }, "ms": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.6.2.tgz", "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=", "dev": true } @@ -16260,7 +16224,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -16511,7 +16475,7 @@ "dependencies": { "debug": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", "dev": true, "requires": { @@ -16520,7 +16484,7 @@ }, "ms": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", "dev": true }, @@ -16544,7 +16508,7 @@ "dependencies": { "debug": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", "dev": true, "requires": { @@ -16553,7 +16517,7 @@ }, "ms": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", "dev": true } @@ -16580,7 +16544,7 @@ "dependencies": { "debug": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", "dev": true, "requires": { @@ -16589,7 +16553,7 @@ }, "ms": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", "dev": true } @@ -16615,7 +16579,7 @@ }, "debug": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, "requires": { @@ -16630,7 +16594,7 @@ }, "ms": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true } @@ -16706,7 +16670,7 @@ "socks-proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz", - "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==", + "integrity": "sha1-WTa/i3B6mTB5xvN9sgkYIb/6ZHM=", "dev": true, "requires": { "agent-base": "~4.2.0", @@ -16943,7 +16907,7 @@ "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=", "dev": true, "requires": { "figgy-pudding": "^3.5.1" @@ -16985,7 +16949,8 @@ "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true }, "stdout-stream": { "version": "1.4.1", @@ -17061,7 +17026,7 @@ "stream-each": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -17152,7 +17117,8 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true }, "strip-eof": { "version": "1.0.0", @@ -17456,7 +17422,7 @@ }, "through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -17728,7 +17694,7 @@ "tslint": { "version": "5.12.0", "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.0.tgz", - "integrity": "sha512-CKEcH1MHUBhoV43SA/Jmy1l24HJJgI0eyLbBNSRyFlsQvb9v6Zdq+Nz2vEOH00nC5SUx4SneJ59PZUS/ARcokQ==", + "integrity": "sha1-R/LbopHtPVgHUtEJhm+2QHaPyjY=", "dev": true, "requires": { "babel-code-frame": "^6.22.0", @@ -17748,7 +17714,7 @@ "tslint-config-airbnb": { "version": "5.11.1", "resolved": "https://registry.npmjs.org/tslint-config-airbnb/-/tslint-config-airbnb-5.11.1.tgz", - "integrity": "sha512-hkaittm2607vVMe8eotANGN1CimD5tor7uoY3ypg2VTtEcDB/KGWYbJOz58t8LI4cWSyWtgqYQ5F0HwKxxhlkQ==", + "integrity": "sha1-UaJ/u4vyTBRNBkonSnHaR+fs5hc=", "dev": true, "requires": { "tslint-consistent-codestyle": "^1.14.1", @@ -17770,7 +17736,7 @@ "tslint-eslint-rules": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", - "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", + "integrity": "sha1-5IjMkYG/GT/lzXv8ohOnaV8XN7U=", "dev": true, "requires": { "doctrine": "0.7.2", @@ -17780,7 +17746,7 @@ "dependencies": { "doctrine": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", + "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", "dev": true, "requires": { @@ -17803,7 +17769,7 @@ "tslib": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", + "integrity": "sha1-43qG/ajLuvI6BX9HPJ9Nxk5fwug=", "dev": true }, "tsutils": { @@ -17820,7 +17786,7 @@ "tslint-microsoft-contrib": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz", - "integrity": "sha512-PDYjvpo0gN9IfMULwKk0KpVOPMhU6cNoT9VwCOLeDl/QS8v8W2yspRpFFuUS7/c5EIH/n8ApMi8TxJAz1tfFUA==", + "integrity": "sha1-pihoOfgA4lkdBB6igAx3SHhErYE=", "dev": true, "requires": { "tsutils": "^2.27.2 <2.29.0" @@ -17829,7 +17795,7 @@ "tsutils": { "version": "2.28.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", - "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", + "integrity": "sha1-a9ceFggo+dAZtvToRHQiKPhRaaE=", "dev": true, "requires": { "tslib": "^1.8.1" @@ -17840,7 +17806,7 @@ "tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "integrity": "sha1-MrSIUBRnrL7dS4VJhnOggSrKC5k=", "dev": true, "requires": { "tslib": "^1.8.1" @@ -17848,7 +17814,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -17895,7 +17861,7 @@ "typescript": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", - "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", + "integrity": "sha1-/oEBxGqhI/g1NSPr3PVzDCrkk+U=", "dev": true }, "ua-parser-js": { @@ -18034,7 +18000,7 @@ "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", "dev": true, "requires": { "unique-slug": "^2.0.0" @@ -18043,7 +18009,7 @@ "unique-slug": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "integrity": "sha1-Xp7cbRzo+yZNsYpQfvm9hURFHKY=", "dev": true, "requires": { "imurmurhash": "^0.1.4" @@ -18093,7 +18059,8 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true }, "unset-value": { "version": "1.0.0", @@ -18487,7 +18454,7 @@ }, "vm-browserify": { "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "resolved": "http://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", "dev": true, "requires": { @@ -18592,7 +18559,7 @@ "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "integrity": "sha1-qFWYCx8LazWbodXZ+zmulB+qY60=", "dev": true }, "webpack": { @@ -19003,8 +18970,7 @@ "window-size": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", - "dev": true + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" }, "windows-notification-state": { "version": "1.3.0", @@ -19084,7 +19050,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { @@ -19192,7 +19158,7 @@ "write-pkg": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.2.0.tgz", - "integrity": "sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw==", + "integrity": "sha1-DheP6Xgg04mokovHlTXb5ows/yE=", "dev": true, "requires": { "sort-keys": "^2.0.0", @@ -19234,7 +19200,7 @@ }, "xmlbuilder": { "version": "9.0.7", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", "dev": true }, diff --git a/package.json b/package.json index ed830b536..912ee4662 100644 --- a/package.json +++ b/package.json @@ -130,7 +130,7 @@ "gulp-babel": "^8.0.0", "gulp-cli": "1.2.2", "gulp-sass": "^4.0.2", - "gulp-sass-variables": "^1.1.1", + "gulp-sass-variables": "1.1.1", "gulp-server-livereload": "^1.9.2", "hex-rgb": "3.0.0", "html-webpack-plugin": "4.0.0-beta.5", -- cgit v1.2.3-54-g00ecf From 9f0a77af747060a42bd8789672fb2f2a870636d8 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Fri, 22 Feb 2019 17:15:56 +0100 Subject: fix merge conflict --- packages/forms/src/input/index.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/forms/src/input/index.tsx b/packages/forms/src/input/index.tsx index 68bb5ac57..6be29e6e5 100644 --- a/packages/forms/src/input/index.tsx +++ b/packages/forms/src/input/index.tsx @@ -109,11 +109,8 @@ class InputComponent extends Component { placeholder, spellCheck, onBlur, -<<<<<<< HEAD onEnterKey, -======= onFocus, ->>>>>>> develop } = this.props; const { -- cgit v1.2.3-54-g00ecf From a761f7cf596353b7ea21fced7b598b1ec44f9c50 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Tue, 26 Feb 2019 13:31:12 +0100 Subject: fix bug in form input library --- packages/forms/src/input/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/forms/src/input/index.tsx b/packages/forms/src/input/index.tsx index 6be29e6e5..cc3709b1a 100644 --- a/packages/forms/src/input/index.tsx +++ b/packages/forms/src/input/index.tsx @@ -147,7 +147,7 @@ class InputComponent extends Component { id={id} type={inputType} name={name} - defaultValue={value as string} + value={value as string} placeholder={placeholder} spellCheck={spellCheck} className={classes.input} -- cgit v1.2.3-54-g00ecf From ff4c9c7f527e911c37cf02a5d048f5e6652ed253 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Tue, 26 Feb 2019 13:31:43 +0100 Subject: improve workspace form setup --- .../workspaces/components/CreateWorkspaceForm.js | 29 ++++++------- .../workspaces/components/EditWorkspaceForm.js | 50 ++++++++++++++-------- .../workspaces/containers/EditWorkspaceScreen.js | 2 +- 3 files changed, 46 insertions(+), 35 deletions(-) diff --git a/src/features/workspaces/components/CreateWorkspaceForm.js b/src/features/workspaces/components/CreateWorkspaceForm.js index d440b9bae..83f6e07f7 100644 --- a/src/features/workspaces/components/CreateWorkspaceForm.js +++ b/src/features/workspaces/components/CreateWorkspaceForm.js @@ -4,8 +4,8 @@ import { observer } from 'mobx-react'; import { defineMessages, intlShape } from 'react-intl'; import { Input, Button } from '@meetfranz/forms'; import injectSheet from 'react-jss'; - import Form from '../../../lib/Form'; +import { required } from '../../../helpers/validation-helpers'; const messages = defineMessages({ submitButton: { @@ -28,11 +28,11 @@ const styles = () => ({ }, submitButton: { height: 'inherit', - marginTop: '17px', + marginTop: '3px', }, }); -@observer @injectSheet(styles) +@injectSheet(styles) @observer class CreateWorkspaceForm extends Component { static contextTypes = { intl: intlShape, @@ -43,46 +43,45 @@ class CreateWorkspaceForm extends Component { onSubmit: PropTypes.func.isRequired, }; - prepareForm() { + form = (() => { const { intl } = this.context; - const config = { + return new Form({ fields: { name: { label: intl.formatMessage(messages.name), placeholder: intl.formatMessage(messages.name), value: '', + validators: [required], }, }, - }; - return new Form(config); - } + }); + })(); - submitForm(form) { + submitForm() { + const { form } = this; form.submit({ onSuccess: async (f) => { const { onSubmit } = this.props; - const values = f.values(); - onSubmit(values); + onSubmit(f.values()); }, - onError: async () => {}, }); } render() { const { intl } = this.context; const { classes } = this.props; - const form = this.prepareForm(); - + const { form } = this; return (
diff --git a/src/features/workspaces/containers/EditWorkspaceScreen.js b/src/features/workspaces/containers/EditWorkspaceScreen.js index 1ddf8dfcb..17b723303 100644 --- a/src/features/workspaces/containers/EditWorkspaceScreen.js +++ b/src/features/workspaces/containers/EditWorkspaceScreen.js @@ -3,8 +3,8 @@ import { inject, observer } from 'mobx-react'; import PropTypes from 'prop-types'; import ErrorBoundary from '../../../components/util/ErrorBoundary'; -import { state } from '../state'; import EditWorkspaceForm from '../components/EditWorkspaceForm'; +import { state } from '../state'; @inject('stores', 'actions') @observer class EditWorkspaceScreen extends Component { -- cgit v1.2.3-54-g00ecf From dca7437b45c8eb67692a1df563fb4e969826b1cc Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Tue, 26 Feb 2019 15:29:34 +0100 Subject: finish basic workspace settings --- src/features/workspaces/actions.js | 3 ++ src/features/workspaces/api.js | 11 +++++ .../workspaces/components/EditWorkspaceForm.js | 46 +++++++++++++++++++-- .../workspaces/components/ServiceListItem.js | 48 ++++++++++++++++++++++ .../workspaces/containers/EditWorkspaceScreen.js | 14 ++++++- src/features/workspaces/models/Workspace.js | 2 +- src/features/workspaces/store.js | 12 ++++++ src/i18n/locales/de.json | 1 + src/i18n/locales/en-US.json | 1 + 9 files changed, 132 insertions(+), 6 deletions(-) create mode 100644 src/features/workspaces/components/ServiceListItem.js diff --git a/src/features/workspaces/actions.js b/src/features/workspaces/actions.js index 83d3447c3..84de2b011 100644 --- a/src/features/workspaces/actions.js +++ b/src/features/workspaces/actions.js @@ -11,4 +11,7 @@ export default { delete: { workspace: PropTypes.instanceOf(Workspace).isRequired, }, + update: { + workspace: PropTypes.instanceOf(Workspace).isRequired, + }, }; diff --git a/src/features/workspaces/api.js b/src/features/workspaces/api.js index fabc12455..733cb5593 100644 --- a/src/features/workspaces/api.js +++ b/src/features/workspaces/api.js @@ -1,3 +1,4 @@ +import { pick } from 'lodash'; import { sendAuthRequest } from '../../api/utils/auth'; import { API, API_VERSION } from '../../environment'; @@ -25,4 +26,14 @@ export default { if (!request.ok) throw request; return request.json(); }, + + updateWorkspace: async (workspace) => { + const url = `${API}/${API_VERSION}/workspace/${workspace.id}`; + const request = await sendAuthRequest(url, { + method: 'PUT', + body: JSON.stringify(pick(workspace, ['name', 'services'])), + }); + if (!request.ok) throw request; + return request.json(); + }, }; diff --git a/src/features/workspaces/components/EditWorkspaceForm.js b/src/features/workspaces/components/EditWorkspaceForm.js index 05ca65403..48090f608 100644 --- a/src/features/workspaces/components/EditWorkspaceForm.js +++ b/src/features/workspaces/components/EditWorkspaceForm.js @@ -7,8 +7,10 @@ import { Input, Button } from '@meetfranz/forms'; import injectSheet from 'react-jss'; import Workspace from '../models/Workspace'; +import Service from '../../../models/Service'; import Form from '../../../lib/Form'; import { required } from '../../../helpers/validation-helpers'; +import ServiceListItem from './ServiceListItem'; const messages = defineMessages({ buttonDelete: { @@ -27,12 +29,19 @@ const messages = defineMessages({ id: 'settings.workspace.form.yourWorkspaces', defaultMessage: '!!!Your workspaces', }, + servicesInWorkspaceHeadline: { + id: 'settings.workspace.form.servicesInWorkspaceHeadline', + defaultMessage: '!!!Services in this Workspace', + }, }); const styles = () => ({ nameInput: { height: 'auto', }, + serviceList: { + height: 'auto', + }, }); @injectSheet(styles) @observer @@ -42,11 +51,13 @@ class EditWorkspaceForm extends Component { }; static propTypes = { - workspace: PropTypes.instanceOf(Workspace).isRequired, - onSave: PropTypes.func.isRequired, - onDelete: PropTypes.func.isRequired, - isSaving: PropTypes.bool.isRequired, + classes: PropTypes.object.isRequired, isDeleting: PropTypes.bool.isRequired, + isSaving: PropTypes.bool.isRequired, + onDelete: PropTypes.func.isRequired, + onSave: PropTypes.func.isRequired, + services: PropTypes.arrayOf(PropTypes.instanceOf(Service)).isRequired, + workspace: PropTypes.instanceOf(Workspace).isRequired, }; form = this.prepareWorkspaceForm(this.props.workspace); @@ -68,6 +79,9 @@ class EditWorkspaceForm extends Component { value: workspace.name, validators: [required], }, + services: { + value: workspace.services.slice(), + }, }, }); } @@ -83,6 +97,17 @@ class EditWorkspaceForm extends Component { }); } + toggleService(service) { + const servicesField = this.form.$('services'); + const serviceIds = servicesField.value; + if (serviceIds.includes(service.id)) { + serviceIds.splice(serviceIds.indexOf(service.id), 1); + } else { + serviceIds.push(service.id); + } + servicesField.set(serviceIds); + } + render() { const { intl } = this.context; const { @@ -91,8 +116,10 @@ class EditWorkspaceForm extends Component { isSaving, onDelete, workspace, + services, } = this.props; const { form } = this; + const workspaceServices = form.$('services').value; return (
@@ -110,6 +137,17 @@ class EditWorkspaceForm extends Component {
+

{intl.formatMessage(messages.servicesInWorkspaceHeadline)}

+
+ {services.map(s => ( + this.toggleService(s)} + /> + ))} +
{/* ===== Delete Button ===== */} diff --git a/src/features/workspaces/components/ServiceListItem.js b/src/features/workspaces/components/ServiceListItem.js new file mode 100644 index 000000000..146cc5a36 --- /dev/null +++ b/src/features/workspaces/components/ServiceListItem.js @@ -0,0 +1,48 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { observer } from 'mobx-react'; +import injectSheet from 'react-jss'; +import { Toggle } from '@meetfranz/forms'; + +import Service from '../../../models/Service'; + +const styles = () => ({ + service: { + height: 'auto', + display: 'flex', + }, + name: { + marginTop: '4px', + }, +}); + +@injectSheet(styles) @observer +class ServiceListItem extends Component { + static propTypes = { + classes: PropTypes.object.isRequired, + isInWorkspace: PropTypes.bool.isRequired, + onToggle: PropTypes.func.isRequired, + service: PropTypes.instanceOf(Service).isRequired, + }; + + render() { + const { + classes, + isInWorkspace, + onToggle, + service, + } = this.props; + + return ( +
+ +
+ ); + } +} + +export default ServiceListItem; diff --git a/src/features/workspaces/containers/EditWorkspaceScreen.js b/src/features/workspaces/containers/EditWorkspaceScreen.js index 17b723303..790b8a0fe 100644 --- a/src/features/workspaces/containers/EditWorkspaceScreen.js +++ b/src/features/workspaces/containers/EditWorkspaceScreen.js @@ -5,6 +5,8 @@ import PropTypes from 'prop-types'; import ErrorBoundary from '../../../components/util/ErrorBoundary'; import EditWorkspaceForm from '../components/EditWorkspaceForm'; import { state } from '../state'; +import ServicesStore from '../../../stores/ServicesStore'; +import Workspace from '../models/Workspace'; @inject('stores', 'actions') @observer class EditWorkspaceScreen extends Component { @@ -14,6 +16,9 @@ class EditWorkspaceScreen extends Component { delete: PropTypes.func.isRequired, }), }).isRequired, + stores: PropTypes.shape({ + services: PropTypes.instanceOf(ServicesStore).isRequired, + }).isRequired, }; onDelete = () => { @@ -24,16 +29,23 @@ class EditWorkspaceScreen extends Component { }; onSave = (values) => { - console.log('save workspace', values); + const { workspaceBeingEdited } = state; + const { actions } = this.props; + const workspace = new Workspace( + Object.assign({}, workspaceBeingEdited, values), + ); + actions.workspace.update({ workspace }); }; render() { const { workspaceBeingEdited } = state; + const { stores } = this.props; if (!workspaceBeingEdited) return null; return ( { @@ -88,4 +89,15 @@ export default class WorkspacesStore extends Store { throw error; } }; + + _update = async ({ workspace }) => { + try { + await this.api.updateWorkspace(workspace); + const localWorkspace = this.state.workspaces.find(ws => ws.id === workspace.id); + Object.assign(localWorkspace, workspace); + this.stores.router.push('/settings/workspaces'); + } catch (error) { + throw error; + } + }; } diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index e1a955176..4906070a3 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -224,6 +224,7 @@ "settings.workspace.form.name": "Name", "settings.workspace.form.buttonDelete": "Workspace löschen", "settings.workspace.form.buttonSave": "Workspace speichern", + "settings.workspace.form.servicesInWorkspaceHeadline": "Services in diesem Workspace", "settings.user.form.accountType.company" : "Firma", "settings.user.form.accountType.individual" : "Einzelperson", "settings.user.form.accountType.label" : "Konto-Typ", diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index fe16e916f..cd5c417e3 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -207,6 +207,7 @@ "settings.workspace.form.name": "Name", "settings.workspace.form.buttonDelete": "Delete Workspace", "settings.workspace.form.buttonSave": "Save Workspace", + "settings.workspace.form.servicesInWorkspaceHeadline": "Services in this Workspace", "subscription.type.free": "free", "subscription.type.month": "month", "subscription.type.year": "year", -- cgit v1.2.3-54-g00ecf From 739ef2e8a2dec94c3e10c3d26d797fe759fac7aa Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Fri, 1 Mar 2019 14:25:44 +0100 Subject: finish workspaces mvp --- src/actions/index.js | 8 ++- src/actions/lib/actions.js | 29 +++++---- src/components/layout/Sidebar.js | 2 +- src/components/services/tabs/Tabbar.js | 4 +- src/features/workspaces/actions.js | 9 ++- .../workspaces/containers/EditWorkspaceScreen.js | 12 ++-- .../workspaces/containers/WorkspacesScreen.js | 10 +-- src/features/workspaces/index.js | 40 +++++++++++- src/features/workspaces/state.js | 6 +- src/features/workspaces/store.js | 37 +++++++---- src/i18n/locales/de.json | 5 +- src/i18n/locales/en-US.json | 5 +- src/lib/Menu.js | 71 +++++++++++++++++++++- src/stores/ServicesStore.js | 12 ++-- 14 files changed, 193 insertions(+), 57 deletions(-) diff --git a/src/actions/index.js b/src/actions/index.js index 45e6da515..00f843cd6 100644 --- a/src/actions/index.js +++ b/src/actions/index.js @@ -11,7 +11,7 @@ import payment from './payment'; import news from './news'; import settings from './settings'; import requests from './requests'; -import workspace from '../features/workspaces/actions'; +import workspaces from '../features/workspaces/actions'; const actions = Object.assign({}, { service, @@ -24,7 +24,9 @@ const actions = Object.assign({}, { news, settings, requests, - workspace, }); -export default defineActions(actions, PropTypes.checkPropTypes); +export default Object.assign( + defineActions(actions, PropTypes.checkPropTypes), + { workspaces }, +); diff --git a/src/actions/lib/actions.js b/src/actions/lib/actions.js index 499018d70..6571e9441 100644 --- a/src/actions/lib/actions.js +++ b/src/actions/lib/actions.js @@ -1,18 +1,23 @@ +export const createActionsFromDefinitions = (actionDefinitions, validate) => { + const actions = {}; + Object.keys(actionDefinitions).forEach((actionName) => { + const action = (params) => { + const schema = actionDefinitions[actionName]; + validate(schema, params, actionName); + action.notify(params); + }; + actions[actionName] = action; + action.listeners = []; + action.listen = listener => action.listeners.push(listener); + action.notify = params => action.listeners.forEach(listener => listener(params)); + }); + return actions; +}; + export default (definitions, validate) => { const newActions = {}; Object.keys(definitions).forEach((scopeName) => { - newActions[scopeName] = {}; - Object.keys(definitions[scopeName]).forEach((actionName) => { - const action = (params) => { - const schema = definitions[scopeName][actionName]; - validate(schema, params, actionName); - action.notify(params); - }; - newActions[scopeName][actionName] = action; - action.listeners = []; - action.listen = listener => action.listeners.push(listener); - action.notify = params => action.listeners.forEach(listener => listener(params)); - }); + newActions[scopeName] = createActionsFromDefinitions(definitions[scopeName], validate); }); return newActions; }; diff --git a/src/components/layout/Sidebar.js b/src/components/layout/Sidebar.js index 609a3b604..fcc5b0001 100644 --- a/src/components/layout/Sidebar.js +++ b/src/components/layout/Sidebar.js @@ -31,7 +31,7 @@ export default @observer class Sidebar extends Component { openSettings: PropTypes.func.isRequired, toggleMuteApp: PropTypes.func.isRequired, isAppMuted: PropTypes.bool.isRequired, - } + }; static contextTypes = { intl: intlShape, diff --git a/src/components/services/tabs/Tabbar.js b/src/components/services/tabs/Tabbar.js index dd5c2140f..5e8260ad0 100644 --- a/src/components/services/tabs/Tabbar.js +++ b/src/components/services/tabs/Tabbar.js @@ -19,7 +19,7 @@ export default @observer class TabBar extends Component { updateService: PropTypes.func.isRequired, showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired, showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired, - } + }; onSortEnd = ({ oldIndex, newIndex }) => { const { @@ -45,7 +45,7 @@ export default @observer class TabBar extends Component { redirect: false, }); } - } + }; disableService({ serviceId }) { this.toggleService({ serviceId, isEnabled: false }); diff --git a/src/features/workspaces/actions.js b/src/features/workspaces/actions.js index 84de2b011..25246de09 100644 --- a/src/features/workspaces/actions.js +++ b/src/features/workspaces/actions.js @@ -1,7 +1,8 @@ import PropTypes from 'prop-types'; import Workspace from './models/Workspace'; +import { createActionsFromDefinitions } from '../../actions/lib/actions'; -export default { +export default createActionsFromDefinitions({ edit: { workspace: PropTypes.instanceOf(Workspace).isRequired, }, @@ -14,4 +15,8 @@ export default { update: { workspace: PropTypes.instanceOf(Workspace).isRequired, }, -}; + activate: { + workspace: PropTypes.instanceOf(Workspace).isRequired, + }, + deactivate: {}, +}, PropTypes.checkPropTypes); diff --git a/src/features/workspaces/containers/EditWorkspaceScreen.js b/src/features/workspaces/containers/EditWorkspaceScreen.js index 790b8a0fe..1b13bc2d4 100644 --- a/src/features/workspaces/containers/EditWorkspaceScreen.js +++ b/src/features/workspaces/containers/EditWorkspaceScreen.js @@ -4,7 +4,7 @@ import PropTypes from 'prop-types'; import ErrorBoundary from '../../../components/util/ErrorBoundary'; import EditWorkspaceForm from '../components/EditWorkspaceForm'; -import { state } from '../state'; +import { workspacesState } from '../state'; import ServicesStore from '../../../stores/ServicesStore'; import Workspace from '../models/Workspace'; @@ -22,23 +22,23 @@ class EditWorkspaceScreen extends Component { }; onDelete = () => { - const { workspaceBeingEdited } = state; + const { workspaceBeingEdited } = workspacesState; const { actions } = this.props; if (!workspaceBeingEdited) return null; - actions.workspace.delete({ workspace: workspaceBeingEdited }); + actions.workspaces.delete({ workspace: workspaceBeingEdited }); }; onSave = (values) => { - const { workspaceBeingEdited } = state; + const { workspaceBeingEdited } = workspacesState; const { actions } = this.props; const workspace = new Workspace( Object.assign({}, workspaceBeingEdited, values), ); - actions.workspace.update({ workspace }); + actions.workspaces.update({ workspace }); }; render() { - const { workspaceBeingEdited } = state; + const { workspaceBeingEdited } = workspacesState; const { stores } = this.props; if (!workspaceBeingEdited) return null; return ( diff --git a/src/features/workspaces/containers/WorkspacesScreen.js b/src/features/workspaces/containers/WorkspacesScreen.js index b89cbcf67..94e714255 100644 --- a/src/features/workspaces/containers/WorkspacesScreen.js +++ b/src/features/workspaces/containers/WorkspacesScreen.js @@ -1,7 +1,7 @@ import React, { Component } from 'react'; import { inject, observer } from 'mobx-react'; import PropTypes from 'prop-types'; -import { state } from '../state'; +import { workspacesState } from '../state'; import WorkspacesDashboard from '../components/WorkspacesDashboard'; import ErrorBoundary from '../../../components/util/ErrorBoundary'; @@ -20,10 +20,10 @@ class WorkspacesScreen extends Component { return ( actions.workspace.create(data)} - onWorkspaceClick={w => actions.workspace.edit({ workspace: w })} + workspaces={workspacesState.workspaces} + isLoading={workspacesState.isLoading} + onCreateWorkspaceSubmit={data => actions.workspaces.create(data)} + onWorkspaceClick={w => actions.workspaces.edit({ workspace: w })} /> ); diff --git a/src/features/workspaces/index.js b/src/features/workspaces/index.js index 50ac3b414..8091f49fc 100644 --- a/src/features/workspaces/index.js +++ b/src/features/workspaces/index.js @@ -1,14 +1,28 @@ -import { reaction } from 'mobx'; +import { reaction, runInAction } from 'mobx'; import WorkspacesStore from './store'; import api from './api'; -import { state, resetState } from './state'; +import { workspacesState, resetState } from './state'; const debug = require('debug')('Franz:feature:workspaces'); let store = null; +export const filterServicesByActiveWorkspace = (services) => { + const { isFeatureActive, activeWorkspace } = workspacesState; + if (isFeatureActive && activeWorkspace) { + return services.filter(s => activeWorkspace.services.includes(s.id)); + } + return services; +}; + +export const getActiveWorkspaceServices = (services) => { + return filterServicesByActiveWorkspace(services); +}; + export default function initWorkspaces(stores, actions) { const { features, user } = stores; + + // Toggle workspace feature reaction( () => ( features.features.isWorkspaceEnabled && ( @@ -18,10 +32,12 @@ export default function initWorkspaces(stores, actions) { (isEnabled) => { if (isEnabled) { debug('Initializing `workspaces` feature'); - store = new WorkspacesStore(stores, api, actions, state); + store = new WorkspacesStore(stores, api, actions, workspacesState); store.initialize(); + runInAction(() => { workspacesState.isFeatureActive = true; }); } else if (store) { debug('Disabling `workspaces` feature'); + runInAction(() => { workspacesState.isFeatureActive = false; }); store.teardown(); store = null; resetState(); // Reset state to default @@ -31,4 +47,22 @@ export default function initWorkspaces(stores, actions) { fireImmediately: true, }, ); + + // Update active service on workspace switches + reaction(() => ({ + isFeatureActive: workspacesState.isFeatureActive, + activeWorkspace: workspacesState.activeWorkspace, + }), ({ isFeatureActive, activeWorkspace }) => { + if (!isFeatureActive) return; + if (activeWorkspace) { + const services = stores.services.allDisplayed; + const activeService = services.find(s => s.isActive); + const workspaceServices = filterServicesByActiveWorkspace(services); + const isActiveServiceInWorkspace = workspaceServices.includes(activeService); + if (!isActiveServiceInWorkspace) { + console.log(workspaceServices[0].id); + actions.service.setActive({ serviceId: workspaceServices[0].id }); + } + } + }); } diff --git a/src/features/workspaces/state.js b/src/features/workspaces/state.js index f938c1470..963b96f81 100644 --- a/src/features/workspaces/state.js +++ b/src/features/workspaces/state.js @@ -1,13 +1,15 @@ import { observable } from 'mobx'; const defaultState = { + activeWorkspace: null, isLoading: false, + isFeatureActive: false, workspaces: [], workspaceBeingEdited: null, }; -export const state = observable(defaultState); +export const workspacesState = observable(defaultState); export function resetState() { - Object.assign(state, defaultState); + Object.assign(workspacesState, defaultState); } diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index 5cccb2ab7..a2997a0d2 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -1,8 +1,9 @@ -import { observable, reaction } from 'mobx'; +import { observable, reaction, action } from 'mobx'; import Store from '../../stores/lib/Store'; import CachedRequest from '../../stores/lib/CachedRequest'; import Workspace from './models/Workspace'; import { matchRoute } from '../../helpers/routing-helpers'; +import workspaceActions from './actions'; const debug = require('debug')('Franz:feature:workspaces'); @@ -48,28 +49,30 @@ export default class WorkspacesStore extends Store { }, ); - this.actions.workspace.edit.listen(this._edit); - this.actions.workspace.create.listen(this._create); - this.actions.workspace.delete.listen(this._delete); - this.actions.workspace.update.listen(this._update); + workspaceActions.edit.listen(this._edit); + workspaceActions.create.listen(this._create); + workspaceActions.delete.listen(this._delete); + workspaceActions.update.listen(this._update); + workspaceActions.activate.listen(this._setActiveWorkspace); + workspaceActions.deactivate.listen(this._deactivateActiveWorkspace); } - _setWorkspaces = (workspaces) => { + _getWorkspaceById = id => this.state.workspaces.find(w => w.id === id); + + @action _setWorkspaces = (workspaces) => { debug('setting user workspaces', workspaces.slice()); this.state.workspaces = workspaces.map(data => new Workspace(data)); }; - _setIsLoading = (isLoading) => { + @action _setIsLoading = (isLoading) => { this.state.isLoading = isLoading; }; - _getWorkspaceById = id => this.state.workspaces.find(w => w.id === id); - - _edit = ({ workspace }) => { + @action _edit = ({ workspace }) => { this.stores.router.push(`/settings/workspaces/edit/${workspace.id}`); }; - _create = async ({ name }) => { + @action _create = async ({ name }) => { try { const result = await this.api.createWorkspace(name); const workspace = new Workspace(result); @@ -80,7 +83,7 @@ export default class WorkspacesStore extends Store { } }; - _delete = async ({ workspace }) => { + @action _delete = async ({ workspace }) => { try { await this.api.deleteWorkspace(workspace); this.state.workspaces.remove(workspace); @@ -90,7 +93,7 @@ export default class WorkspacesStore extends Store { } }; - _update = async ({ workspace }) => { + @action _update = async ({ workspace }) => { try { await this.api.updateWorkspace(workspace); const localWorkspace = this.state.workspaces.find(ws => ws.id === workspace.id); @@ -100,4 +103,12 @@ export default class WorkspacesStore extends Store { throw error; } }; + + @action _setActiveWorkspace = ({ workspace }) => { + this.state.activeWorkspace = workspace; + }; + + @action _deactivateActiveWorkspace = () => { + this.state.activeWorkspace = null; + }; } diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index 4906070a3..0c1fb8aa6 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -74,6 +74,9 @@ "menu.window" : "Fenster", "menu.window.close" : "Schließen", "menu.window.minimize" : "Minimieren", + "menu.workspaces": "Workspaces", + "menu.workspaces.defaultWorkspace": "All services", + "menu.workspaces.addNewWorkspace": "Add New Workspace", "password.email.label" : "E-Mail Adresse", "password.headline" : "Passwort zurücksetzen", "password.link.login" : "An Deinem Konto anmelden", @@ -224,7 +227,7 @@ "settings.workspace.form.name": "Name", "settings.workspace.form.buttonDelete": "Workspace löschen", "settings.workspace.form.buttonSave": "Workspace speichern", - "settings.workspace.form.servicesInWorkspaceHeadline": "Services in diesem Workspace", + "settings.workspace.form.servicesInWorkspaceHeadline": "Services in diesem Workspace", "settings.user.form.accountType.company" : "Firma", "settings.user.form.accountType.individual" : "Einzelperson", "settings.user.form.accountType.label" : "Konto-Typ", diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 988ac46f2..2a51662a2 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -276,7 +276,10 @@ "menu.app.hideOthers": "Hide Others", "menu.app.unhide": "Unhide", "menu.app.quit": "Quit", - "menu.services.addNewService": "Add New Service...", + "menu.services.addNewService": "Add New Service", + "menu.workspaces": "Workspaces", + "menu.workspaces.defaultWorkspace": "All services", + "menu.workspaces.addNewWorkspace": "Add New Workspace", "validation.required": "{field} is required", "validation.email": "{field} is not valid", "validation.url": "{field} is not a valid URL", diff --git a/src/lib/Menu.js b/src/lib/Menu.js index c378619ad..1560dd285 100644 --- a/src/lib/Menu.js +++ b/src/lib/Menu.js @@ -3,6 +3,8 @@ import { observable, autorun, computed } from 'mobx'; import { defineMessages } from 'react-intl'; import { isMac, ctrlKey, cmdKey } from '../environment'; +import { workspacesState } from '../features/workspaces/state'; +import workspaceActions from '../features/workspaces/actions'; const { app, Menu, dialog } = remote; @@ -179,6 +181,18 @@ const menuItems = defineMessages({ id: 'menu.services.addNewService', defaultMessage: '!!!Add New Service...', }, + workspaces: { + id: 'menu.workspaces', + defaultMessage: '!!!Workspaces', + }, + defaultWorkspace: { + id: 'menu.workspaces.defaultWorkspace', + defaultMessage: '!!!Default', + }, + addNewWorkspace: { + id: 'menu.workspaces.addNewWorkspace', + defaultMessage: '!!!Add New Workspace...', + }, }); function getActiveWebview() { @@ -265,6 +279,10 @@ const _templateFactory = intl => [ label: intl.formatMessage(menuItems.services), submenu: [], }, + { + label: intl.formatMessage(menuItems.workspaces), + submenu: [], + }, { label: intl.formatMessage(menuItems.window), role: 'window', @@ -499,7 +517,9 @@ export default class FranzMenu { } _build() { - const serviceTpl = Object.assign([], this.serviceTpl); // need to clone object so we don't modify computed (cached) object + // need to clone object so we don't modify computed (cached) object + const serviceTpl = Object.assign([], this.serviceTpl); + const workspacesMenu = Object.assign([], this.workspacesMenu); if (window.franz === undefined) { return; @@ -632,7 +652,7 @@ export default class FranzMenu { }, ); - tpl[4].submenu.unshift(about, { + tpl[5].submenu.unshift(about, { type: 'separator', }); } else { @@ -678,6 +698,8 @@ export default class FranzMenu { tpl[3].submenu = serviceTpl; } + tpl[4].submenu = workspacesMenu; + this.currentTemplate = tpl; const menu = Menu.buildFromTemplate(tpl); Menu.setApplicationMenu(menu); @@ -701,6 +723,51 @@ export default class FranzMenu { return []; } + @computed get workspacesMenu() { + const { workspaces, activeWorkspace } = workspacesState; + const { intl } = window.franz; + const menu = []; + + // Add new workspace item: + menu.push({ + label: intl.formatMessage(menuItems.addNewWorkspace), + accelerator: `${cmdKey}+Shift+N`, + click: () => { + this.actions.ui.openSettings({ path: 'workspaces' }); + }, + enabled: this.stores.user.isLoggedIn, + }, { + type: 'separator', + }); + + // Default workspace + menu.push({ + label: intl.formatMessage(menuItems.defaultWorkspace), + accelerator: `${cmdKey}+Alt+1`, + type: 'radio', + checked: !activeWorkspace, + click: () => { + workspaceActions.deactivate(); + }, + }); + + // Workspace items + if (this.stores.user.isLoggedIn) { + workspaces.forEach((workspace, i) => menu.push({ + label: workspace.name, + accelerator: i < 9 ? `${cmdKey}+Alt+${i + 2}` : null, + type: 'radio', + checked: activeWorkspace ? workspace.id === activeWorkspace.id : false, + click: () => { + workspaceActions.activate({ workspace }); + }, + })); + } + + console.log(menu); + return menu; + } + _getServiceName(service) { if (service.name) { return service.name; diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js index c63bef196..a86db8103 100644 --- a/src/stores/ServicesStore.js +++ b/src/stores/ServicesStore.js @@ -2,7 +2,7 @@ import { action, reaction, computed, - observable, + observable, runInAction, } from 'mobx'; import { debounce, remove } from 'lodash'; import ms from 'ms'; @@ -12,6 +12,8 @@ import Request from './lib/Request'; import CachedRequest from './lib/CachedRequest'; import { matchRoute } from '../helpers/routing-helpers'; import { gaEvent } from '../lib/analytics'; +import { workspacesState } from '../features/workspaces/state'; +import { filterServicesByActiveWorkspace, getActiveWorkspaceServices } from '../features/workspaces'; const debug = require('debug')('Franz:ServiceStore'); @@ -98,7 +100,6 @@ export default class ServicesStore extends Store { return observable(services.slice().slice().sort((a, b) => a.order - b.order)); } } - return []; } @@ -107,13 +108,16 @@ export default class ServicesStore extends Store { } @computed get allDisplayed() { - return this.stores.settings.all.app.showDisabledServices ? this.all : this.enabled; + const services = this.stores.settings.all.app.showDisabledServices ? this.all : this.enabled; + return filterServicesByActiveWorkspace(services); } // This is just used to avoid unnecessary rerendering of resource-heavy webviews @computed get allDisplayedUnordered() { + const { showDisabledServices } = this.stores.settings.all.app; const services = this.allServicesRequest.execute().result || []; - return this.stores.settings.all.app.showDisabledServices ? services : services.filter(service => service.isEnabled); + const filteredServices = showDisabledServices ? services : services.filter(service => service.isEnabled); + return getActiveWorkspaceServices(filteredServices); } @computed get filtered() { -- cgit v1.2.3-54-g00ecf From 1947cad07e0d9c32ffb874bdea482e7ff037888b Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Fri, 1 Mar 2019 14:27:40 +0100 Subject: fix eslint issues --- src/features/workspaces/index.js | 6 +++--- src/stores/ServicesStore.js | 3 +-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/features/workspaces/index.js b/src/features/workspaces/index.js index 8091f49fc..79c9b8ac9 100644 --- a/src/features/workspaces/index.js +++ b/src/features/workspaces/index.js @@ -15,9 +15,9 @@ export const filterServicesByActiveWorkspace = (services) => { return services; }; -export const getActiveWorkspaceServices = (services) => { - return filterServicesByActiveWorkspace(services); -}; +export const getActiveWorkspaceServices = services => ( + filterServicesByActiveWorkspace(services) +); export default function initWorkspaces(stores, actions) { const { features, user } = stores; diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js index a86db8103..da4b19c0d 100644 --- a/src/stores/ServicesStore.js +++ b/src/stores/ServicesStore.js @@ -2,7 +2,7 @@ import { action, reaction, computed, - observable, runInAction, + observable, } from 'mobx'; import { debounce, remove } from 'lodash'; import ms from 'ms'; @@ -12,7 +12,6 @@ import Request from './lib/Request'; import CachedRequest from './lib/CachedRequest'; import { matchRoute } from '../helpers/routing-helpers'; import { gaEvent } from '../lib/analytics'; -import { workspacesState } from '../features/workspaces/state'; import { filterServicesByActiveWorkspace, getActiveWorkspaceServices } from '../features/workspaces'; const debug = require('debug')('Franz:ServiceStore'); -- cgit v1.2.3-54-g00ecf From 2c67a242c660b925a5c97d7844db1e43347ab6ba Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Mon, 4 Mar 2019 13:05:55 +0100 Subject: remove dev logs --- src/features/workspaces/index.js | 1 - src/lib/Menu.js | 1 - 2 files changed, 2 deletions(-) diff --git a/src/features/workspaces/index.js b/src/features/workspaces/index.js index 79c9b8ac9..26cadea64 100644 --- a/src/features/workspaces/index.js +++ b/src/features/workspaces/index.js @@ -60,7 +60,6 @@ export default function initWorkspaces(stores, actions) { const workspaceServices = filterServicesByActiveWorkspace(services); const isActiveServiceInWorkspace = workspaceServices.includes(activeService); if (!isActiveServiceInWorkspace) { - console.log(workspaceServices[0].id); actions.service.setActive({ serviceId: workspaceServices[0].id }); } } diff --git a/src/lib/Menu.js b/src/lib/Menu.js index 1560dd285..c572bbb70 100644 --- a/src/lib/Menu.js +++ b/src/lib/Menu.js @@ -764,7 +764,6 @@ export default class FranzMenu { })); } - console.log(menu); return menu; } -- cgit v1.2.3-54-g00ecf From cf9d7a30fed4fe50c346e652073464b07277a81e Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Fri, 8 Mar 2019 14:48:46 +0100 Subject: detach service when underlying webview unmounts --- src/actions/service.js | 4 + src/components/services/content/ServiceView.js | 136 ++++++++++++++++++++ src/components/services/content/ServiceWebview.js | 145 ++++------------------ src/components/services/content/Services.js | 7 +- src/containers/layout/AppLayoutContainer.js | 3 + src/stores/ServicesStore.js | 6 + 6 files changed, 179 insertions(+), 122 deletions(-) create mode 100644 src/components/services/content/ServiceView.js diff --git a/src/actions/service.js b/src/actions/service.js index 5d483b12a..ceaabc31e 100644 --- a/src/actions/service.js +++ b/src/actions/service.js @@ -1,4 +1,5 @@ import PropTypes from 'prop-types'; +import ServiceModel from '../models/Service'; export default { setActive: { @@ -36,6 +37,9 @@ export default { serviceId: PropTypes.string.isRequired, webview: PropTypes.object.isRequired, }, + detachService: { + service: PropTypes.instanceOf(ServiceModel).isRequired, + }, focusService: { serviceId: PropTypes.string.isRequired, }, diff --git a/src/components/services/content/ServiceView.js b/src/components/services/content/ServiceView.js new file mode 100644 index 000000000..5afc54f9d --- /dev/null +++ b/src/components/services/content/ServiceView.js @@ -0,0 +1,136 @@ +import React, { Component, Fragment } from 'react'; +import PropTypes from 'prop-types'; +import { autorun } from 'mobx'; +import { observer } from 'mobx-react'; +import classnames from 'classnames'; + +import ServiceModel from '../../../models/Service'; +import StatusBarTargetUrl from '../../ui/StatusBarTargetUrl'; +import WebviewLoader from '../../ui/WebviewLoader'; +import WebviewCrashHandler from './WebviewCrashHandler'; +import WebviewErrorHandler from './ErrorHandlers/WebviewErrorHandler'; +import ServiceDisabled from './ServiceDisabled'; +import ServiceWebview from './ServiceWebview'; + +export default @observer class ServiceView extends Component { + static propTypes = { + service: PropTypes.instanceOf(ServiceModel).isRequired, + setWebviewReference: PropTypes.func.isRequired, + detachService: PropTypes.func.isRequired, + reload: PropTypes.func.isRequired, + edit: PropTypes.func.isRequired, + enable: PropTypes.func.isRequired, + isActive: PropTypes.bool, + }; + + static defaultProps = { + isActive: false, + }; + + state = { + forceRepaint: false, + targetUrl: '', + statusBarVisible: false, + }; + + autorunDisposer = null; + + componentDidMount() { + this.autorunDisposer = autorun(() => { + if (this.props.service.isActive) { + this.setState({ forceRepaint: true }); + setTimeout(() => { + this.setState({ forceRepaint: false }); + }, 100); + } + }); + } + + componentWillUnmount() { + this.autorunDisposer(); + } + + updateTargetUrl = (event) => { + let visible = true; + if (event.url === '' || event.url === '#') { + visible = false; + } + this.setState({ + targetUrl: event.url, + statusBarVisible: visible, + }); + }; + + render() { + const { + detachService, + service, + setWebviewReference, + reload, + edit, + enable, + } = this.props; + + const webviewClasses = classnames({ + services__webview: true, + 'services__webview-wrapper': true, + 'is-active': service.isActive, + 'services__webview--force-repaint': this.state.forceRepaint, + }); + + let statusBar = null; + if (this.state.statusBarVisible) { + statusBar = ( + + ); + } + + return ( +
+ {service.isActive && service.isEnabled && ( + + {service.hasCrashed && ( + + )} + {service.isEnabled && service.isLoading && service.isFirstLoad && ( + + )} + {service.isError && ( + + )} + + )} + {!service.isEnabled ? ( + + {service.isActive && ( + + )} + + ) : ( + + )} + {statusBar} +
+ ); + } +} diff --git a/src/components/services/content/ServiceWebview.js b/src/components/services/content/ServiceWebview.js index bb577e4cc..7252c695f 100644 --- a/src/components/services/content/ServiceWebview.js +++ b/src/components/services/content/ServiceWebview.js @@ -1,145 +1,50 @@ -import React, { Component, Fragment } from 'react'; +import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import { autorun } from 'mobx'; import { observer } from 'mobx-react'; -import Webview from 'react-electron-web-view'; -import classnames from 'classnames'; +import ElectronWebView from 'react-electron-web-view'; import ServiceModel from '../../../models/Service'; -import StatusBarTargetUrl from '../../ui/StatusBarTargetUrl'; -import WebviewLoader from '../../ui/WebviewLoader'; -import WebviewCrashHandler from './WebviewCrashHandler'; -import WebviewErrorHandler from './ErrorHandlers/WebviewErrorHandler'; -import ServiceDisabled from './ServiceDisabled'; -export default @observer class ServiceWebview extends Component { +@observer +class ServiceWebview extends Component { static propTypes = { service: PropTypes.instanceOf(ServiceModel).isRequired, setWebviewReference: PropTypes.func.isRequired, - reload: PropTypes.func.isRequired, - edit: PropTypes.func.isRequired, - enable: PropTypes.func.isRequired, - isActive: PropTypes.bool, + detachService: PropTypes.func.isRequired, }; - static defaultProps = { - isActive: false, - }; - - state = { - forceRepaint: false, - targetUrl: '', - statusBarVisible: false, - }; - - autorunDisposer = null; - webview = null; - componentDidMount() { - this.autorunDisposer = autorun(() => { - if (this.props.service.isActive) { - this.setState({ forceRepaint: true }); - setTimeout(() => { - this.setState({ forceRepaint: false }); - }, 100); - } - }); - } - componentWillUnmount() { - this.autorunDisposer(); - } - - updateTargetUrl = (event) => { - let visible = true; - if (event.url === '' || event.url === '#') { - visible = false; - } - this.setState({ - targetUrl: event.url, - statusBarVisible: visible, - }); + const { service, detachService } = this.props; + detachService({ service }); } render() { const { service, setWebviewReference, - reload, - edit, - enable, } = this.props; - const webviewClasses = classnames({ - services__webview: true, - 'services__webview-wrapper': true, - 'is-active': service.isActive, - 'services__webview--force-repaint': this.state.forceRepaint, - }); - - let statusBar = null; - if (this.state.statusBarVisible) { - statusBar = ( - - ); - } - return ( -
- {service.isActive && service.isEnabled && ( - - {service.hasCrashed && ( - - )} - {service.isEnabled && service.isLoading && service.isFirstLoad && ( - - )} - {service.isError && ( - - )} - - )} - {!service.isEnabled ? ( - - {service.isActive && ( - - )} - - ) : ( - { this.webview = element; }} - autosize - src={service.url} - preload="./webview/recipe.js" - partition={`persist:service-${service.id}`} - onDidAttach={() => setWebviewReference({ - serviceId: service.id, - webview: this.webview.view, - })} - onUpdateTargetUrl={this.updateTargetUrl} - useragent={service.userAgent} - allowpopups - /> - )} - {statusBar} -
+ { this.webview = webview; }} + autosize + src={service.url} + preload="./webview/recipe.js" + partition={`persist:service-${service.id}`} + onDidAttach={() => { + setWebviewReference({ + serviceId: service.id, + webview: this.webview.view, + }); + }} + onUpdateTargetUrl={this.updateTargetUrl} + useragent={service.userAgent} + allowpopups + /> ); } } + +export default ServiceWebview; diff --git a/src/components/services/content/Services.js b/src/components/services/content/Services.js index 54f16ba12..8f8c38a11 100644 --- a/src/components/services/content/Services.js +++ b/src/components/services/content/Services.js @@ -4,7 +4,7 @@ import { observer, PropTypes as MobxPropTypes } from 'mobx-react'; import { Link } from 'react-router'; import { defineMessages, intlShape } from 'react-intl'; -import Webview from './ServiceWebview'; +import ServiceView from './ServiceView'; import Appear from '../../ui/effects/Appear'; const messages = defineMessages({ @@ -22,6 +22,7 @@ export default @observer class Services extends Component { static propTypes = { services: MobxPropTypes.arrayOrObservableArray, setWebviewReference: PropTypes.func.isRequired, + detachService: PropTypes.func.isRequired, handleIPCMessage: PropTypes.func.isRequired, openWindow: PropTypes.func.isRequired, reload: PropTypes.func.isRequired, @@ -42,6 +43,7 @@ export default @observer class Services extends Component { services, handleIPCMessage, setWebviewReference, + detachService, openWindow, reload, openSettings, @@ -71,11 +73,12 @@ export default @observer class Services extends Component { )} {services.map(service => ( - reload({ serviceId: service.id })} edit={() => openSettings({ path: `services/edit/${service.id}` })} diff --git a/src/containers/layout/AppLayoutContainer.js b/src/containers/layout/AppLayoutContainer.js index 749912c59..5a05ce431 100644 --- a/src/containers/layout/AppLayoutContainer.js +++ b/src/containers/layout/AppLayoutContainer.js @@ -42,6 +42,7 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e setActive, handleIPCMessage, setWebviewReference, + detachService, openWindow, reorder, reload, @@ -105,6 +106,7 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e services={services.allDisplayedUnordered} handleIPCMessage={handleIPCMessage} setWebviewReference={setWebviewReference} + detachService={detachService} openWindow={openWindow} reload={reload} openSettings={openSettings} @@ -160,6 +162,7 @@ AppLayoutContainer.wrappedComponent.propTypes = { toggleAudio: PropTypes.func.isRequired, handleIPCMessage: PropTypes.func.isRequired, setWebviewReference: PropTypes.func.isRequired, + detachService: PropTypes.func.isRequired, openWindow: PropTypes.func.isRequired, reloadUpdatedServices: PropTypes.func.isRequired, updateService: PropTypes.func.isRequired, diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js index c63bef196..69e616f0c 100644 --- a/src/stores/ServicesStore.js +++ b/src/stores/ServicesStore.js @@ -44,6 +44,7 @@ export default class ServicesStore extends Store { this.actions.service.deleteService.listen(this._deleteService.bind(this)); this.actions.service.clearCache.listen(this._clearCache.bind(this)); this.actions.service.setWebviewReference.listen(this._setWebviewReference.bind(this)); + this.actions.service.detachService.listen(this._detachService.bind(this)); this.actions.service.focusService.listen(this._focusService.bind(this)); this.actions.service.focusActiveService.listen(this._focusActiveService.bind(this)); this.actions.service.toggleService.listen(this._toggleService.bind(this)); @@ -341,6 +342,11 @@ export default class ServicesStore extends Store { service.isAttached = true; } + @action _detachService({ service }) { + service.webview = null; + service.isAttached = false; + } + @action _focusService({ serviceId }) { const service = this.one(serviceId); -- cgit v1.2.3-54-g00ecf From 84b64faf850cb0b8092b8d60cca6744f5f888dc6 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Fri, 8 Mar 2019 14:50:04 +0100 Subject: disable no-param-reassign eslint rule --- .eslintrc | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintrc b/.eslintrc index e15148e96..743946d35 100644 --- a/.eslintrc +++ b/.eslintrc @@ -2,6 +2,7 @@ "parser": "babel-eslint", "extends": "eslint-config-airbnb", "rules": { + "no-param-reassign": 0, "import/extensions": 0, "import/no-extraneous-dependencies": 0, "import/no-unresolved": [2, { -- cgit v1.2.3-54-g00ecf From 6fb07bcb716af76ec2e96345f37624d12d0d1af0 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Tue, 12 Mar 2019 21:36:10 +0100 Subject: implements basic release announcement feature --- .eslintrc | 2 +- package-lock.json | 5 ++ package.json | 1 + src/actions/index.js | 6 +- src/actions/service.js | 1 + src/components/layout/AppLayout.js | 4 + src/config.js | 1 + src/containers/layout/AppLayoutContainer.js | 2 + src/features/announcements/Component.js | 77 ++++++++++++++++++ src/features/announcements/actions.js | 8 ++ src/features/announcements/api.js | 19 +++++ src/features/announcements/index.js | 37 +++++++++ src/features/announcements/state.js | 17 ++++ src/features/announcements/store.js | 95 ++++++++++++++++++++++ src/i18n/locales/defaultMessages.json | 95 ++++++++++++++-------- src/i18n/locales/en-US.json | 2 + .../messages/src/components/layout/AppLayout.json | 24 +++--- .../src/features/announcements/Component.json | 15 ++++ src/i18n/messages/src/lib/Menu.json | 53 +++++++----- src/lib/Menu.js | 10 +++ src/stores/FeaturesStore.js | 2 + src/stores/ServicesStore.js | 6 ++ 22 files changed, 416 insertions(+), 66 deletions(-) create mode 100644 src/features/announcements/Component.js create mode 100644 src/features/announcements/actions.js create mode 100644 src/features/announcements/api.js create mode 100644 src/features/announcements/index.js create mode 100644 src/features/announcements/state.js create mode 100644 src/features/announcements/store.js create mode 100644 src/i18n/messages/src/features/announcements/Component.json diff --git a/.eslintrc b/.eslintrc index 743946d35..a4ffd505c 100644 --- a/.eslintrc +++ b/.eslintrc @@ -14,7 +14,7 @@ "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }], - "react/forbid-prop-types": 1, + "react/forbid-prop-types": 0, "react/destructuring-assignment": 1, "prefer-destructuring": 1, "no-underscore-dangle": 0, diff --git a/package-lock.json b/package-lock.json index 8499abda9..bc333ae50 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12094,6 +12094,11 @@ "object-visit": "^1.0.0" } }, + "marked": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.6.1.tgz", + "integrity": "sha512-+H0L3ibcWhAZE02SKMqmvYsErLo4EAVJxu5h3bHBBDvvjeWXtl92rGUSBYHL2++5Y+RSNgl8dYOAXcYe7lp1fA==" + }, "matchdep": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", diff --git a/package.json b/package.json index 14e0df7ca..4ddc83777 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "hex-to-rgba": "1.0.2", "jsonwebtoken": "^7.4.1", "lodash": "^4.17.4", + "marked": "0.6.1", "mdi": "^1.9.33", "mime-types": "2.1.21", "mobx": "5.7.0", diff --git a/src/actions/index.js b/src/actions/index.js index 59acabb0b..dc1d3b6b2 100644 --- a/src/actions/index.js +++ b/src/actions/index.js @@ -11,6 +11,7 @@ import payment from './payment'; import news from './news'; import settings from './settings'; import requests from './requests'; +import announcements from '../features/announcements/actions'; const actions = Object.assign({}, { service, @@ -25,4 +26,7 @@ const actions = Object.assign({}, { requests, }); -export default defineActions(actions, PropTypes.checkPropTypes); +export default Object.assign( + defineActions(actions, PropTypes.checkPropTypes), + { announcements }, +); diff --git a/src/actions/service.js b/src/actions/service.js index ceaabc31e..ce62560a9 100644 --- a/src/actions/service.js +++ b/src/actions/service.js @@ -5,6 +5,7 @@ export default { setActive: { serviceId: PropTypes.string.isRequired, }, + blurActive: {}, setActiveNext: {}, setActivePrev: {}, showAddServiceInterface: { diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js index 593149e72..2bda91f73 100644 --- a/src/components/layout/AppLayout.js +++ b/src/components/layout/AppLayout.js @@ -13,6 +13,7 @@ import ErrorBoundary from '../util/ErrorBoundary'; // import globalMessages from '../../i18n/globalMessages'; import { isWindows } from '../../environment'; +import AnnouncementScreen from '../../features/announcements/Component'; function createMarkup(HTMLString) { return { __html: HTMLString }; @@ -64,6 +65,7 @@ export default @observer class AppLayout extends Component { areRequiredRequestsLoading: PropTypes.bool.isRequired, darkMode: PropTypes.bool.isRequired, isDelayAppScreenVisible: PropTypes.bool.isRequired, + isAnnouncementVisible: PropTypes.bool.isRequired, }; static defaultProps = { @@ -93,6 +95,7 @@ export default @observer class AppLayout extends Component { areRequiredRequestsLoading, darkMode, isDelayAppScreenVisible, + isAnnouncementVisible, } = this.props; const { intl } = this.context; @@ -166,6 +169,7 @@ export default @observer class AppLayout extends Component { {isDelayAppScreenVisible && ()} + {isAnnouncementVisible && ()} {services}
diff --git a/src/config.js b/src/config.js index 479572edb..47d22ca7d 100644 --- a/src/config.js +++ b/src/config.js @@ -41,6 +41,7 @@ export const DEFAULT_FEATURES_CONFIG = { }, isServiceProxyEnabled: false, isServiceProxyPremiumFeature: true, + isAnnouncementsEnabled: true, }; export const DEFAULT_WINDOW_OPTIONS = { diff --git a/src/containers/layout/AppLayoutContainer.js b/src/containers/layout/AppLayoutContainer.js index 5a05ce431..f26e51517 100644 --- a/src/containers/layout/AppLayoutContainer.js +++ b/src/containers/layout/AppLayoutContainer.js @@ -20,6 +20,7 @@ import Services from '../../components/services/content/Services'; import AppLoader from '../../components/ui/AppLoader'; import { state as delayAppState } from '../../features/delayApp'; +import { announcementsState } from '../../features/announcements/state'; export default @inject('stores', 'actions') @observer class AppLayoutContainer extends Component { static defaultProps = { @@ -134,6 +135,7 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e areRequiredRequestsLoading={requests.areRequiredRequestsLoading} darkMode={settings.all.app.darkMode} isDelayAppScreenVisible={delayAppState.isDelayAppScreenVisible} + isAnnouncementVisible={announcementsState.isAnnouncementVisible} > {React.Children.count(children) > 0 ? children : null} diff --git a/src/features/announcements/Component.js b/src/features/announcements/Component.js new file mode 100644 index 000000000..5d95f5d84 --- /dev/null +++ b/src/features/announcements/Component.js @@ -0,0 +1,77 @@ +import React, { Component } from 'react'; +import marked from 'marked'; +import PropTypes from 'prop-types'; +import { inject, observer } from 'mobx-react'; +import { defineMessages, intlShape } from 'react-intl'; +import injectSheet from 'react-jss'; +import { themeSidebarWidth } from '@meetfranz/theme/lib/themes/legacy'; +import state from './state'; + +const messages = defineMessages({ + headline: { + id: 'feature.announcements.headline', + defaultMessage: '!!!What\'s new in Franz {version}?', + }, +}); + +const styles = theme => ({ + container: { + background: theme.colorBackground, + position: 'absolute', + top: 0, + zIndex: 140, + width: `calc(100% - ${themeSidebarWidth})`, + display: 'flex', + 'flex-direction': 'column', + 'align-items': 'center', + 'justify-content': 'center', + }, + headline: { + color: theme.colorHeadline, + margin: [25, 0, 40], + 'max-width': 500, + 'text-align': 'center', + 'line-height': '1.3em', + }, + body: { + '& h3': { + fontSize: '24px', + margin: '1.5em 0 1em 0', + }, + '& li': { + marginBottom: '1em', + }, + }, +}); + + +@inject('actions') @injectSheet(styles) @observer +class AnnouncementScreen extends Component { + static propTypes = { + classes: PropTypes.object.isRequired, + }; + + static contextTypes = { + intl: intlShape, + }; + + render() { + const { classes } = this.props; + const { intl } = this.context; + return ( +
+

+ {intl.formatMessage(messages.headline, { version: state.currentVersion })} +

+
+
+ ); + } +} + +export default AnnouncementScreen; diff --git a/src/features/announcements/actions.js b/src/features/announcements/actions.js new file mode 100644 index 000000000..68b262ded --- /dev/null +++ b/src/features/announcements/actions.js @@ -0,0 +1,8 @@ +import PropTypes from 'prop-types'; +import { createActionsFromDefinitions } from '../../actions/lib/actions'; + +export const announcementActions = createActionsFromDefinitions({ + show: {}, +}, PropTypes.checkPropTypes); + +export default announcementActions; diff --git a/src/features/announcements/api.js b/src/features/announcements/api.js new file mode 100644 index 000000000..ec16066a6 --- /dev/null +++ b/src/features/announcements/api.js @@ -0,0 +1,19 @@ +import { remote } from 'electron'; + +const debug = require('debug')('Franz:feature:announcements:api'); + +export default { + async getCurrentVersion() { + debug('getting current version of electron app'); + return Promise.resolve(remote.app.getVersion()); + }, + + async getAnnouncementForVersion(version) { + debug('fetching release announcement from Github'); + const url = `https://api.github.com/repos/meetfranz/franz/releases/tags/v${version}`; + const request = await window.fetch(url, { method: 'GET' }); + if (!request.ok) throw request; + const data = await request.json(); + return data.body; + }, +}; diff --git a/src/features/announcements/index.js b/src/features/announcements/index.js new file mode 100644 index 000000000..5ea74e0af --- /dev/null +++ b/src/features/announcements/index.js @@ -0,0 +1,37 @@ +import { reaction, runInAction } from 'mobx'; +import { AnnouncementsStore } from './store'; +import api from './api'; +import state, { resetState } from './state'; + +const debug = require('debug')('Franz:feature:announcements'); + +let store = null; + +export default function initAnnouncements(stores, actions) { + // const { features } = stores; + + // Toggle workspace feature + reaction( + () => ( + true + // features.features.isAnnouncementsEnabled + ), + (isEnabled) => { + if (isEnabled) { + debug('Initializing `announcements` feature'); + store = new AnnouncementsStore(stores, api, actions, state); + store.initialize(); + runInAction(() => { state.isFeatureActive = true; }); + } else if (store) { + debug('Disabling `announcements` feature'); + runInAction(() => { state.isFeatureActive = false; }); + store.teardown(); + store = null; + resetState(); // Reset state to default + } + }, + { + fireImmediately: true, + }, + ); +} diff --git a/src/features/announcements/state.js b/src/features/announcements/state.js new file mode 100644 index 000000000..81b632253 --- /dev/null +++ b/src/features/announcements/state.js @@ -0,0 +1,17 @@ +import { observable } from 'mobx'; + +const defaultState = { + announcement: null, + currentVersion: null, + lastUsedVersion: null, + isAnnouncementVisible: false, + isFeatureActive: false, +}; + +export const announcementsState = observable(defaultState); + +export function resetState() { + Object.assign(announcementsState, defaultState); +} + +export default announcementsState; diff --git a/src/features/announcements/store.js b/src/features/announcements/store.js new file mode 100644 index 000000000..004a44062 --- /dev/null +++ b/src/features/announcements/store.js @@ -0,0 +1,95 @@ +import { action, observable, reaction } from 'mobx'; +import semver from 'semver'; + +import Request from '../../stores/lib/Request'; +import Store from '../../stores/lib/Store'; + +const debug = require('debug')('Franz:feature:announcements:store'); + +export class AnnouncementsStore extends Store { + @observable getCurrentVersion = new Request(this.api, 'getCurrentVersion'); + + @observable getAnnouncement = new Request(this.api, 'getAnnouncementForVersion'); + + constructor(stores, api, actions, state) { + super(stores, api, actions); + this.state = state; + } + + async setup() { + await this.fetchLastUsedVersion(); + await this.fetchCurrentVersion(); + await this.fetchReleaseAnnouncement(); + this.showAnnouncementIfNotSeenYet(); + + this.actions.announcements.show.listen(this._showAnnouncement.bind(this)); + } + + // ====== PUBLIC ====== + + async fetchLastUsedVersion() { + debug('getting last used version from local storage'); + const lastUsedVersion = window.localStorage.getItem('lastUsedVersion'); + this._setLastUsedVersion(lastUsedVersion == null ? '0.0.0' : lastUsedVersion); + } + + async fetchCurrentVersion() { + debug('getting current version from api'); + const version = await this.getCurrentVersion.execute(); + this._setCurrentVersion(version); + } + + async fetchReleaseAnnouncement() { + debug('getting release announcement from api'); + try { + const announcement = await this.getAnnouncement.execute(this.state.currentVersion); + this._setAnnouncement(announcement); + } catch (error) { + this._setAnnouncement(null); + } + } + + showAnnouncementIfNotSeenYet() { + const { announcement, currentVersion, lastUsedVersion } = this.state; + if (announcement && semver.gt(currentVersion, lastUsedVersion)) { + debug(`${currentVersion} < ${lastUsedVersion}: announcement is shown`); + this._showAnnouncement(); + } else { + debug(`${currentVersion} >= ${lastUsedVersion}: announcement is hidden`); + this._hideAnnouncement(); + } + } + + // ====== PRIVATE ====== + + @action _setCurrentVersion(version) { + debug(`setting current version to ${version}`); + this.state.currentVersion = version; + } + + @action _setLastUsedVersion(version) { + debug(`setting last used version to ${version}`); + this.state.lastUsedVersion = version; + } + + @action _setAnnouncement(announcement) { + debug(`setting announcement to ${announcement}`); + this.state.announcement = announcement; + } + + @action _showAnnouncement() { + this.state.isAnnouncementVisible = true; + this.actions.service.blurActive(); + const dispose = reaction( + () => this.stores.services.active, + () => { + this._hideAnnouncement(); + dispose(); + }, + ); + } + + @action _hideAnnouncement() { + this.state.isAnnouncementVisible = false; + } +} diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 0641c510c..fcd24c7ef 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -625,78 +625,78 @@ "defaultMessage": "!!!Your services have been updated.", "end": { "column": 3, - "line": 25 + "line": 26 }, "file": "src/components/layout/AppLayout.js", "id": "infobar.servicesUpdated", "start": { "column": 19, - "line": 22 + "line": 23 } }, { "defaultMessage": "!!!A new update for Franz is available.", "end": { "column": 3, - "line": 29 + "line": 30 }, "file": "src/components/layout/AppLayout.js", "id": "infobar.updateAvailable", "start": { "column": 19, - "line": 26 + "line": 27 } }, { "defaultMessage": "!!!Reload services", "end": { "column": 3, - "line": 33 + "line": 34 }, "file": "src/components/layout/AppLayout.js", "id": "infobar.buttonReloadServices", "start": { "column": 24, - "line": 30 + "line": 31 } }, { "defaultMessage": "!!!Changelog", "end": { "column": 3, - "line": 37 + "line": 38 }, "file": "src/components/layout/AppLayout.js", "id": "infobar.buttonChangelog", "start": { "column": 13, - "line": 34 + "line": 35 } }, { "defaultMessage": "!!!Restart & install update", "end": { "column": 3, - "line": 41 + "line": 42 }, "file": "src/components/layout/AppLayout.js", "id": "infobar.buttonInstallUpdate", "start": { "column": 23, - "line": 38 + "line": 39 } }, { "defaultMessage": "!!!Could not load services and user information", "end": { "column": 3, - "line": 45 + "line": 46 }, "file": "src/components/layout/AppLayout.js", "id": "infobar.requiredRequestsFailed", "start": { "column": 26, - "line": 42 + "line": 43 } } ], @@ -3022,6 +3022,24 @@ ], "path": "src/containers/settings/EditUserScreen.json" }, + { + "descriptors": [ + { + "defaultMessage": "!!!What's new in Franz {version}?", + "end": { + "column": 3, + "line": 14 + }, + "file": "src/features/announcements/Component.js", + "id": "feature.announcements.headline", + "start": { + "column": 12, + "line": 11 + } + } + ], + "path": "src/features/announcements/Component.json" + }, { "descriptors": [ { @@ -3799,133 +3817,146 @@ } }, { - "defaultMessage": "!!!Settings", + "defaultMessage": "!!!What's new in Franz?", "end": { "column": 3, "line": 161 }, "file": "src/lib/Menu.js", + "id": "menu.app.announcement", + "start": { + "column": 16, + "line": 158 + } + }, + { + "defaultMessage": "!!!Settings", + "end": { + "column": 3, + "line": 165 + }, + "file": "src/lib/Menu.js", "id": "menu.app.settings", "start": { "column": 12, - "line": 158 + "line": 162 } }, { "defaultMessage": "!!!Hide", "end": { "column": 3, - "line": 165 + "line": 169 }, "file": "src/lib/Menu.js", "id": "menu.app.hide", "start": { "column": 8, - "line": 162 + "line": 166 } }, { "defaultMessage": "!!!Hide Others", "end": { "column": 3, - "line": 169 + "line": 173 }, "file": "src/lib/Menu.js", "id": "menu.app.hideOthers", "start": { "column": 14, - "line": 166 + "line": 170 } }, { "defaultMessage": "!!!Unhide", "end": { "column": 3, - "line": 173 + "line": 177 }, "file": "src/lib/Menu.js", "id": "menu.app.unhide", "start": { "column": 10, - "line": 170 + "line": 174 } }, { "defaultMessage": "!!!Quit", "end": { "column": 3, - "line": 177 + "line": 181 }, "file": "src/lib/Menu.js", "id": "menu.app.quit", "start": { "column": 8, - "line": 174 + "line": 178 } }, { "defaultMessage": "!!!Add New Service...", "end": { "column": 3, - "line": 181 + "line": 185 }, "file": "src/lib/Menu.js", "id": "menu.services.addNewService", "start": { "column": 17, - "line": 178 + "line": 182 } }, { "defaultMessage": "!!!Activate next service...", "end": { "column": 3, - "line": 185 + "line": 189 }, "file": "src/lib/Menu.js", "id": "menu.services.setNextServiceActive", "start": { "column": 23, - "line": 182 + "line": 186 } }, { "defaultMessage": "!!!Activate previous service...", "end": { "column": 3, - "line": 189 + "line": 193 }, "file": "src/lib/Menu.js", "id": "menu.services.activatePreviousService", "start": { "column": 27, - "line": 186 + "line": 190 } }, { "defaultMessage": "!!!Disable notifications & audio", "end": { "column": 3, - "line": 193 + "line": 197 }, "file": "src/lib/Menu.js", "id": "sidebar.muteApp", "start": { "column": 11, - "line": 190 + "line": 194 } }, { "defaultMessage": "!!!Enable notifications & audio", "end": { "column": 3, - "line": 197 + "line": 201 }, "file": "src/lib/Menu.js", "id": "sidebar.unmuteApp", "start": { "column": 13, - "line": 194 + "line": 198 } } ], diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 7543d38bd..573231c45 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -1,6 +1,7 @@ { "app.errorHandler.action": "Reload", "app.errorHandler.headline": "Something went wrong", + "feature.announcements.headline": "What's new in Franz {version}?", "feature.delayApp.action": "Get a Franz Supporter License", "feature.delayApp.headline": "Please purchase a Franz Supporter License to skip waiting", "feature.delayApp.text": "Franz will continue in {seconds} seconds.", @@ -43,6 +44,7 @@ "login.submit.label": "Sign in", "login.tokenExpired": "Your session expired, please login again.", "menu.app.about": "About Franz", + "menu.app.announcement": "What's new in Franz?", "menu.app.hide": "Hide", "menu.app.hideOthers": "Hide Others", "menu.app.quit": "Quit", diff --git a/src/i18n/messages/src/components/layout/AppLayout.json b/src/i18n/messages/src/components/layout/AppLayout.json index 07603d062..384d4b441 100644 --- a/src/i18n/messages/src/components/layout/AppLayout.json +++ b/src/i18n/messages/src/components/layout/AppLayout.json @@ -4,11 +4,11 @@ "defaultMessage": "!!!Your services have been updated.", "file": "src/components/layout/AppLayout.js", "start": { - "line": 22, + "line": 23, "column": 19 }, "end": { - "line": 25, + "line": 26, "column": 3 } }, @@ -17,11 +17,11 @@ "defaultMessage": "!!!A new update for Franz is available.", "file": "src/components/layout/AppLayout.js", "start": { - "line": 26, + "line": 27, "column": 19 }, "end": { - "line": 29, + "line": 30, "column": 3 } }, @@ -30,11 +30,11 @@ "defaultMessage": "!!!Reload services", "file": "src/components/layout/AppLayout.js", "start": { - "line": 30, + "line": 31, "column": 24 }, "end": { - "line": 33, + "line": 34, "column": 3 } }, @@ -43,11 +43,11 @@ "defaultMessage": "!!!Changelog", "file": "src/components/layout/AppLayout.js", "start": { - "line": 34, + "line": 35, "column": 13 }, "end": { - "line": 37, + "line": 38, "column": 3 } }, @@ -56,11 +56,11 @@ "defaultMessage": "!!!Restart & install update", "file": "src/components/layout/AppLayout.js", "start": { - "line": 38, + "line": 39, "column": 23 }, "end": { - "line": 41, + "line": 42, "column": 3 } }, @@ -69,11 +69,11 @@ "defaultMessage": "!!!Could not load services and user information", "file": "src/components/layout/AppLayout.js", "start": { - "line": 42, + "line": 43, "column": 26 }, "end": { - "line": 45, + "line": 46, "column": 3 } } diff --git a/src/i18n/messages/src/features/announcements/Component.json b/src/i18n/messages/src/features/announcements/Component.json new file mode 100644 index 000000000..18e1b84c5 --- /dev/null +++ b/src/i18n/messages/src/features/announcements/Component.json @@ -0,0 +1,15 @@ +[ + { + "id": "feature.announcements.headline", + "defaultMessage": "!!!What's new in Franz {version}?", + "file": "src/features/announcements/Component.js", + "start": { + "line": 11, + "column": 12 + }, + "end": { + "line": 14, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/lib/Menu.json b/src/i18n/messages/src/lib/Menu.json index 9314f5cce..0db994871 100644 --- a/src/i18n/messages/src/lib/Menu.json +++ b/src/i18n/messages/src/lib/Menu.json @@ -480,16 +480,29 @@ "column": 3 } }, + { + "id": "menu.app.announcement", + "defaultMessage": "!!!What's new in Franz?", + "file": "src/lib/Menu.js", + "start": { + "line": 158, + "column": 16 + }, + "end": { + "line": 161, + "column": 3 + } + }, { "id": "menu.app.settings", "defaultMessage": "!!!Settings", "file": "src/lib/Menu.js", "start": { - "line": 158, + "line": 162, "column": 12 }, "end": { - "line": 161, + "line": 165, "column": 3 } }, @@ -498,11 +511,11 @@ "defaultMessage": "!!!Hide", "file": "src/lib/Menu.js", "start": { - "line": 162, + "line": 166, "column": 8 }, "end": { - "line": 165, + "line": 169, "column": 3 } }, @@ -511,11 +524,11 @@ "defaultMessage": "!!!Hide Others", "file": "src/lib/Menu.js", "start": { - "line": 166, + "line": 170, "column": 14 }, "end": { - "line": 169, + "line": 173, "column": 3 } }, @@ -524,11 +537,11 @@ "defaultMessage": "!!!Unhide", "file": "src/lib/Menu.js", "start": { - "line": 170, + "line": 174, "column": 10 }, "end": { - "line": 173, + "line": 177, "column": 3 } }, @@ -537,11 +550,11 @@ "defaultMessage": "!!!Quit", "file": "src/lib/Menu.js", "start": { - "line": 174, + "line": 178, "column": 8 }, "end": { - "line": 177, + "line": 181, "column": 3 } }, @@ -550,11 +563,11 @@ "defaultMessage": "!!!Add New Service...", "file": "src/lib/Menu.js", "start": { - "line": 178, + "line": 182, "column": 17 }, "end": { - "line": 181, + "line": 185, "column": 3 } }, @@ -563,11 +576,11 @@ "defaultMessage": "!!!Activate next service...", "file": "src/lib/Menu.js", "start": { - "line": 182, + "line": 186, "column": 23 }, "end": { - "line": 185, + "line": 189, "column": 3 } }, @@ -576,11 +589,11 @@ "defaultMessage": "!!!Activate previous service...", "file": "src/lib/Menu.js", "start": { - "line": 186, + "line": 190, "column": 27 }, "end": { - "line": 189, + "line": 193, "column": 3 } }, @@ -589,11 +602,11 @@ "defaultMessage": "!!!Disable notifications & audio", "file": "src/lib/Menu.js", "start": { - "line": 190, + "line": 194, "column": 11 }, "end": { - "line": 193, + "line": 197, "column": 3 } }, @@ -602,11 +615,11 @@ "defaultMessage": "!!!Enable notifications & audio", "file": "src/lib/Menu.js", "start": { - "line": 194, + "line": 198, "column": 13 }, "end": { - "line": 197, + "line": 201, "column": 3 } } diff --git a/src/lib/Menu.js b/src/lib/Menu.js index 7a60c448f..70f3b2877 100644 --- a/src/lib/Menu.js +++ b/src/lib/Menu.js @@ -155,6 +155,10 @@ const menuItems = defineMessages({ id: 'menu.app.about', defaultMessage: '!!!About Franz', }, + announcement: { + id: 'menu.app.announcement', + defaultMessage: '!!!What\'s new in Franz?', + }, settings: { id: 'menu.app.settings', defaultMessage: '!!!Settings', @@ -589,6 +593,12 @@ export default class FranzMenu { label: intl.formatMessage(menuItems.about), role: 'about', }, + { + label: intl.formatMessage(menuItems.announcement), + click: () => { + this.actions.announcements.show(); + }, + }, { type: 'separator', }, diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js index d2842083c..1c9044b07 100644 --- a/src/stores/FeaturesStore.js +++ b/src/stores/FeaturesStore.js @@ -8,6 +8,7 @@ import spellchecker from '../features/spellchecker'; import serviceProxy from '../features/serviceProxy'; import basicAuth from '../features/basicAuth'; import shareFranz from '../features/shareFranz'; +import announcements from '../features/announcements'; import { DEFAULT_FEATURES_CONFIG } from '../config'; @@ -58,5 +59,6 @@ export default class FeaturesStore extends Store { serviceProxy(this.stores, this.actions); basicAuth(this.stores, this.actions); shareFranz(this.stores, this.actions); + announcements(this.stores, this.actions); } } diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js index 69e616f0c..88b0331bf 100644 --- a/src/stores/ServicesStore.js +++ b/src/stores/ServicesStore.js @@ -35,6 +35,7 @@ export default class ServicesStore extends Store { // Register action handlers this.actions.service.setActive.listen(this._setActive.bind(this)); + this.actions.service.blurActive.listen(this._blurActive.bind(this)); this.actions.service.setActiveNext.listen(this._setActiveNext.bind(this)); this.actions.service.setActivePrev.listen(this._setActivePrev.bind(this)); this.actions.service.showAddServiceInterface.listen(this._showAddServiceInterface.bind(this)); @@ -298,6 +299,11 @@ export default class ServicesStore extends Store { this._focusActiveService(); } + @action _blurActive() { + if (!this.active) return; + this.active.isActive = false; + } + @action _setActiveNext() { const nextIndex = this._wrapIndex(this.allDisplayed.findIndex(service => service.isActive), 1, this.allDisplayed.length); -- cgit v1.2.3-54-g00ecf From e4f1862644d5921e2ee77078c10e16efa3e58c7b Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Tue, 19 Mar 2019 19:38:56 +0100 Subject: add workspace drawer --- packages/theme/src/themes/dark/index.ts | 9 +++ packages/theme/src/themes/default/index.ts | 10 +++ src/components/layout/AppLayout.js | 24 +++++- src/components/layout/Sidebar.js | 42 +++++++++- src/components/services/content/ServiceView.js | 1 + src/containers/layout/AppLayoutContainer.js | 14 ++++ src/features/workspaces/actions.js | 6 +- .../workspaces/components/WorkspaceDrawer.js | 94 ++++++++++++++++++++++ .../workspaces/components/WorkspaceDrawerItem.js | 88 ++++++++++++++++++++ src/features/workspaces/state.js | 1 + src/features/workspaces/store.js | 12 ++- src/i18n/locales/defaultMessages.json | 57 +++++++++++++ src/i18n/locales/en-US.json | 8 +- .../messages/src/components/layout/AppLayout.json | 24 +++--- .../messages/src/components/layout/Sidebar.json | 26 ++++++ .../workspaces/components/WorkspaceDrawer.json | 28 +++++++ src/lib/Menu.js | 4 +- src/styles/layout.scss | 12 ++- 18 files changed, 435 insertions(+), 25 deletions(-) create mode 100644 src/features/workspaces/components/WorkspaceDrawer.js create mode 100644 src/features/workspaces/components/WorkspaceDrawerItem.js create mode 100644 src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json diff --git a/packages/theme/src/themes/dark/index.ts b/packages/theme/src/themes/dark/index.ts index 3a56719b2..eaa552961 100644 --- a/packages/theme/src/themes/dark/index.ts +++ b/packages/theme/src/themes/dark/index.ts @@ -63,3 +63,12 @@ export const selectSearchColor = inputBackground; // Modal export const colorModalOverlayBackground = color(legacyStyles.darkThemeBlack).alpha(0.8).rgb().string(); + +// Workspace Drawer +export const workspaceDrawerBackground = color(colorBackground).lighten(0.3).hex(); +export const workspaceDrawerItemBorder = color(workspaceDrawerBackground).lighten(0.2).hex(); +export const workspaceDrawerItemActiveBackground = defaultStyles.brandPrimary; +export const workspaceDrawerNameColor = colorText; +export const workspaceDrawerNameActiveColor = 'white'; +export const workspaceDrawerServicesColor = color(colorText).darken(0.5).hex(); +export const workspaceDrawerServicesActiveColor = color(defaultStyles.brandPrimary).lighten(0.5).hex(); diff --git a/packages/theme/src/themes/default/index.ts b/packages/theme/src/themes/default/index.ts index 8a71e61cf..fc03b67de 100644 --- a/packages/theme/src/themes/default/index.ts +++ b/packages/theme/src/themes/default/index.ts @@ -140,3 +140,13 @@ export const badgeBorderRadius = 50; // Modal export const colorModalOverlayBackground = color('#000').alpha(0.5).rgb().string(); + +// Workspace Drawer +export const workspaceDrawerWidth = '220px'; +export const workspaceDrawerBackground = color(colorBackground).lighten(0.1).hex(); +export const workspaceDrawerItemActiveBackground = legacyStyles.themeGrayLightest; +export const workspaceDrawerItemBorder = color(workspaceDrawerBackground).darken(0.05).hex(); +export const workspaceDrawerNameColor = colorText; +export const workspaceDrawerNameActiveColor = colorText; +export const workspaceDrawerServicesColor = color(colorText).lighten(1.5).hex(); +export const workspaceDrawerServicesActiveColor = workspaceDrawerServicesColor; diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js index 593149e72..e06192f87 100644 --- a/src/components/layout/AppLayout.js +++ b/src/components/layout/AppLayout.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { observer, PropTypes as MobxPropTypes } from 'mobx-react'; import { defineMessages, intlShape } from 'react-intl'; import { TitleBar } from 'electron-react-titlebar'; +import injectSheet from 'react-jss'; import InfoBar from '../ui/InfoBar'; import { Component as DelayApp } from '../../features/delayApp'; @@ -13,6 +14,7 @@ import ErrorBoundary from '../util/ErrorBoundary'; // import globalMessages from '../../i18n/globalMessages'; import { isWindows } from '../../environment'; +import { workspacesState } from '../../features/workspaces/state'; function createMarkup(HTMLString) { return { __html: HTMLString }; @@ -45,10 +47,23 @@ const messages = defineMessages({ }, }); -export default @observer class AppLayout extends Component { +const styles = theme => ({ + appContent: { + width: `calc(100% + ${theme.workspaceDrawerWidth})`, + transition: 'transform 0.5s ease', + transform() { + return workspacesState.isWorkspaceDrawerOpen ? 'translateX(0)' : 'translateX(-220px)'; + }, + }, +}); + +@injectSheet(styles) @observer +class AppLayout extends Component { static propTypes = { + classes: PropTypes.object.isRequired, isFullScreen: PropTypes.bool.isRequired, sidebar: PropTypes.element.isRequired, + workspacesDrawer: PropTypes.element.isRequired, services: PropTypes.element.isRequired, children: PropTypes.element, news: MobxPropTypes.arrayOrObservableArray.isRequired, @@ -76,7 +91,9 @@ export default @observer class AppLayout extends Component { render() { const { + classes, isFullScreen, + workspacesDrawer, sidebar, services, children, @@ -102,7 +119,8 @@ export default @observer class AppLayout extends Component {
{isWindows && !isFullScreen && } -
+
+ {workspacesDrawer} {sidebar}
{news.length > 0 && news.map(item => ( @@ -176,3 +194,5 @@ export default @observer class AppLayout extends Component { ); } } + +export default AppLayout; diff --git a/src/components/layout/Sidebar.js b/src/components/layout/Sidebar.js index fcc5b0001..de379875e 100644 --- a/src/components/layout/Sidebar.js +++ b/src/components/layout/Sidebar.js @@ -24,6 +24,14 @@ const messages = defineMessages({ id: 'sidebar.unmuteApp', defaultMessage: '!!!Enable notifications & audio', }, + openWorkspaceDrawer: { + id: 'sidebar.openWorkspaceDrawer', + defaultMessage: '!!!Open workspace drawer', + }, + closeWorkspaceDrawer: { + id: 'sidebar.closeWorkspaceDrawer', + defaultMessage: '!!!Close workspace drawer', + }, }); export default @observer class Sidebar extends Component { @@ -31,6 +39,8 @@ export default @observer class Sidebar extends Component { openSettings: PropTypes.func.isRequired, toggleMuteApp: PropTypes.func.isRequired, isAppMuted: PropTypes.bool.isRequired, + isWorkspaceDrawerOpen: PropTypes.bool.isRequired, + toggleWorkspaceDrawer: PropTypes.func.isRequired, }; static contextTypes = { @@ -53,9 +63,23 @@ export default @observer class Sidebar extends Component { this.setState({ tooltipEnabled: false }); } + updateToolTip() { + this.disableToolTip(); + setTimeout(this.enableToolTip.bind(this)); + } + render() { - const { openSettings, toggleMuteApp, isAppMuted } = this.props; + const { + openSettings, + toggleMuteApp, + isAppMuted, + isWorkspaceDrawerOpen, + toggleWorkspaceDrawer, + } = this.props; const { intl } = this.context; + const workspaceToggleMessage = ( + isWorkspaceDrawerOpen ? messages.closeWorkspaceDrawer : messages.openWorkspaceDrawer + ); return (
@@ -66,7 +90,21 @@ export default @observer class Sidebar extends Component { /> +
diff --git a/src/features/workspaces/containers/WorkspacesScreen.js b/src/features/workspaces/containers/WorkspacesScreen.js index 5fdea217e..89bd2a2ef 100644 --- a/src/features/workspaces/containers/WorkspacesScreen.js +++ b/src/features/workspaces/containers/WorkspacesScreen.js @@ -22,7 +22,7 @@ class WorkspacesScreen extends Component { actions.workspaces.create(data)} onWorkspaceClick={w => actions.workspaces.edit({ workspace: w })} /> diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index 86a8a2c76..3cec5f360 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -30,7 +30,7 @@ export default class WorkspacesStore { @computed get workspaces() { if (!this.isFeatureActive) return []; - return getUserWorkspacesRequest.execute().result || []; + return getUserWorkspacesRequest.result || []; } constructor() { @@ -57,6 +57,7 @@ export default class WorkspacesStore { this.actions = actions; this._reactions.forEach(r => r.start()); this.isFeatureActive = true; + getUserWorkspacesRequest.execute(); } stop() { diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 03e96fc40..afbacf28a 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -3388,26 +3388,52 @@ "defaultMessage": "!!!Your workspaces", "end": { "column": 3, - "line": 15 + "line": 17 }, "file": "src/features/workspaces/components/WorkspacesDashboard.js", "id": "settings.workspaces.headline", "start": { "column": 12, - "line": 12 + "line": 14 } }, { "defaultMessage": "!!!You haven't added any workspaces yet.", "end": { "column": 3, - "line": 19 + "line": 21 }, "file": "src/features/workspaces/components/WorkspacesDashboard.js", "id": "settings.workspaces.noWorkspacesAdded", "start": { "column": 19, - "line": 16 + "line": 18 + } + }, + { + "defaultMessage": "!!!Could not load your workspaces", + "end": { + "column": 3, + "line": 25 + }, + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "id": "settings.workspaces.workspacesRequestFailed", + "start": { + "column": 27, + "line": 22 + } + }, + { + "defaultMessage": "!!!Try again", + "end": { + "column": 3, + "line": 29 + }, + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "id": "settings.workspaces.tryReloadWorkspaces", + "start": { + "column": 23, + "line": 26 } } ], diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 4206d4358..2b4e79621 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -251,6 +251,8 @@ "settings.workspace.form.yourWorkspaces": "Your workspaces", "settings.workspaces.headline": "Your workspaces", "settings.workspaces.noWorkspacesAdded": "You haven't added any workspaces yet.", + "settings.workspaces.tryReloadWorkspaces": "Try again", + "settings.workspaces.workspacesRequestFailed": "Could not load your workspaces", "sidebar.addNewService": "Add new service", "sidebar.closeWorkspaceDrawer": "Close workspace drawer", "sidebar.muteApp": "Disable notifications & audio", @@ -305,4 +307,4 @@ "workspaceDrawer.headline": "Workspaces", "workspaceDrawer.item.noServicesAddedYet": "No services added yet", "workspaces.switchingIndicator.switchingTo": "Switching to" -} \ No newline at end of file +} diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json index 0e053a124..f875ace8a 100644 --- a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json +++ b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json @@ -4,11 +4,11 @@ "defaultMessage": "!!!Your workspaces", "file": "src/features/workspaces/components/WorkspacesDashboard.js", "start": { - "line": 12, + "line": 14, "column": 12 }, "end": { - "line": 15, + "line": 17, "column": 3 } }, @@ -17,11 +17,37 @@ "defaultMessage": "!!!You haven't added any workspaces yet.", "file": "src/features/workspaces/components/WorkspacesDashboard.js", "start": { - "line": 16, + "line": 18, "column": 19 }, "end": { - "line": 19, + "line": 21, + "column": 3 + } + }, + { + "id": "settings.workspaces.workspacesRequestFailed", + "defaultMessage": "!!!Could not load your workspaces", + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "start": { + "line": 22, + "column": 27 + }, + "end": { + "line": 25, + "column": 3 + } + }, + { + "id": "settings.workspaces.tryReloadWorkspaces", + "defaultMessage": "!!!Try again", + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "start": { + "line": 26, + "column": 23 + }, + "end": { + "line": 29, "column": 3 } } diff --git a/src/stores/lib/Request.js b/src/stores/lib/Request.js index 04f528156..1fb67cc15 100644 --- a/src/stores/lib/Request.js +++ b/src/stores/lib/Request.js @@ -85,6 +85,8 @@ export default class Request { return this.execute(...this._currentApiCall.args); } + retry = () => this.reload(); + isExecutingWithArgs(...args) { return this.isExecuting && this._currentApiCall && isEqual(this._currentApiCall.args, args); } -- cgit v1.2.3-54-g00ecf From a2e4316879908c5bc2c38cef81eef9152476b6f6 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Tue, 26 Mar 2019 15:26:20 +0100 Subject: show infobox when updating workspaces --- packages/ui/src/infobox/index.tsx | 7 ++ src/components/ui/Infobox.js | 17 ++++- .../workspaces/components/WorkspacesDashboard.js | 89 +++++++++++++--------- .../workspaces/containers/WorkspacesScreen.js | 3 +- src/features/workspaces/store.js | 15 ++-- src/i18n/locales/defaultMessages.json | 29 +++++-- src/i18n/locales/en-US.json | 3 +- .../workspaces/components/WorkspacesDashboard.json | 29 +++++-- src/stores/lib/Request.js | 4 +- 9 files changed, 129 insertions(+), 67 deletions(-) diff --git a/packages/ui/src/infobox/index.tsx b/packages/ui/src/infobox/index.tsx index 1a442a733..9066a623e 100644 --- a/packages/ui/src/infobox/index.tsx +++ b/packages/ui/src/infobox/index.tsx @@ -11,6 +11,7 @@ interface IProps extends IWithStyle { type?: string; dismissable?: boolean; onDismiss?: () => void; + onUnmount?: () => void; ctaOnClick?: () => void; ctaLabel?: string; ctaLoading?: boolean; @@ -46,6 +47,7 @@ const styles = (theme: Theme) => ({ wrapper: { position: 'relative', overflow: 'hidden', + height: 'auto', }, infobox: { alignItems: 'center', @@ -129,6 +131,11 @@ class InfoboxComponent extends Component { }, 3000); } + componentWillUnmount(): void { + const { onUnmount } = this.props; + if (onUnmount) onUnmount(); + } + render() { const { classes, diff --git a/src/components/ui/Infobox.js b/src/components/ui/Infobox.js index a33c6474a..0917ee9f0 100644 --- a/src/components/ui/Infobox.js +++ b/src/components/ui/Infobox.js @@ -13,6 +13,8 @@ export default @observer class Infobox extends Component { ctaLabel: PropTypes.string, ctaLoading: PropTypes.bool, dismissable: PropTypes.bool, + onDismiss: PropTypes.func, + onSeen: PropTypes.func, }; static defaultProps = { @@ -22,12 +24,19 @@ export default @observer class Infobox extends Component { ctaOnClick: () => null, ctaLabel: '', ctaLoading: false, + onDismiss: () => null, + onSeen: () => null, }; state = { dismissed: false, }; + componentDidMount() { + const { onSeen } = this.props; + if (onSeen) onSeen(); + } + render() { const { children, @@ -37,6 +46,7 @@ export default @observer class Infobox extends Component { ctaLoading, ctaOnClick, dismissable, + onDismiss, } = this.props; if (this.state.dismissed) { @@ -76,9 +86,10 @@ export default @observer class Infobox extends Component { {dismissable && (
-
-
- -
- {getUserWorkspacesRequest.isExecuting ? ( - - ) : ( - - {getUserWorkspacesRequest.error ? ( - - {intl.formatMessage(messages.workspacesRequestFailed)} - - ) : ( - - - {workspaces.map(workspace => ( - onWorkspaceClick(w)} - /> - ))} - -
- )} -
- )} + {updateWorkspaceRequest.wasExecuted && updateWorkspaceRequest.result && ( + + + {intl.formatMessage(messages.updatedInfo)} + + + )} +
+
+ {getUserWorkspacesRequest.isExecuting ? ( + + ) : ( + + {getUserWorkspacesRequest.error ? ( + + {intl.formatMessage(messages.workspacesRequestFailed)} + + ) : ( + + + {workspaces.map(workspace => ( + onWorkspaceClick(w)} + /> + ))} + +
+ )} +
+ )}
); diff --git a/src/features/workspaces/containers/WorkspacesScreen.js b/src/features/workspaces/containers/WorkspacesScreen.js index 89bd2a2ef..3f41de0c2 100644 --- a/src/features/workspaces/containers/WorkspacesScreen.js +++ b/src/features/workspaces/containers/WorkspacesScreen.js @@ -4,7 +4,7 @@ import PropTypes from 'prop-types'; import WorkspacesDashboard from '../components/WorkspacesDashboard'; import ErrorBoundary from '../../../components/util/ErrorBoundary'; import { workspaceStore } from '../index'; -import { getUserWorkspacesRequest } from '../api'; +import { getUserWorkspacesRequest, updateWorkspaceRequest } from '../api'; @inject('actions') @observer class WorkspacesScreen extends Component { @@ -23,6 +23,7 @@ class WorkspacesScreen extends Component { actions.workspaces.create(data)} onWorkspaceClick={w => actions.workspaces.edit({ workspace: w })} /> diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index 3cec5f360..f7df7b29c 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -102,9 +102,7 @@ export default class WorkspacesStore { @action _create = async ({ name }) => { try { const workspace = await createWorkspaceRequest.execute(name); - await getUserWorkspacesRequest.patch((result) => { - result.push(workspace); - }); + await getUserWorkspacesRequest.result.push(workspace); this._edit({ workspace }); } catch (error) { throw error; @@ -114,9 +112,7 @@ export default class WorkspacesStore { @action _delete = async ({ workspace }) => { try { await deleteWorkspaceRequest.execute(workspace); - await getUserWorkspacesRequest.patch((result) => { - result.remove(workspace); - }); + await getUserWorkspacesRequest.result.remove(workspace); this.stores.router.push('/settings/workspaces'); } catch (error) { throw error; @@ -126,10 +122,9 @@ export default class WorkspacesStore { @action _update = async ({ workspace }) => { try { await updateWorkspaceRequest.execute(workspace); - await getUserWorkspacesRequest.patch((result) => { - const localWorkspace = result.find(ws => ws.id === workspace.id); - Object.assign(localWorkspace, workspace); - }); + // Path local result optimistically + const localWorkspace = this._getWorkspaceById(workspace.id); + Object.assign(localWorkspace, workspace); this.stores.router.push('/settings/workspaces'); } catch (error) { throw error; diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index afbacf28a..891ad38d4 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -3388,52 +3388,65 @@ "defaultMessage": "!!!Your workspaces", "end": { "column": 3, - "line": 17 + "line": 18 }, "file": "src/features/workspaces/components/WorkspacesDashboard.js", "id": "settings.workspaces.headline", "start": { "column": 12, - "line": 14 + "line": 15 } }, { "defaultMessage": "!!!You haven't added any workspaces yet.", "end": { "column": 3, - "line": 21 + "line": 22 }, "file": "src/features/workspaces/components/WorkspacesDashboard.js", "id": "settings.workspaces.noWorkspacesAdded", "start": { "column": 19, - "line": 18 + "line": 19 } }, { "defaultMessage": "!!!Could not load your workspaces", "end": { "column": 3, - "line": 25 + "line": 26 }, "file": "src/features/workspaces/components/WorkspacesDashboard.js", "id": "settings.workspaces.workspacesRequestFailed", "start": { "column": 27, - "line": 22 + "line": 23 } }, { "defaultMessage": "!!!Try again", "end": { "column": 3, - "line": 29 + "line": 30 }, "file": "src/features/workspaces/components/WorkspacesDashboard.js", "id": "settings.workspaces.tryReloadWorkspaces", "start": { "column": 23, - "line": 26 + "line": 27 + } + }, + { + "defaultMessage": "!!!Your changes have been saved", + "end": { + "column": 3, + "line": 34 + }, + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "id": "settings.workspaces.updatedInfo", + "start": { + "column": 15, + "line": 31 } } ], diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 2b4e79621..ad179bc1d 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -252,6 +252,7 @@ "settings.workspaces.headline": "Your workspaces", "settings.workspaces.noWorkspacesAdded": "You haven't added any workspaces yet.", "settings.workspaces.tryReloadWorkspaces": "Try again", + "settings.workspaces.updatedInfo": "!!!Your changes have been saved", "settings.workspaces.workspacesRequestFailed": "Could not load your workspaces", "sidebar.addNewService": "Add new service", "sidebar.closeWorkspaceDrawer": "Close workspace drawer", @@ -307,4 +308,4 @@ "workspaceDrawer.headline": "Workspaces", "workspaceDrawer.item.noServicesAddedYet": "No services added yet", "workspaces.switchingIndicator.switchingTo": "Switching to" -} +} \ No newline at end of file diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json index f875ace8a..d68899d9b 100644 --- a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json +++ b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json @@ -4,11 +4,11 @@ "defaultMessage": "!!!Your workspaces", "file": "src/features/workspaces/components/WorkspacesDashboard.js", "start": { - "line": 14, + "line": 15, "column": 12 }, "end": { - "line": 17, + "line": 18, "column": 3 } }, @@ -17,11 +17,11 @@ "defaultMessage": "!!!You haven't added any workspaces yet.", "file": "src/features/workspaces/components/WorkspacesDashboard.js", "start": { - "line": 18, + "line": 19, "column": 19 }, "end": { - "line": 21, + "line": 22, "column": 3 } }, @@ -30,11 +30,11 @@ "defaultMessage": "!!!Could not load your workspaces", "file": "src/features/workspaces/components/WorkspacesDashboard.js", "start": { - "line": 22, + "line": 23, "column": 27 }, "end": { - "line": 25, + "line": 26, "column": 3 } }, @@ -43,11 +43,24 @@ "defaultMessage": "!!!Try again", "file": "src/features/workspaces/components/WorkspacesDashboard.js", "start": { - "line": 26, + "line": 27, "column": 23 }, "end": { - "line": 29, + "line": 30, + "column": 3 + } + }, + { + "id": "settings.workspaces.updatedInfo", + "defaultMessage": "!!!Your changes have been saved", + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "start": { + "line": 31, + "column": 15 + }, + "end": { + "line": 34, "column": 3 } } diff --git a/src/stores/lib/Request.js b/src/stores/lib/Request.js index 1fb67cc15..486de8a49 100644 --- a/src/stores/lib/Request.js +++ b/src/stores/lib/Request.js @@ -109,7 +109,7 @@ export default class Request { Request._hooks.forEach(hook => hook(this)); } - reset() { + reset = () => { this.result = null; this.isExecuting = false; this.isError = false; @@ -118,5 +118,5 @@ export default class Request { this._promise = Promise; return this; - } + }; } -- cgit v1.2.3-54-g00ecf From 03c76d7a6e5c5529e39f245dd350c0bc8abbd128 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Tue, 26 Mar 2019 16:25:49 +0100 Subject: indicate any server interaction with spinners and infoboxes --- src/features/workspaces/api.js | 2 +- .../workspaces/components/CreateWorkspaceForm.js | 7 ++- .../workspaces/components/EditWorkspaceForm.js | 59 +++++++++------------- .../workspaces/components/WorkspacesDashboard.js | 38 ++++++++++++-- .../workspaces/containers/EditWorkspaceScreen.js | 5 +- .../workspaces/containers/WorkspacesScreen.js | 9 +++- src/i18n/locales/defaultMessages.json | 35 +++++++++---- src/i18n/locales/en-US.json | 5 +- .../workspaces/components/CreateWorkspaceForm.json | 2 +- .../workspaces/components/EditWorkspaceForm.json | 20 ++++---- .../workspaces/components/WorkspacesDashboard.json | 13 +++++ 11 files changed, 127 insertions(+), 68 deletions(-) diff --git a/src/features/workspaces/api.js b/src/features/workspaces/api.js index 3da265e5e..0ec20c9ea 100644 --- a/src/features/workspaces/api.js +++ b/src/features/workspaces/api.js @@ -36,7 +36,7 @@ export const workspaceApi = { const result = await sendAuthRequest(url, { method: 'DELETE' }); debug('deleteWorkspace RESULT', result); if (!result.ok) throw result; - return (await result.json()).deleted; + return true; }, updateWorkspace: async (workspace) => { diff --git a/src/features/workspaces/components/CreateWorkspaceForm.js b/src/features/workspaces/components/CreateWorkspaceForm.js index 83f6e07f7..8b5039246 100644 --- a/src/features/workspaces/components/CreateWorkspaceForm.js +++ b/src/features/workspaces/components/CreateWorkspaceForm.js @@ -10,7 +10,7 @@ import { required } from '../../../helpers/validation-helpers'; const messages = defineMessages({ submitButton: { id: 'settings.workspace.add.form.submitButton', - defaultMessage: '!!!Save workspace', + defaultMessage: '!!!Create workspace', }, name: { id: 'settings.workspace.add.form.name', @@ -40,6 +40,7 @@ class CreateWorkspaceForm extends Component { static propTypes = { classes: PropTypes.object.isRequired, + isSubmitting: PropTypes.bool.isRequired, onSubmit: PropTypes.func.isRequired, }; @@ -69,7 +70,7 @@ class CreateWorkspaceForm extends Component { render() { const { intl } = this.context; - const { classes } = this.props; + const { classes, isSubmitting } = this.props; const { form } = this; return (
@@ -84,6 +85,8 @@ class CreateWorkspaceForm extends Component { type="submit" label={intl.formatMessage(messages.submitButton)} onClick={this.submitForm.bind(this, form)} + busy={isSubmitting} + buttonType={isSubmitting ? 'secondary' : 'primary'} />
); diff --git a/src/features/workspaces/components/EditWorkspaceForm.js b/src/features/workspaces/components/EditWorkspaceForm.js index 48090f608..a9fd4d21c 100644 --- a/src/features/workspaces/components/EditWorkspaceForm.js +++ b/src/features/workspaces/components/EditWorkspaceForm.js @@ -11,6 +11,7 @@ import Service from '../../../models/Service'; import Form from '../../../lib/Form'; import { required } from '../../../helpers/validation-helpers'; import ServiceListItem from './ServiceListItem'; +import Request from '../../../stores/lib/Request'; const messages = defineMessages({ buttonDelete: { @@ -52,12 +53,12 @@ class EditWorkspaceForm extends Component { static propTypes = { classes: PropTypes.object.isRequired, - isDeleting: PropTypes.bool.isRequired, - isSaving: PropTypes.bool.isRequired, onDelete: PropTypes.func.isRequired, onSave: PropTypes.func.isRequired, services: PropTypes.arrayOf(PropTypes.instanceOf(Service)).isRequired, workspace: PropTypes.instanceOf(Workspace).isRequired, + updateWorkspaceRequest: PropTypes.instanceOf(Request).isRequired, + deleteWorkspaceRequest: PropTypes.instanceOf(Request).isRequired, }; form = this.prepareWorkspaceForm(this.props.workspace); @@ -112,14 +113,16 @@ class EditWorkspaceForm extends Component { const { intl } = this.context; const { classes, - isDeleting, - isSaving, onDelete, workspace, services, + deleteWorkspaceRequest, + updateWorkspaceRequest, } = this.props; const { form } = this; const workspaceServices = form.$('services').value; + const isDeleting = deleteWorkspaceRequest.isExecuting; + const isSaving = updateWorkspaceRequest.isExecuting; return (
@@ -151,38 +154,24 @@ class EditWorkspaceForm extends Component {
{/* ===== Delete Button ===== */} - {isDeleting ? ( -
); diff --git a/src/features/workspaces/components/WorkspacesDashboard.js b/src/features/workspaces/components/WorkspacesDashboard.js index 3db38aff4..b31581a5b 100644 --- a/src/features/workspaces/components/WorkspacesDashboard.js +++ b/src/features/workspaces/components/WorkspacesDashboard.js @@ -32,6 +32,10 @@ const messages = defineMessages({ id: 'settings.workspaces.updatedInfo', defaultMessage: '!!!Your changes have been saved', }, + deletedInfo: { + id: 'settings.workspaces.deletedInfo', + defaultMessage: '!!!Workspace has been deleted', + }, }); const styles = () => ({ @@ -49,6 +53,8 @@ class WorkspacesDashboard extends Component { static propTypes = { classes: PropTypes.object.isRequired, getUserWorkspacesRequest: PropTypes.instanceOf(Request).isRequired, + createWorkspaceRequest: PropTypes.instanceOf(Request).isRequired, + deleteWorkspaceRequest: PropTypes.instanceOf(Request).isRequired, updateWorkspaceRequest: PropTypes.instanceOf(Request).isRequired, onCreateWorkspaceSubmit: PropTypes.func.isRequired, onWorkspaceClick: PropTypes.func.isRequired, @@ -63,38 +69,63 @@ class WorkspacesDashboard extends Component { const { classes, getUserWorkspacesRequest, + createWorkspaceRequest, + deleteWorkspaceRequest, updateWorkspaceRequest, onCreateWorkspaceSubmit, onWorkspaceClick, workspaces, } = this.props; const { intl } = this.context; + console.log(deleteWorkspaceRequest.result); return (

{intl.formatMessage(messages.headline)}

+ + {/* ===== Workspace updated info ===== */} {updateWorkspaceRequest.wasExecuted && updateWorkspaceRequest.result && ( {intl.formatMessage(messages.updatedInfo)} )} + + {/* ===== Workspace deleted info ===== */} + {deleteWorkspaceRequest.wasExecuted && deleteWorkspaceRequest.result && ( + + + {intl.formatMessage(messages.deletedInfo)} + + + )} + + {/* ===== Create workspace form ===== */}
- +
+ {getUserWorkspacesRequest.isExecuting ? ( ) : ( + {/* ===== Workspace could not be loaded error ===== */} {getUserWorkspacesRequest.error ? ( ) : ( + {/* ===== Workspaces list ===== */} {workspaces.map(workspace => ( ); diff --git a/src/features/workspaces/containers/WorkspacesScreen.js b/src/features/workspaces/containers/WorkspacesScreen.js index 3f41de0c2..2ab565fa1 100644 --- a/src/features/workspaces/containers/WorkspacesScreen.js +++ b/src/features/workspaces/containers/WorkspacesScreen.js @@ -4,7 +4,12 @@ import PropTypes from 'prop-types'; import WorkspacesDashboard from '../components/WorkspacesDashboard'; import ErrorBoundary from '../../../components/util/ErrorBoundary'; import { workspaceStore } from '../index'; -import { getUserWorkspacesRequest, updateWorkspaceRequest } from '../api'; +import { + createWorkspaceRequest, + deleteWorkspaceRequest, + getUserWorkspacesRequest, + updateWorkspaceRequest, +} from '../api'; @inject('actions') @observer class WorkspacesScreen extends Component { @@ -23,6 +28,8 @@ class WorkspacesScreen extends Component { actions.workspaces.create(data)} onWorkspaceClick={w => actions.workspaces.edit({ workspace: w })} diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 891ad38d4..4b6a8eca9 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -3222,7 +3222,7 @@ { "descriptors": [ { - "defaultMessage": "!!!Save workspace", + "defaultMessage": "!!!Create workspace", "end": { "column": 3, "line": 14 @@ -3256,65 +3256,65 @@ "defaultMessage": "!!!Delete workspace", "end": { "column": 3, - "line": 19 + "line": 20 }, "file": "src/features/workspaces/components/EditWorkspaceForm.js", "id": "settings.workspace.form.buttonDelete", "start": { "column": 16, - "line": 16 + "line": 17 } }, { "defaultMessage": "!!!Save workspace", "end": { "column": 3, - "line": 23 + "line": 24 }, "file": "src/features/workspaces/components/EditWorkspaceForm.js", "id": "settings.workspace.form.buttonSave", "start": { "column": 14, - "line": 20 + "line": 21 } }, { "defaultMessage": "!!!Name", "end": { "column": 3, - "line": 27 + "line": 28 }, "file": "src/features/workspaces/components/EditWorkspaceForm.js", "id": "settings.workspace.form.name", "start": { "column": 8, - "line": 24 + "line": 25 } }, { "defaultMessage": "!!!Your workspaces", "end": { "column": 3, - "line": 31 + "line": 32 }, "file": "src/features/workspaces/components/EditWorkspaceForm.js", "id": "settings.workspace.form.yourWorkspaces", "start": { "column": 18, - "line": 28 + "line": 29 } }, { "defaultMessage": "!!!Services in this Workspace", "end": { "column": 3, - "line": 35 + "line": 36 }, "file": "src/features/workspaces/components/EditWorkspaceForm.js", "id": "settings.workspace.form.servicesInWorkspaceHeadline", "start": { "column": 31, - "line": 32 + "line": 33 } } ], @@ -3448,6 +3448,19 @@ "column": 15, "line": 31 } + }, + { + "defaultMessage": "!!!Workspace has been deleted", + "end": { + "column": 3, + "line": 38 + }, + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "id": "settings.workspaces.deletedInfo", + "start": { + "column": 15, + "line": 35 + } } ], "path": "src/features/workspaces/components/WorkspacesDashboard.json" diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index ad179bc1d..5f7254317 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -243,16 +243,17 @@ "settings.user.form.lastname": "Last Name", "settings.user.form.newPassword": "New password", "settings.workspace.add.form.name": "Name", - "settings.workspace.add.form.submitButton": "Save workspace", + "settings.workspace.add.form.submitButton": "Create workspace", "settings.workspace.form.buttonDelete": "Delete workspace", "settings.workspace.form.buttonSave": "Save workspace", "settings.workspace.form.name": "Name", "settings.workspace.form.servicesInWorkspaceHeadline": "Services in this Workspace", "settings.workspace.form.yourWorkspaces": "Your workspaces", + "settings.workspaces.deletedInfo": "Workspace has been deleted", "settings.workspaces.headline": "Your workspaces", "settings.workspaces.noWorkspacesAdded": "You haven't added any workspaces yet.", "settings.workspaces.tryReloadWorkspaces": "Try again", - "settings.workspaces.updatedInfo": "!!!Your changes have been saved", + "settings.workspaces.updatedInfo": "Your changes have been saved", "settings.workspaces.workspacesRequestFailed": "Could not load your workspaces", "sidebar.addNewService": "Add new service", "sidebar.closeWorkspaceDrawer": "Close workspace drawer", diff --git a/src/i18n/messages/src/features/workspaces/components/CreateWorkspaceForm.json b/src/i18n/messages/src/features/workspaces/components/CreateWorkspaceForm.json index 1d5063a97..7cc1a374f 100644 --- a/src/i18n/messages/src/features/workspaces/components/CreateWorkspaceForm.json +++ b/src/i18n/messages/src/features/workspaces/components/CreateWorkspaceForm.json @@ -1,7 +1,7 @@ [ { "id": "settings.workspace.add.form.submitButton", - "defaultMessage": "!!!Save workspace", + "defaultMessage": "!!!Create workspace", "file": "src/features/workspaces/components/CreateWorkspaceForm.js", "start": { "line": 11, diff --git a/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json b/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json index 467f49cda..8a26bf45a 100644 --- a/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json +++ b/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json @@ -4,11 +4,11 @@ "defaultMessage": "!!!Delete workspace", "file": "src/features/workspaces/components/EditWorkspaceForm.js", "start": { - "line": 16, + "line": 17, "column": 16 }, "end": { - "line": 19, + "line": 20, "column": 3 } }, @@ -17,11 +17,11 @@ "defaultMessage": "!!!Save workspace", "file": "src/features/workspaces/components/EditWorkspaceForm.js", "start": { - "line": 20, + "line": 21, "column": 14 }, "end": { - "line": 23, + "line": 24, "column": 3 } }, @@ -30,11 +30,11 @@ "defaultMessage": "!!!Name", "file": "src/features/workspaces/components/EditWorkspaceForm.js", "start": { - "line": 24, + "line": 25, "column": 8 }, "end": { - "line": 27, + "line": 28, "column": 3 } }, @@ -43,11 +43,11 @@ "defaultMessage": "!!!Your workspaces", "file": "src/features/workspaces/components/EditWorkspaceForm.js", "start": { - "line": 28, + "line": 29, "column": 18 }, "end": { - "line": 31, + "line": 32, "column": 3 } }, @@ -56,11 +56,11 @@ "defaultMessage": "!!!Services in this Workspace", "file": "src/features/workspaces/components/EditWorkspaceForm.js", "start": { - "line": 32, + "line": 33, "column": 31 }, "end": { - "line": 35, + "line": 36, "column": 3 } } diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json index d68899d9b..a957358c8 100644 --- a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json +++ b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json @@ -63,5 +63,18 @@ "line": 34, "column": 3 } + }, + { + "id": "settings.workspaces.deletedInfo", + "defaultMessage": "!!!Workspace has been deleted", + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "start": { + "line": 35, + "column": 15 + }, + "end": { + "line": 38, + "column": 3 + } } ] \ No newline at end of file -- cgit v1.2.3-54-g00ecf From eb57e4f787d06648dab2c473830dcfbfa168e00c Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Thu, 28 Mar 2019 12:13:27 +0100 Subject: add analytic events for workspace actions --- src/components/layout/Sidebar.js | 4 +- .../workspaces/components/CreateWorkspaceForm.js | 6 +- .../workspaces/components/EditWorkspaceForm.js | 16 +- .../workspaces/components/WorkspaceDrawer.js | 13 +- .../workspaces/components/WorkspacesDashboard.js | 1 - src/features/workspaces/index.js | 2 + src/i18n/locales/defaultMessages.json | 272 ++++++++++----------- .../messages/src/components/layout/Sidebar.json | 24 +- .../workspaces/components/CreateWorkspaceForm.json | 8 +- .../workspaces/components/EditWorkspaceForm.json | 20 +- .../workspaces/components/WorkspaceDrawer.json | 12 +- src/i18n/messages/src/lib/Menu.json | 208 ++++++++-------- src/lib/Menu.js | 6 +- src/lib/analytics.js | 4 +- 14 files changed, 310 insertions(+), 286 deletions(-) diff --git a/src/components/layout/Sidebar.js b/src/components/layout/Sidebar.js index f7bacfe0f..4fa5e79de 100644 --- a/src/components/layout/Sidebar.js +++ b/src/components/layout/Sidebar.js @@ -6,7 +6,8 @@ import { observer } from 'mobx-react'; import Tabbar from '../services/tabs/Tabbar'; import { ctrlKey } from '../../environment'; -import { workspaceStore } from '../../features/workspaces'; +import { GA_CATEGORY_WORKSPACES, workspaceStore } from '../../features/workspaces'; +import { gaEvent } from '../../lib/analytics'; const messages = defineMessages({ settings: { @@ -95,6 +96,7 @@ export default @observer class Sidebar extends Component { onClick={() => { toggleWorkspaceDrawer(); this.updateToolTip(); + gaEvent(GA_CATEGORY_WORKSPACES, 'toggleDrawer', 'sidebar'); }} className={`sidebar__button sidebar__button--workspaces ${isWorkspaceDrawerOpen ? 'is-active' : ''}`} data-tip={`${intl.formatMessage(workspaceToggleMessage)} (${ctrlKey}+Shift+D)`} diff --git a/src/features/workspaces/components/CreateWorkspaceForm.js b/src/features/workspaces/components/CreateWorkspaceForm.js index 8b5039246..a8f07d0d5 100644 --- a/src/features/workspaces/components/CreateWorkspaceForm.js +++ b/src/features/workspaces/components/CreateWorkspaceForm.js @@ -6,6 +6,8 @@ import { Input, Button } from '@meetfranz/forms'; import injectSheet from 'react-jss'; import Form from '../../../lib/Form'; import { required } from '../../../helpers/validation-helpers'; +import { gaEvent } from '../../../lib/analytics'; +import { GA_CATEGORY_WORKSPACES } from '../index'; const messages = defineMessages({ submitButton: { @@ -63,7 +65,9 @@ class CreateWorkspaceForm extends Component { form.submit({ onSuccess: async (f) => { const { onSubmit } = this.props; - onSubmit(f.values()); + const values = f.values(); + onSubmit(values); + gaEvent(GA_CATEGORY_WORKSPACES, 'create', values.name); }, }); } diff --git a/src/features/workspaces/components/EditWorkspaceForm.js b/src/features/workspaces/components/EditWorkspaceForm.js index a9fd4d21c..e4bf44248 100644 --- a/src/features/workspaces/components/EditWorkspaceForm.js +++ b/src/features/workspaces/components/EditWorkspaceForm.js @@ -12,6 +12,8 @@ import Form from '../../../lib/Form'; import { required } from '../../../helpers/validation-helpers'; import ServiceListItem from './ServiceListItem'; import Request from '../../../stores/lib/Request'; +import { gaEvent } from '../../../lib/analytics'; +import { GA_CATEGORY_WORKSPACES } from '../index'; const messages = defineMessages({ buttonDelete: { @@ -87,17 +89,24 @@ class EditWorkspaceForm extends Component { }); } - submitForm(form) { + save(form) { form.submit({ onSuccess: async (f) => { const { onSave } = this.props; const values = f.values(); onSave(values); + gaEvent(GA_CATEGORY_WORKSPACES, 'save'); }, onError: async () => {}, }); } + delete() { + const { onDelete } = this.props; + onDelete(); + gaEvent(GA_CATEGORY_WORKSPACES, 'delete'); + } + toggleService(service) { const servicesField = this.form.$('services'); const serviceIds = servicesField.value; @@ -113,7 +122,6 @@ class EditWorkspaceForm extends Component { const { intl } = this.context; const { classes, - onDelete, workspace, services, deleteWorkspaceRequest, @@ -161,7 +169,7 @@ class EditWorkspaceForm extends Component { buttonType={isDeleting ? 'secondary' : 'danger'} className="settings__delete-button" disabled={isDeleting} - onClick={onDelete} + onClick={this.delete.bind(this)} /> {/* ===== Save Button ===== */} @@ -73,3 +88,5 @@ PremiumFeatureContainer.wrappedComponent.propTypes = { }).isRequired, }).isRequired, }; + +export default PremiumFeatureContainer; diff --git a/src/components/ui/PremiumFeatureContainer/styles.js b/src/components/ui/PremiumFeatureContainer/styles.js index 81d6666c6..615ed0a79 100644 --- a/src/components/ui/PremiumFeatureContainer/styles.js +++ b/src/components/ui/PremiumFeatureContainer/styles.js @@ -6,6 +6,7 @@ export default theme => ({ padding: 20, 'border-radius': theme.borderRadius, pointerEvents: 'none', + height: 'auto', }, titleContainer: { display: 'flex', @@ -26,7 +27,7 @@ export default theme => ({ content: { opacity: 0.5, 'margin-top': 20, - '& :last-child': { + '& > :last-child': { 'margin-bottom': 0, }, }, diff --git a/src/features/delayApp/index.js b/src/features/delayApp/index.js index abc8274cf..67f0fc5e6 100644 --- a/src/features/delayApp/index.js +++ b/src/features/delayApp/index.js @@ -55,7 +55,7 @@ export default function init(stores) { setVisibility(true); gaPage('/delayApp'); - gaEvent('delayApp', 'show', 'Delay App Feature'); + gaEvent('DelayApp', 'show', 'Delay App Feature'); timeLastDelay = moment(); shownAfterLaunch = true; diff --git a/src/features/utils/FeatureStore.js b/src/features/utils/FeatureStore.js new file mode 100644 index 000000000..66b66a104 --- /dev/null +++ b/src/features/utils/FeatureStore.js @@ -0,0 +1,21 @@ +import Reaction from '../../stores/lib/Reaction'; + +export class FeatureStore { + _actions = null; + + _reactions = null; + + _listenToActions(actions) { + if (this._actions) this._actions.forEach(a => a[0].off(a[1])); + this._actions = []; + actions.forEach(a => this._actions.push(a)); + this._actions.forEach(a => a[0].listen(a[1])); + } + + _startReactions(reactions) { + if (this._reactions) this._reactions.forEach(r => r.stop()); + this._reactions = []; + reactions.forEach(r => this._reactions.push(new Reaction(r))); + this._reactions.forEach(r => r.start()); + } +} diff --git a/src/features/workspaces/components/CreateWorkspaceForm.js b/src/features/workspaces/components/CreateWorkspaceForm.js index a8f07d0d5..0be2d528f 100644 --- a/src/features/workspaces/components/CreateWorkspaceForm.js +++ b/src/features/workspaces/components/CreateWorkspaceForm.js @@ -30,7 +30,6 @@ const styles = () => ({ }, submitButton: { height: 'inherit', - marginTop: '3px', }, }); diff --git a/src/features/workspaces/components/WorkspacesDashboard.js b/src/features/workspaces/components/WorkspacesDashboard.js index 52c3afdcf..1fad1f71d 100644 --- a/src/features/workspaces/components/WorkspacesDashboard.js +++ b/src/features/workspaces/components/WorkspacesDashboard.js @@ -10,6 +10,8 @@ import WorkspaceItem from './WorkspaceItem'; import CreateWorkspaceForm from './CreateWorkspaceForm'; import Request from '../../../stores/lib/Request'; import Appear from '../../../components/ui/effects/Appear'; +import { workspaceStore } from '../index'; +import PremiumFeatureContainer from '../../../components/ui/PremiumFeatureContainer'; const messages = defineMessages({ headline: { @@ -36,6 +38,14 @@ const messages = defineMessages({ id: 'settings.workspaces.deletedInfo', defaultMessage: '!!!Workspace has been deleted', }, + workspaceFeatureInfo: { + id: 'settings.workspaces.workspaceFeatureInfo', + defaultMessage: '!!!Info about workspace feature', + }, + workspaceFeatureHeadline: { + id: 'settings.workspaces.workspaceFeatureHeadline', + defaultMessage: '!!!Less is More: Introducing Franz Workspaces', + }, }); const styles = () => ({ @@ -46,6 +56,12 @@ const styles = () => ({ appear: { height: 'auto', }, + premiumAnnouncement: { + padding: '20px', + backgroundColor: '#3498db', + marginLeft: '-20px', + height: 'auto', + }, }); @injectSheet(styles) @observer @@ -112,14 +128,24 @@ class WorkspacesDashboard extends Component { )} - {/* ===== Create workspace form ===== */} -
- -
- + + {/* ===== Create workspace form ===== */} +
+ +
+
+ {workspaceStore.isUpgradeToPremiumRequired && ( +
+

{intl.formatMessage(messages.workspaceFeatureHeadline)}

+

{intl.formatMessage(messages.workspaceFeatureInfo)}

+
+ )} {getUserWorkspacesRequest.isExecuting ? ( ) : ( diff --git a/src/features/workspaces/index.js b/src/features/workspaces/index.js index 89999ab0f..524a83e3c 100644 --- a/src/features/workspaces/index.js +++ b/src/features/workspaces/index.js @@ -4,11 +4,12 @@ import { resetApiRequests } from './api'; const debug = require('debug')('Franz:feature:workspaces'); -export const GA_CATEGORY_WORKSPACES = 'workspaces'; +export const GA_CATEGORY_WORKSPACES = 'Workspaces'; export const workspaceStore = new WorkspacesStore(); export default function initWorkspaces(stores, actions) { + stores.workspaces = workspaceStore; const { features, user } = stores; // Toggle workspace feature diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index f7df7b29c..62bf3efb4 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -3,9 +3,9 @@ import { observable, action, } from 'mobx'; -import Reaction from '../../stores/lib/Reaction'; import { matchRoute } from '../../helpers/routing-helpers'; import { workspaceActions } from './actions'; +import { FeatureStore } from '../utils/FeatureStore'; import { createWorkspaceRequest, deleteWorkspaceRequest, @@ -15,7 +15,11 @@ import { const debug = require('debug')('Franz:feature:workspaces:store'); -export default class WorkspacesStore { +export default class WorkspacesStore extends FeatureStore { + @observable isFeatureEnabled = false; + + @observable isPremiumFeature = true; + @observable isFeatureActive = false; @observable activeWorkspace = null; @@ -33,36 +37,39 @@ export default class WorkspacesStore { return getUserWorkspacesRequest.result || []; } - constructor() { - // Wire-up action handlers - workspaceActions.edit.listen(this._edit); - workspaceActions.create.listen(this._create); - workspaceActions.delete.listen(this._delete); - workspaceActions.update.listen(this._update); - workspaceActions.activate.listen(this._setActiveWorkspace); - workspaceActions.deactivate.listen(this._deactivateActiveWorkspace); - workspaceActions.toggleWorkspaceDrawer.listen(this._toggleWorkspaceDrawer); - workspaceActions.openWorkspaceSettings.listen(this._openWorkspaceSettings); - - // Register and start reactions - this._registerReactions([ - this._updateWorkspaceBeingEdited, - this._updateActiveServiceOnWorkspaceSwitch, - ]); + @computed get isUpgradeToPremiumRequired() { + return this.isFeatureEnabled && !this.isFeatureActive; } start(stores, actions) { debug('WorkspacesStore::start'); this.stores = stores; this.actions = actions; - this._reactions.forEach(r => r.start()); - this.isFeatureActive = true; + + this._listenToActions([ + [workspaceActions.edit, this._edit], + [workspaceActions.create, this._create], + [workspaceActions.delete, this._delete], + [workspaceActions.update, this._update], + [workspaceActions.activate, this._setActiveWorkspace], + [workspaceActions.deactivate, this._deactivateActiveWorkspace], + [workspaceActions.toggleWorkspaceDrawer, this._toggleWorkspaceDrawer], + [workspaceActions.openWorkspaceSettings, this._openWorkspaceSettings], + ]); + + this._startReactions([ + this._setWorkspaceBeingEditedReaction, + this._setActiveServiceOnWorkspaceSwitchReaction, + this._setFeatureEnabledReaction, + this._setIsPremiumFeatureReaction, + ]); + getUserWorkspacesRequest.execute(); + this.isFeatureActive = true; } stop() { debug('WorkspacesStore::stop'); - this._reactions.forEach(r => r.stop()); this.isFeatureActive = false; this.activeWorkspace = null; this.nextWorkspace = null; @@ -85,12 +92,6 @@ export default class WorkspacesStore { // ========== PRIVATE ========= // - _reactions = []; - - _registerReactions(reactions) { - reactions.forEach(r => this._reactions.push(new Reaction(r))); - } - _getWorkspaceById = id => this.workspaces.find(w => w.id === id); // Actions @@ -164,7 +165,17 @@ export default class WorkspacesStore { // Reactions - _updateWorkspaceBeingEdited = () => { + _setFeatureEnabledReaction = () => { + const { isWorkspaceEnabled } = this.stores.features.features; + this.isFeatureEnabled = isWorkspaceEnabled; + }; + + _setIsPremiumFeatureReaction = () => { + const { isWorkspacePremiumFeature } = this.stores.features.features; + this.isPremiumFeature = isWorkspacePremiumFeature; + }; + + _setWorkspaceBeingEditedReaction = () => { const { pathname } = this.stores.router.location; const match = matchRoute('/settings/workspaces/edit/:id', pathname); if (match) { @@ -172,7 +183,7 @@ export default class WorkspacesStore { } }; - _updateActiveServiceOnWorkspaceSwitch = () => { + _setActiveServiceOnWorkspaceSwitchReaction = () => { if (!this.isFeatureActive) return; if (this.activeWorkspace) { const services = this.stores.services.allDisplayed; diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 659b1b361..1747e1976 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -2535,13 +2535,13 @@ "defaultMessage": "!!!Upgrade account", "end": { "column": 3, - "line": 17 + "line": 18 }, "file": "src/components/ui/PremiumFeatureContainer/index.js", "id": "premiumFeature.button.upgradeAccount", "start": { "column": 10, - "line": 14 + "line": 15 } } ], @@ -3388,78 +3388,104 @@ "defaultMessage": "!!!Your workspaces", "end": { "column": 3, - "line": 18 + "line": 20 }, "file": "src/features/workspaces/components/WorkspacesDashboard.js", "id": "settings.workspaces.headline", "start": { "column": 12, - "line": 15 + "line": 17 } }, { "defaultMessage": "!!!You haven't added any workspaces yet.", "end": { "column": 3, - "line": 22 + "line": 24 }, "file": "src/features/workspaces/components/WorkspacesDashboard.js", "id": "settings.workspaces.noWorkspacesAdded", "start": { "column": 19, - "line": 19 + "line": 21 } }, { "defaultMessage": "!!!Could not load your workspaces", "end": { "column": 3, - "line": 26 + "line": 28 }, "file": "src/features/workspaces/components/WorkspacesDashboard.js", "id": "settings.workspaces.workspacesRequestFailed", "start": { "column": 27, - "line": 23 + "line": 25 } }, { "defaultMessage": "!!!Try again", "end": { "column": 3, - "line": 30 + "line": 32 }, "file": "src/features/workspaces/components/WorkspacesDashboard.js", "id": "settings.workspaces.tryReloadWorkspaces", "start": { "column": 23, - "line": 27 + "line": 29 } }, { "defaultMessage": "!!!Your changes have been saved", "end": { "column": 3, - "line": 34 + "line": 36 }, "file": "src/features/workspaces/components/WorkspacesDashboard.js", "id": "settings.workspaces.updatedInfo", "start": { "column": 15, - "line": 31 + "line": 33 } }, { "defaultMessage": "!!!Workspace has been deleted", "end": { "column": 3, - "line": 38 + "line": 40 }, "file": "src/features/workspaces/components/WorkspacesDashboard.js", "id": "settings.workspaces.deletedInfo", "start": { "column": 15, - "line": 35 + "line": 37 + } + }, + { + "defaultMessage": "!!!Info about workspace feature", + "end": { + "column": 3, + "line": 44 + }, + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "id": "settings.workspaces.workspaceFeatureInfo", + "start": { + "column": 24, + "line": 41 + } + }, + { + "defaultMessage": "!!!Less is More: Introducing Franz Workspaces", + "end": { + "column": 3, + "line": 48 + }, + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "id": "settings.workspaces.workspaceFeatureHeadline", + "start": { + "column": 28, + "line": 45 } } ], diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 5f7254317..987262c35 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -254,6 +254,8 @@ "settings.workspaces.noWorkspacesAdded": "You haven't added any workspaces yet.", "settings.workspaces.tryReloadWorkspaces": "Try again", "settings.workspaces.updatedInfo": "Your changes have been saved", + "settings.workspaces.workspaceFeatureHeadline": "Less is More: Introducing Franz Workspaces", + "settings.workspaces.workspaceFeatureInfo": "Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time. 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.", "settings.workspaces.workspacesRequestFailed": "Could not load your workspaces", "sidebar.addNewService": "Add new service", "sidebar.closeWorkspaceDrawer": "Close workspace drawer", diff --git a/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json b/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json index 582d546fa..320d3ca3e 100644 --- a/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json +++ b/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json @@ -4,11 +4,11 @@ "defaultMessage": "!!!Upgrade account", "file": "src/components/ui/PremiumFeatureContainer/index.js", "start": { - "line": 14, + "line": 15, "column": 10 }, "end": { - "line": 17, + "line": 18, "column": 3 } } diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json index a957358c8..ef8f1bebc 100644 --- a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json +++ b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json @@ -4,11 +4,11 @@ "defaultMessage": "!!!Your workspaces", "file": "src/features/workspaces/components/WorkspacesDashboard.js", "start": { - "line": 15, + "line": 17, "column": 12 }, "end": { - "line": 18, + "line": 20, "column": 3 } }, @@ -17,11 +17,11 @@ "defaultMessage": "!!!You haven't added any workspaces yet.", "file": "src/features/workspaces/components/WorkspacesDashboard.js", "start": { - "line": 19, + "line": 21, "column": 19 }, "end": { - "line": 22, + "line": 24, "column": 3 } }, @@ -30,11 +30,11 @@ "defaultMessage": "!!!Could not load your workspaces", "file": "src/features/workspaces/components/WorkspacesDashboard.js", "start": { - "line": 23, + "line": 25, "column": 27 }, "end": { - "line": 26, + "line": 28, "column": 3 } }, @@ -43,11 +43,11 @@ "defaultMessage": "!!!Try again", "file": "src/features/workspaces/components/WorkspacesDashboard.js", "start": { - "line": 27, + "line": 29, "column": 23 }, "end": { - "line": 30, + "line": 32, "column": 3 } }, @@ -56,11 +56,11 @@ "defaultMessage": "!!!Your changes have been saved", "file": "src/features/workspaces/components/WorkspacesDashboard.js", "start": { - "line": 31, + "line": 33, "column": 15 }, "end": { - "line": 34, + "line": 36, "column": 3 } }, @@ -69,11 +69,37 @@ "defaultMessage": "!!!Workspace has been deleted", "file": "src/features/workspaces/components/WorkspacesDashboard.js", "start": { - "line": 35, + "line": 37, "column": 15 }, "end": { - "line": 38, + "line": 40, + "column": 3 + } + }, + { + "id": "settings.workspaces.workspaceFeatureInfo", + "defaultMessage": "!!!Info about workspace feature", + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "start": { + "line": 41, + "column": 24 + }, + "end": { + "line": 44, + "column": 3 + } + }, + { + "id": "settings.workspaces.workspaceFeatureHeadline", + "defaultMessage": "!!!Less is More: Introducing Franz Workspaces", + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "start": { + "line": 45, + "column": 28 + }, + "end": { + "line": 48, "column": 3 } } diff --git a/src/lib/Menu.js b/src/lib/Menu.js index d19aa9d6e..a4e41c17c 100644 --- a/src/lib/Menu.js +++ b/src/lib/Menu.js @@ -323,7 +323,7 @@ const _templateFactory = intl => [ { label: intl.formatMessage(menuItems.workspaces), submenu: [], - visible: workspaceStore.isFeatureActive, + visible: workspaceStore.isFeatureEnabled, }, { label: intl.formatMessage(menuItems.window), @@ -732,7 +732,7 @@ export default class FranzMenu { tpl[3].submenu = serviceTpl; } - if (workspaceStore.isFeatureActive) { + if (workspaceStore.isFeatureEnabled) { tpl[4].submenu = this.workspacesMenu(); } diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js index 2bda82e17..52e38ad96 100644 --- a/src/stores/FeaturesStore.js +++ b/src/stores/FeaturesStore.js @@ -1,4 +1,4 @@ -import { computed, observable, reaction } from 'mobx'; +import { computed, observable, reaction, runInAction } from 'mobx'; import Store from './lib/Store'; import CachedRequest from './lib/CachedRequest'; @@ -17,8 +17,11 @@ export default class FeaturesStore extends Store { @observable featuresRequest = new CachedRequest(this.api.features, 'features'); + @observable features = Object.assign({}, DEFAULT_FEATURES_CONFIG); + async setup() { this.registerReactions([ + this._updateFeatures, this._monitorLoginStatus.bind(this), ]); @@ -37,13 +40,16 @@ export default class FeaturesStore extends Store { return this.defaultFeaturesRequest.execute().result || DEFAULT_FEATURES_CONFIG; } - @computed get features() { + _updateFeatures = () => { + const features = Object.assign({}, DEFAULT_FEATURES_CONFIG); if (this.stores.user.isLoggedIn) { - return Object.assign({}, DEFAULT_FEATURES_CONFIG, this.featuresRequest.execute().result); + const requestResult = this.featuresRequest.execute().result; + Object.assign(features, requestResult); } - - return DEFAULT_FEATURES_CONFIG; - } + runInAction('FeaturesStore::_updateFeatures', () => { + this.features = features; + }); + }; _monitorLoginStatus() { if (this.stores.user.isLoggedIn) { -- cgit v1.2.3-54-g00ecf From b75206e9a0a2c0c7ffb6052ec0f18c6b9ef5a825 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Wed, 3 Apr 2019 15:14:45 +0200 Subject: add workspace feature info in drawer for free users --- src/features/spellchecker/index.js | 2 - .../workspaces/components/WorkspaceDrawer.js | 81 ++++++++++++++++------ .../workspaces/components/WorkspacesDashboard.js | 15 ++-- src/features/workspaces/store.js | 2 +- src/i18n/locales/defaultMessages.json | 38 ++++++++-- src/i18n/locales/en-US.json | 4 +- .../workspaces/components/WorkspaceDrawer.json | 38 ++++++++-- 7 files changed, 137 insertions(+), 43 deletions(-) diff --git a/src/features/spellchecker/index.js b/src/features/spellchecker/index.js index 94883ad17..79a2172b4 100644 --- a/src/features/spellchecker/index.js +++ b/src/features/spellchecker/index.js @@ -14,8 +14,6 @@ export default function init(stores) { autorun(() => { const { isSpellcheckerPremiumFeature } = stores.features.features; - console.log('isSpellcheckerPremiumFeature', isSpellcheckerPremiumFeature); - config.isPremium = isSpellcheckerPremiumFeature !== undefined ? isSpellcheckerPremiumFeature : DEFAULT_FEATURES_CONFIG.isSpellcheckerPremiumFeature; if (!stores.user.data.isPremium && config.isPremium && stores.settings.app.enableSpellchecking) { diff --git a/src/features/workspaces/components/WorkspaceDrawer.js b/src/features/workspaces/components/WorkspaceDrawer.js index 4d48c45ef..6eacafa68 100644 --- a/src/features/workspaces/components/WorkspaceDrawer.js +++ b/src/features/workspaces/components/WorkspaceDrawer.js @@ -2,8 +2,9 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { observer } from 'mobx-react'; import injectSheet from 'react-jss'; -import { defineMessages, intlShape } from 'react-intl'; +import { defineMessages, FormattedHTMLMessage, intlShape } from 'react-intl'; import { H1, Icon } from '@meetfranz/ui'; +import { Button } from '@meetfranz/forms/lib'; import ReactTooltip from 'react-tooltip'; import WorkspaceDrawerItem from './WorkspaceDrawerItem'; @@ -24,6 +25,14 @@ const messages = defineMessages({ id: 'workspaceDrawer.addWorkspaceTooltip', defaultMessage: '!!!Add workspace', }, + workspaceFeatureInfo: { + id: 'workspaceDrawer.workspaceFeatureInfo', + defaultMessage: '!!!Info about workspace feature', + }, + premiumCtaButtonLabel: { + id: 'workspaceDrawer.premiumCtaButtonLabel', + defaultMessage: '!!!Create your first workspace', + }, }); const styles = theme => ({ @@ -48,6 +57,19 @@ const styles = theme => ({ fill: theme.workspaceDrawerAddButtonHoverColor, }, }, + workspaces: { + height: 'auto', + }, + premiumAnnouncement: { + padding: '20px', + paddingTop: '0', + height: 'auto', + }, + premiumCtaButton: { + marginTop: '20px', + width: '100%', + color: 'white !important', + }, }); @injectSheet(styles) @observer @@ -84,7 +106,10 @@ class WorkspaceDrawer extends Component { {intl.formatMessage(messages.headline)} { + workspaceActions.openWorkspaceSettings(); + gaEvent(GA_CATEGORY_WORKSPACES, 'add', 'drawerHeadline'); + }} data-tip={`${intl.formatMessage(messages.addWorkspaceTooltip)}`} > -
- { - workspaceActions.deactivate(); - gaEvent(GA_CATEGORY_WORKSPACES, 'switch', 'drawer'); - }} - services={getServicesForWorkspace(null)} - isActive={actualWorkspace == null} - /> - {workspaces.map(workspace => ( + {workspaceStore.isPremiumUpgradeRequired ? ( +
+ +
+ ) : ( +
{ - workspaceActions.activate({ workspace }); + workspaceActions.deactivate(); gaEvent(GA_CATEGORY_WORKSPACES, 'switch', 'drawer'); }} - services={getServicesForWorkspace(workspace)} + services={getServicesForWorkspace(null)} + isActive={actualWorkspace == null} /> - ))} -
+ {workspaces.map(workspace => ( + { + workspaceActions.activate({ workspace }); + gaEvent(GA_CATEGORY_WORKSPACES, 'switch', 'drawer'); + }} + services={getServicesForWorkspace(workspace)} + /> + ))} +
+ )} ); diff --git a/src/features/workspaces/components/WorkspacesDashboard.js b/src/features/workspaces/components/WorkspacesDashboard.js index 1fad1f71d..b141dc960 100644 --- a/src/features/workspaces/components/WorkspacesDashboard.js +++ b/src/features/workspaces/components/WorkspacesDashboard.js @@ -51,7 +51,6 @@ const messages = defineMessages({ const styles = () => ({ createForm: { height: 'auto', - marginBottom: '20px', }, appear: { height: 'auto', @@ -60,6 +59,7 @@ const styles = () => ({ padding: '20px', backgroundColor: '#3498db', marginLeft: '-20px', + marginBottom: '20px', height: 'auto', }, }); @@ -128,6 +128,13 @@ class WorkspacesDashboard extends Component { )} + {workspaceStore.isPremiumUpgradeRequired && ( +
+

{intl.formatMessage(messages.workspaceFeatureHeadline)}

+

{intl.formatMessage(messages.workspaceFeatureInfo)}

+
+ )} + - {workspaceStore.isUpgradeToPremiumRequired && ( -
-

{intl.formatMessage(messages.workspaceFeatureHeadline)}

-

{intl.formatMessage(messages.workspaceFeatureInfo)}

-
- )} {getUserWorkspacesRequest.isExecuting ? ( ) : ( diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index 62bf3efb4..712945bdc 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -37,7 +37,7 @@ export default class WorkspacesStore extends FeatureStore { return getUserWorkspacesRequest.result || []; } - @computed get isUpgradeToPremiumRequired() { + @computed get isPremiumUpgradeRequired() { return this.isFeatureEnabled && !this.isFeatureActive; } diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 1747e1976..a8f4a2cbf 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -3326,39 +3326,65 @@ "defaultMessage": "!!!Workspaces", "end": { "column": 3, - "line": 18 + "line": 19 }, "file": "src/features/workspaces/components/WorkspaceDrawer.js", "id": "workspaceDrawer.headline", "start": { "column": 12, - "line": 15 + "line": 16 } }, { "defaultMessage": "!!!All services", "end": { "column": 3, - "line": 22 + "line": 23 }, "file": "src/features/workspaces/components/WorkspaceDrawer.js", "id": "workspaceDrawer.allServices", "start": { "column": 15, - "line": 19 + "line": 20 } }, { "defaultMessage": "!!!Add workspace", "end": { "column": 3, - "line": 26 + "line": 27 }, "file": "src/features/workspaces/components/WorkspaceDrawer.js", "id": "workspaceDrawer.addWorkspaceTooltip", "start": { "column": 23, - "line": 23 + "line": 24 + } + }, + { + "defaultMessage": "!!!Info about workspace feature", + "end": { + "column": 3, + "line": 31 + }, + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "id": "workspaceDrawer.workspaceFeatureInfo", + "start": { + "column": 24, + "line": 28 + } + }, + { + "defaultMessage": "!!!Create your first workspace", + "end": { + "column": 3, + "line": 35 + }, + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "id": "workspaceDrawer.premiumCtaButton", + "start": { + "column": 20, + "line": 32 } } ], diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 987262c35..981946d00 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -310,5 +310,7 @@ "workspaceDrawer.allServices": "All services", "workspaceDrawer.headline": "Workspaces", "workspaceDrawer.item.noServicesAddedYet": "No services added yet", + "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace", + "workspaceDrawer.workspaceFeatureInfo": "

Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

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.

", "workspaces.switchingIndicator.switchingTo": "Switching to" -} \ No newline at end of file +} diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json index 7026708e2..acd304253 100644 --- a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json +++ b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json @@ -4,11 +4,11 @@ "defaultMessage": "!!!Workspaces", "file": "src/features/workspaces/components/WorkspaceDrawer.js", "start": { - "line": 15, + "line": 16, "column": 12 }, "end": { - "line": 18, + "line": 19, "column": 3 } }, @@ -17,11 +17,11 @@ "defaultMessage": "!!!All services", "file": "src/features/workspaces/components/WorkspaceDrawer.js", "start": { - "line": 19, + "line": 20, "column": 15 }, "end": { - "line": 22, + "line": 23, "column": 3 } }, @@ -30,11 +30,37 @@ "defaultMessage": "!!!Add workspace", "file": "src/features/workspaces/components/WorkspaceDrawer.js", "start": { - "line": 23, + "line": 24, "column": 23 }, "end": { - "line": 26, + "line": 27, + "column": 3 + } + }, + { + "id": "workspaceDrawer.workspaceFeatureInfo", + "defaultMessage": "!!!Info about workspace feature", + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "start": { + "line": 28, + "column": 24 + }, + "end": { + "line": 31, + "column": 3 + } + }, + { + "id": "workspaceDrawer.premiumCtaButtonLabel", + "defaultMessage": "!!!Create your first workspace", + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "start": { + "line": 32, + "column": 25 + }, + "end": { + "line": 35, "column": 3 } } -- cgit v1.2.3-54-g00ecf From 6b38abc9011648a1f54b1ef3e3fb29d13750750c Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Wed, 3 Apr 2019 16:59:24 +0200 Subject: add workspace premium badge in settings nav --- .../settings/navigation/SettingsNavigation.js | 9 +++++- src/i18n/locales/defaultMessages.json | 32 +++++++++++----------- src/i18n/locales/en-US.json | 2 +- .../settings/navigation/SettingsNavigation.json | 28 +++++++++---------- src/stores/FeaturesStore.js | 7 ++++- src/styles/settings.scss | 10 +++++++ 6 files changed, 55 insertions(+), 33 deletions(-) diff --git a/src/components/settings/navigation/SettingsNavigation.js b/src/components/settings/navigation/SettingsNavigation.js index dc3c1d6f1..945285f5a 100644 --- a/src/components/settings/navigation/SettingsNavigation.js +++ b/src/components/settings/navigation/SettingsNavigation.js @@ -2,6 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { defineMessages, intlShape } from 'react-intl'; import { inject, observer } from 'mobx-react'; +import { Icon } from '@meetfranz/ui'; import Link from '../../ui/Link'; import { workspaceStore } from '../../../features/workspaces'; @@ -77,7 +78,13 @@ export default @inject('stores') @observer class SettingsNavigation extends Comp > {intl.formatMessage(messages.yourWorkspaces)} {' '} - {workspaceCount} + {workspaceStore.isPremiumUpgradeRequired ? ( + + + + ) : ( + {workspaceCount} + )} ) : null} Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

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.

", "workspaces.switchingIndicator.switchingTo": "Switching to" -} +} \ No newline at end of file diff --git a/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json index 96a42aa80..de78a71cf 100644 --- a/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json +++ b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json @@ -4,11 +4,11 @@ "defaultMessage": "!!!Available services", "file": "src/components/settings/navigation/SettingsNavigation.js", "start": { - "line": 10, + "line": 11, "column": 21 }, "end": { - "line": 13, + "line": 14, "column": 3 } }, @@ -17,11 +17,11 @@ "defaultMessage": "!!!Your services", "file": "src/components/settings/navigation/SettingsNavigation.js", "start": { - "line": 14, + "line": 15, "column": 16 }, "end": { - "line": 17, + "line": 18, "column": 3 } }, @@ -30,11 +30,11 @@ "defaultMessage": "!!!Your workspaces", "file": "src/components/settings/navigation/SettingsNavigation.js", "start": { - "line": 18, + "line": 19, "column": 18 }, "end": { - "line": 21, + "line": 22, "column": 3 } }, @@ -43,11 +43,11 @@ "defaultMessage": "!!!Account", "file": "src/components/settings/navigation/SettingsNavigation.js", "start": { - "line": 22, + "line": 23, "column": 11 }, "end": { - "line": 25, + "line": 26, "column": 3 } }, @@ -56,11 +56,11 @@ "defaultMessage": "!!!Settings", "file": "src/components/settings/navigation/SettingsNavigation.js", "start": { - "line": 26, + "line": 27, "column": 12 }, "end": { - "line": 29, + "line": 30, "column": 3 } }, @@ -69,11 +69,11 @@ "defaultMessage": "!!!Invite Friends", "file": "src/components/settings/navigation/SettingsNavigation.js", "start": { - "line": 30, + "line": 31, "column": 17 }, "end": { - "line": 33, + "line": 34, "column": 3 } }, @@ -82,11 +82,11 @@ "defaultMessage": "!!!Logout", "file": "src/components/settings/navigation/SettingsNavigation.js", "start": { - "line": 34, + "line": 35, "column": 10 }, "end": { - "line": 37, + "line": 38, "column": 3 } } diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js index 52e38ad96..8fe576813 100644 --- a/src/stores/FeaturesStore.js +++ b/src/stores/FeaturesStore.js @@ -1,4 +1,9 @@ -import { computed, observable, reaction, runInAction } from 'mobx'; +import { + computed, + observable, + reaction, + runInAction, +} from 'mobx'; import Store from './lib/Store'; import CachedRequest from './lib/CachedRequest'; diff --git a/src/styles/settings.scss b/src/styles/settings.scss index 9fde9a7bf..d97d4ac2c 100644 --- a/src/styles/settings.scss +++ b/src/styles/settings.scss @@ -85,6 +85,11 @@ .badge { background: $dark-theme-gray-lighter; color: $dark-theme-gray-smoke; + + &.badge--pro { + background: $theme-brand-primary; + padding: 4px 6px 3px 7px; + } } &:hover { @@ -93,6 +98,11 @@ .badge { background: $dark-theme-gray-lighter; color: $dark-theme-gray-smoke; + + &.badge--pro { + background: $theme-brand-primary; + padding: 4px 6px 3px 7px; + } } } -- cgit v1.2.3-54-g00ecf From 4e5726914a0c32fc445b2aae364baf0d006024a8 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Wed, 3 Apr 2019 17:17:54 +0200 Subject: fix premium workspace badge in settings menu for light theme --- src/components/settings/navigation/SettingsNavigation.js | 2 +- src/i18n/locales/defaultMessages.json | 2 +- src/i18n/locales/en-US.json | 2 +- src/i18n/messages/src/features/shareFranz/Component.json | 2 +- src/styles/settings.scss | 13 ++++++++++++- 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/components/settings/navigation/SettingsNavigation.js b/src/components/settings/navigation/SettingsNavigation.js index 945285f5a..1c51d50d6 100644 --- a/src/components/settings/navigation/SettingsNavigation.js +++ b/src/components/settings/navigation/SettingsNavigation.js @@ -80,7 +80,7 @@ export default @inject('stores') @observer class SettingsNavigation extends Comp {' '} {workspaceStore.isPremiumUpgradeRequired ? ( - + ) : ( {workspaceCount} diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 5e3988781..500053377 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -3204,7 +3204,7 @@ } }, { - "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @MeetFranz", + "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger", "end": { "column": 3, "line": 42 diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index c36801d4a..9770ff0d5 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -313,4 +313,4 @@ "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace", "workspaceDrawer.workspaceFeatureInfo": "

Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

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.

", "workspaces.switchingIndicator.switchingTo": "Switching to" -} +} \ No newline at end of file diff --git a/src/i18n/messages/src/features/shareFranz/Component.json b/src/i18n/messages/src/features/shareFranz/Component.json index 0fec9db64..34a43d5a0 100644 --- a/src/i18n/messages/src/features/shareFranz/Component.json +++ b/src/i18n/messages/src/features/shareFranz/Component.json @@ -79,7 +79,7 @@ }, { "id": "feature.shareFranz.shareText.twitter", - "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @MeetFranz", + "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger", "file": "src/features/shareFranz/Component.js", "start": { "line": 39, diff --git a/src/styles/settings.scss b/src/styles/settings.scss index d97d4ac2c..b4f013cad 100644 --- a/src/styles/settings.scss +++ b/src/styles/settings.scss @@ -433,10 +433,21 @@ text-decoration: none; transition: background $theme-transition-time, color $theme-transition-time; + .badge--pro { + background: $theme-brand-primary !important; + padding: 4px 6px 3px 7px; + + .badge-icon-pro { + fill: white; + } + } + &:hover { background: darken($theme-gray-lightest, 5%); - .badge { background: #FFF; } + .badge { + background: #FFF; + } } &.is-active { -- cgit v1.2.3-54-g00ecf From 8cc877e8ee3f0c6587a5aebdca6b4d07114e2e86 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Wed, 3 Apr 2019 17:26:45 +0200 Subject: fix active workspaces settings premium badge in light theme --- src/features/workspaces/components/WorkspacesDashboard.js | 1 + src/styles/settings.scss | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/src/features/workspaces/components/WorkspacesDashboard.js b/src/features/workspaces/components/WorkspacesDashboard.js index b141dc960..a0a34c778 100644 --- a/src/features/workspaces/components/WorkspacesDashboard.js +++ b/src/features/workspaces/components/WorkspacesDashboard.js @@ -61,6 +61,7 @@ const styles = () => ({ marginLeft: '-20px', marginBottom: '20px', height: 'auto', + color: 'white', }, }); diff --git a/src/styles/settings.scss b/src/styles/settings.scss index b4f013cad..6340f2951 100644 --- a/src/styles/settings.scss +++ b/src/styles/settings.scss @@ -454,6 +454,13 @@ background: $theme-brand-primary; color: #FFF; + .badge--pro { + background: white !important; + .badge-icon-pro { + fill: $theme-brand-primary; + } + } + .badge { background: #FFF; color: $theme-brand-primary; -- cgit v1.2.3-54-g00ecf From 3abf170d41726e73580716c11956892280665d4c Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Wed, 3 Apr 2019 17:27:10 +0200 Subject: give upgrade account button a bit more padding --- src/components/ui/PremiumFeatureContainer/styles.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ui/PremiumFeatureContainer/styles.js b/src/components/ui/PremiumFeatureContainer/styles.js index 615ed0a79..41881e044 100644 --- a/src/components/ui/PremiumFeatureContainer/styles.js +++ b/src/components/ui/PremiumFeatureContainer/styles.js @@ -20,7 +20,7 @@ export default theme => ({ color: theme.colorSubscriptionContainerActionButtonColor, 'margin-left': 'auto', 'border-radius': theme.borderRadiusSmall, - padding: [2, 4], + padding: [4, 8], 'font-size': 12, pointerEvents: 'initial', }, -- cgit v1.2.3-54-g00ecf From 07d10ad573d36d460acabe282d6020487e95c090 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Wed, 3 Apr 2019 17:53:50 +0200 Subject: add open last used workspace logic --- src/features/workspaces/api.js | 11 +++++++++++ src/features/workspaces/store.js | 40 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/features/workspaces/api.js b/src/features/workspaces/api.js index 0ec20c9ea..0a3e2bfa4 100644 --- a/src/features/workspaces/api.js +++ b/src/features/workspaces/api.js @@ -1,4 +1,5 @@ import { pick } from 'lodash'; +import localStorage from 'mobx-localstorage'; import { sendAuthRequest } from '../../api/utils/auth'; import { API, API_VERSION } from '../../environment'; import Request from '../../stores/lib/Request'; @@ -51,12 +52,22 @@ export const workspaceApi = { if (!result.ok) throw result; return new Workspace(await result.json()); }, + + getWorkspaceSettings: async () => ( + localStorage.getItem('workspaces') || {} + ), + + setWorkspaceSettings: async settings => ( + localStorage.setItem('workspaces', settings) + ), }; export const getUserWorkspacesRequest = new Request(workspaceApi, 'getUserWorkspaces'); export const createWorkspaceRequest = new Request(workspaceApi, 'createWorkspace'); export const deleteWorkspaceRequest = new Request(workspaceApi, 'deleteWorkspace'); export const updateWorkspaceRequest = new Request(workspaceApi, 'updateWorkspace'); +export const getWorkspaceSettingsRequest = new Request(workspaceApi, 'getWorkspaceSettings'); +export const setWorkspaceSettingsRequest = new Request(workspaceApi, 'setWorkspaceSettings'); export const resetApiRequests = () => { getUserWorkspacesRequest.reset(); diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index 712945bdc..2abb91c22 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -9,7 +9,7 @@ import { FeatureStore } from '../utils/FeatureStore'; import { createWorkspaceRequest, deleteWorkspaceRequest, - getUserWorkspacesRequest, + getUserWorkspacesRequest, getWorkspaceSettingsRequest, setWorkspaceSettingsRequest, updateWorkspaceRequest, } from './api'; @@ -37,6 +37,14 @@ export default class WorkspacesStore extends FeatureStore { return getUserWorkspacesRequest.result || []; } + @computed get settings() { + return getWorkspaceSettingsRequest.result; + } + + @computed get userHasWorkspaces() { + return getUserWorkspacesRequest.wasExecuted && this.workspaces.length > 0; + } + @computed get isPremiumUpgradeRequired() { return this.isFeatureEnabled && !this.isFeatureActive; } @@ -62,9 +70,11 @@ export default class WorkspacesStore extends FeatureStore { this._setActiveServiceOnWorkspaceSwitchReaction, this._setFeatureEnabledReaction, this._setIsPremiumFeatureReaction, + this._activateLastUsedWorkspaceReaction, ]); getUserWorkspacesRequest.execute(); + getWorkspaceSettingsRequest.execute(); this.isFeatureActive = true; } @@ -94,6 +104,13 @@ export default class WorkspacesStore extends FeatureStore { _getWorkspaceById = id => this.workspaces.find(w => w.id === id); + _updateSettings = (changes) => { + setWorkspaceSettingsRequest.execute({ + ...this.settings, + ...changes, + }); + }; + // Actions @action _edit = ({ workspace }) => { @@ -137,7 +154,10 @@ export default class WorkspacesStore extends FeatureStore { this.isSwitchingWorkspace = true; this.nextWorkspace = workspace; // Delay switching to next workspace so that the services loading does not drag down UI - setTimeout(() => { this.activeWorkspace = workspace; }, 100); + setTimeout(() => { + this.activeWorkspace = workspace; + this._updateSettings({ lastActiveWorkspace: workspace.id }); + }, 100); // Indicate that we are done switching to the next workspace setTimeout(() => { this.isSwitchingWorkspace = false; @@ -149,8 +169,12 @@ export default class WorkspacesStore extends FeatureStore { // Indicate that we are switching to default workspace this.isSwitchingWorkspace = true; this.nextWorkspace = null; + this._updateSettings({ lastActiveWorkspace: null }); + getWorkspaceSettingsRequest.execute(); // Delay switching to next workspace so that the services loading does not drag down UI - setTimeout(() => { this.activeWorkspace = null; }, 100); + setTimeout(() => { + this.activeWorkspace = null; + }, 100); // Indicate that we are done switching to the default workspace setTimeout(() => { this.isSwitchingWorkspace = false; }, 1000); }; @@ -195,4 +219,14 @@ export default class WorkspacesStore extends FeatureStore { } } }; + + _activateLastUsedWorkspaceReaction = () => { + if (!this.activeWorkspace && this.userHasWorkspaces) { + const { lastActiveWorkspace } = this.settings; + if (lastActiveWorkspace) { + const workspace = this._getWorkspaceById(lastActiveWorkspace); + if (workspace) this._setActiveWorkspace({ workspace }); + } + } + }; } -- cgit v1.2.3-54-g00ecf From 913b9e8614be3ae1e904423311d3adf55a210e5d Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Thu, 4 Apr 2019 14:02:34 +0200 Subject: use mobx-localstorage directly in the store --- src/features/workspaces/api.js | 10 ---------- src/features/workspaces/store.js | 9 ++++----- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/src/features/workspaces/api.js b/src/features/workspaces/api.js index 0a3e2bfa4..356e48cdb 100644 --- a/src/features/workspaces/api.js +++ b/src/features/workspaces/api.js @@ -52,22 +52,12 @@ export const workspaceApi = { if (!result.ok) throw result; return new Workspace(await result.json()); }, - - getWorkspaceSettings: async () => ( - localStorage.getItem('workspaces') || {} - ), - - setWorkspaceSettings: async settings => ( - localStorage.setItem('workspaces', settings) - ), }; export const getUserWorkspacesRequest = new Request(workspaceApi, 'getUserWorkspaces'); export const createWorkspaceRequest = new Request(workspaceApi, 'createWorkspace'); export const deleteWorkspaceRequest = new Request(workspaceApi, 'deleteWorkspace'); export const updateWorkspaceRequest = new Request(workspaceApi, 'updateWorkspace'); -export const getWorkspaceSettingsRequest = new Request(workspaceApi, 'getWorkspaceSettings'); -export const setWorkspaceSettingsRequest = new Request(workspaceApi, 'setWorkspaceSettings'); export const resetApiRequests = () => { getUserWorkspacesRequest.reset(); diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index 2abb91c22..4d65712a7 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -3,13 +3,14 @@ import { observable, action, } from 'mobx'; +import localStorage from 'mobx-localstorage'; import { matchRoute } from '../../helpers/routing-helpers'; import { workspaceActions } from './actions'; import { FeatureStore } from '../utils/FeatureStore'; import { createWorkspaceRequest, deleteWorkspaceRequest, - getUserWorkspacesRequest, getWorkspaceSettingsRequest, setWorkspaceSettingsRequest, + getUserWorkspacesRequest, updateWorkspaceRequest, } from './api'; @@ -38,7 +39,7 @@ export default class WorkspacesStore extends FeatureStore { } @computed get settings() { - return getWorkspaceSettingsRequest.result; + return localStorage.getItem('workspaces') || {}; } @computed get userHasWorkspaces() { @@ -74,7 +75,6 @@ export default class WorkspacesStore extends FeatureStore { ]); getUserWorkspacesRequest.execute(); - getWorkspaceSettingsRequest.execute(); this.isFeatureActive = true; } @@ -105,7 +105,7 @@ export default class WorkspacesStore extends FeatureStore { _getWorkspaceById = id => this.workspaces.find(w => w.id === id); _updateSettings = (changes) => { - setWorkspaceSettingsRequest.execute({ + localStorage.setItem('workspaces', { ...this.settings, ...changes, }); @@ -170,7 +170,6 @@ export default class WorkspacesStore extends FeatureStore { this.isSwitchingWorkspace = true; this.nextWorkspace = null; this._updateSettings({ lastActiveWorkspace: null }); - getWorkspaceSettingsRequest.execute(); // Delay switching to next workspace so that the services loading does not drag down UI setTimeout(() => { this.activeWorkspace = null; -- cgit v1.2.3-54-g00ecf From 20d96420efc87560678aa233876f23970df4efdb Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Thu, 4 Apr 2019 15:58:20 +0200 Subject: fix wrong workspace tooltip shortcut in sidebar --- src/components/layout/Sidebar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/layout/Sidebar.js b/src/components/layout/Sidebar.js index 327f76392..36c1f2e39 100644 --- a/src/components/layout/Sidebar.js +++ b/src/components/layout/Sidebar.js @@ -99,7 +99,7 @@ export default @observer class Sidebar extends Component { gaEvent(GA_CATEGORY_WORKSPACES, 'toggleDrawer', 'sidebar'); }} className={`sidebar__button sidebar__button--workspaces ${isWorkspaceDrawerOpen ? 'is-active' : ''}`} - data-tip={`${intl.formatMessage(workspaceToggleMessage)} (${ctrlKey}+Shift+D)`} + data-tip={`${intl.formatMessage(workspaceToggleMessage)} (${ctrlKey}+D)`} > -- cgit v1.2.3-54-g00ecf From 2243edb4aa8d837332e9727217983ec4fe334b58 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Thu, 4 Apr 2019 15:59:09 +0200 Subject: fix bug in workspace feature initialization --- src/features/workspaces/index.js | 8 ++------ src/features/workspaces/store.js | 13 +++++++------ 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/features/workspaces/index.js b/src/features/workspaces/index.js index 524a83e3c..fb5135743 100644 --- a/src/features/workspaces/index.js +++ b/src/features/workspaces/index.js @@ -10,15 +10,11 @@ export const workspaceStore = new WorkspacesStore(); export default function initWorkspaces(stores, actions) { stores.workspaces = workspaceStore; - const { features, user } = stores; + const { features } = stores; // Toggle workspace feature reaction( - () => ( - features.features.isWorkspaceEnabled && ( - !features.features.isWorkspacePremiumFeature || user.data.isPremium - ) - ), + () => features.features.isWorkspaceEnabled, (isEnabled) => { if (isEnabled && !workspaceStore.isFeatureActive) { debug('Initializing `workspaces` feature'); diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index 4d65712a7..7bd969be0 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -19,9 +19,11 @@ const debug = require('debug')('Franz:feature:workspaces:store'); export default class WorkspacesStore extends FeatureStore { @observable isFeatureEnabled = false; + @observable isFeatureActive = false; + @observable isPremiumFeature = true; - @observable isFeatureActive = false; + @observable isPremiumUpgradeRequired = true; @observable activeWorkspace = null; @@ -46,10 +48,6 @@ export default class WorkspacesStore extends FeatureStore { return getUserWorkspacesRequest.wasExecuted && this.workspaces.length > 0; } - @computed get isPremiumUpgradeRequired() { - return this.isFeatureEnabled && !this.isFeatureActive; - } - start(stores, actions) { debug('WorkspacesStore::start'); this.stores = stores; @@ -194,8 +192,11 @@ export default class WorkspacesStore extends FeatureStore { }; _setIsPremiumFeatureReaction = () => { - const { isWorkspacePremiumFeature } = this.stores.features.features; + const { features, user } = this.stores; + const { isPremium } = user.data; + const { isWorkspacePremiumFeature } = features.features; this.isPremiumFeature = isWorkspacePremiumFeature; + this.isPremiumUpgradeRequired = isWorkspacePremiumFeature && !isPremium; }; _setWorkspaceBeingEditedReaction = () => { -- cgit v1.2.3-54-g00ecf From 5ffd0230dc130bf20a0059aab3dd038683df93de Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Thu, 4 Apr 2019 15:59:29 +0200 Subject: show workspaces intro in drawer when user has none yet --- src/features/workspaces/api.js | 1 - src/features/workspaces/components/WorkspaceDrawer.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/features/workspaces/api.js b/src/features/workspaces/api.js index 356e48cdb..0ec20c9ea 100644 --- a/src/features/workspaces/api.js +++ b/src/features/workspaces/api.js @@ -1,5 +1,4 @@ import { pick } from 'lodash'; -import localStorage from 'mobx-localstorage'; import { sendAuthRequest } from '../../api/utils/auth'; import { API, API_VERSION } from '../../environment'; import Request from '../../stores/lib/Request'; diff --git a/src/features/workspaces/components/WorkspaceDrawer.js b/src/features/workspaces/components/WorkspaceDrawer.js index 6eacafa68..3602da792 100644 --- a/src/features/workspaces/components/WorkspaceDrawer.js +++ b/src/features/workspaces/components/WorkspaceDrawer.js @@ -119,7 +119,7 @@ class WorkspaceDrawer extends Component { /> - {workspaceStore.isPremiumUpgradeRequired ? ( + {!workspaceStore.userHasWorkspaces ? (
) : (
diff --git a/src/features/workspaces/components/WorkspacesDashboard.js b/src/features/workspaces/components/WorkspacesDashboard.js index a0a34c778..18813e267 100644 --- a/src/features/workspaces/components/WorkspacesDashboard.js +++ b/src/features/workspaces/components/WorkspacesDashboard.js @@ -147,38 +147,38 @@ class WorkspacesDashboard extends Component { onSubmit={onCreateWorkspaceSubmit} />
+ {getUserWorkspacesRequest.isExecuting ? ( + + ) : ( + + {/* ===== Workspace could not be loaded error ===== */} + {getUserWorkspacesRequest.error ? ( + + {intl.formatMessage(messages.workspacesRequestFailed)} + + ) : ( +
+ {/* ===== Workspaces list ===== */} + + {workspaces.map(workspace => ( + onWorkspaceClick(w)} + /> + ))} + +
+ )} +
+ )} - {getUserWorkspacesRequest.isExecuting ? ( - - ) : ( - - {/* ===== Workspace could not be loaded error ===== */} - {getUserWorkspacesRequest.error ? ( - - {intl.formatMessage(messages.workspacesRequestFailed)} - - ) : ( - - {/* ===== Workspaces list ===== */} - - {workspaces.map(workspace => ( - onWorkspaceClick(w)} - /> - ))} - -
- )} -
- )}
); diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 500053377..ec519bad5 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -3386,6 +3386,19 @@ "column": 25, "line": 32 } + }, + { + "defaultMessage": "!!!Reactivate your premium account!", + "end": { + "column": 3, + "line": 39 + }, + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "id": "workspaceDrawer.reactivatePremiumAccountLabel", + "start": { + "column": 28, + "line": 36 + } } ], "path": "src/features/workspaces/components/WorkspaceDrawer.json" diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 9770ff0d5..ed5d5e345 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -311,6 +311,7 @@ "workspaceDrawer.headline": "Workspaces", "workspaceDrawer.item.noServicesAddedYet": "No services added yet", "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace", + "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account", "workspaceDrawer.workspaceFeatureInfo": "

Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

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.

", "workspaces.switchingIndicator.switchingTo": "Switching to" -} \ No newline at end of file +} diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json index acd304253..37bae262a 100644 --- a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json +++ b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json @@ -63,5 +63,18 @@ "line": 35, "column": 3 } + }, + { + "id": "workspaceDrawer.reactivatePremiumAccountLabel", + "defaultMessage": "!!!Reactivate premium account", + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "start": { + "line": 36, + "column": 28 + }, + "end": { + "line": 39, + "column": 3 + } } ] \ No newline at end of file -- cgit v1.2.3-54-g00ecf From 387c73b2e6463238dc1c9c9ccde3c0e16ff33121 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Thu, 4 Apr 2019 16:18:33 +0200 Subject: border radius for premium intro in workspace settings --- src/features/workspaces/components/WorkspacesDashboard.js | 3 ++- src/i18n/locales/defaultMessages.json | 2 +- src/i18n/locales/en-US.json | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/features/workspaces/components/WorkspacesDashboard.js b/src/features/workspaces/components/WorkspacesDashboard.js index 18813e267..a8b3b376c 100644 --- a/src/features/workspaces/components/WorkspacesDashboard.js +++ b/src/features/workspaces/components/WorkspacesDashboard.js @@ -48,7 +48,7 @@ const messages = defineMessages({ }, }); -const styles = () => ({ +const styles = (theme) => ({ createForm: { height: 'auto', }, @@ -62,6 +62,7 @@ const styles = () => ({ marginBottom: '20px', height: 'auto', color: 'white', + borderRadius: theme.borderRadius, }, }); diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index ec519bad5..e5c1ea259 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -3388,7 +3388,7 @@ } }, { - "defaultMessage": "!!!Reactivate your premium account!", + "defaultMessage": "!!!Reactivate premium account", "end": { "column": 3, "line": 39 diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index ed5d5e345..c694b8729 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -314,4 +314,4 @@ "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account", "workspaceDrawer.workspaceFeatureInfo": "

Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

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.

", "workspaces.switchingIndicator.switchingTo": "Switching to" -} +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf From a4e4f18a17b502cd4fa16aafb57ee365084b180e Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Thu, 4 Apr 2019 16:30:33 +0200 Subject: close workspace drawer after clicking on a workspace --- src/features/workspaces/components/WorkspaceDrawer.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/features/workspaces/components/WorkspaceDrawer.js b/src/features/workspaces/components/WorkspaceDrawer.js index baf59a1fb..f35faf691 100644 --- a/src/features/workspaces/components/WorkspaceDrawer.js +++ b/src/features/workspaces/components/WorkspaceDrawer.js @@ -158,6 +158,7 @@ class WorkspaceDrawer extends Component { name={intl.formatMessage(messages.allServices)} onClick={() => { workspaceActions.deactivate(); + workspaceActions.toggleWorkspaceDrawer(); gaEvent(GA_CATEGORY_WORKSPACES, 'switch', 'drawer'); }} services={getServicesForWorkspace(null)} @@ -169,7 +170,9 @@ class WorkspaceDrawer extends Component { name={workspace.name} isActive={actualWorkspace === workspace} onClick={() => { + if (actualWorkspace === workspace) return; workspaceActions.activate({ workspace }); + workspaceActions.toggleWorkspaceDrawer(); gaEvent(GA_CATEGORY_WORKSPACES, 'switch', 'drawer'); }} services={getServicesForWorkspace(workspace)} -- cgit v1.2.3-54-g00ecf From 4346b0c0871c856d27c9ba088dcaf0e084552b12 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Thu, 4 Apr 2019 16:46:22 +0200 Subject: add hover effect for drawer workspace items --- packages/theme/src/themes/dark/index.ts | 1 + packages/theme/src/themes/default/index.ts | 1 + src/features/workspaces/components/WorkspaceDrawerItem.js | 6 ++++++ 3 files changed, 8 insertions(+) diff --git a/packages/theme/src/themes/dark/index.ts b/packages/theme/src/themes/dark/index.ts index cb7ffc1cf..1c0ede8e5 100644 --- a/packages/theme/src/themes/dark/index.ts +++ b/packages/theme/src/themes/dark/index.ts @@ -69,6 +69,7 @@ export const workspaceDrawerBackground = color(colorBackground).lighten(0.3).hex export const workspaceDrawerAddButtonColor = legacyStyles.darkThemeGrayLighter; export const workspaceDrawerAddButtonHoverColor = legacyStyles.darkThemeGraySmoke; export const workspaceDrawerItemBorder = color(workspaceDrawerBackground).lighten(0.2).hex(); +export const workspaceDrawerItemHoverBackground = color(workspaceDrawerBackground).lighten(0.2).hex(); export const workspaceDrawerItemActiveBackground = defaultStyles.brandPrimary; export const workspaceDrawerItemNameColor = colorText; export const workspaceDrawerItemNameActiveColor = 'white'; diff --git a/packages/theme/src/themes/default/index.ts b/packages/theme/src/themes/default/index.ts index f2632ee20..718ccf485 100644 --- a/packages/theme/src/themes/default/index.ts +++ b/packages/theme/src/themes/default/index.ts @@ -149,6 +149,7 @@ export const workspaceDrawerPadding = 20; export const workspaceDrawerBackground = color(colorBackground).lighten(0.1).hex(); export const workspaceDrawerAddButtonColor = legacyStyles.themeGrayLight; export const workspaceDrawerAddButtonHoverColor = color(legacyStyles.themeGrayLight).lighten(0.1).hex(); +export const workspaceDrawerItemHoverBackground = color(workspaceDrawerBackground).darken(0.01).hex(); export const workspaceDrawerItemActiveBackground = legacyStyles.themeGrayLightest; export const workspaceDrawerItemBorder = color(workspaceDrawerBackground).darken(0.05).hex(); export const workspaceDrawerItemNameColor = colorText; diff --git a/src/features/workspaces/components/WorkspaceDrawerItem.js b/src/features/workspaces/components/WorkspaceDrawerItem.js index 1e28ebea6..17a7882b8 100644 --- a/src/features/workspaces/components/WorkspaceDrawerItem.js +++ b/src/features/workspaces/components/WorkspaceDrawerItem.js @@ -20,9 +20,15 @@ const styles = theme => ({ '&:first-child': { borderTop: `1px solid ${theme.workspaceDrawerItemBorder}`, }, + '&:hover': { + backgroundColor: theme.workspaceDrawerItemHoverBackground, + }, }, isActiveItem: { backgroundColor: theme.workspaceDrawerItemActiveBackground, + '&:hover': { + backgroundColor: theme.workspaceDrawerItemActiveBackground, + }, }, name: { marginTop: '4px', -- cgit v1.2.3-54-g00ecf From 05d13dea31861df7366dfe40395c1b04462d02ce Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Fri, 5 Apr 2019 20:46:10 +0200 Subject: ensure drawer is open on workspace settings routes --- src/app.js | 5 +++-- src/features/workspaces/index.js | 5 +++++ src/features/workspaces/store.js | 26 ++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/app.js b/src/app.js index d3b540f62..fb9f1c6ab 100644 --- a/src/app.js +++ b/src/app.js @@ -41,6 +41,7 @@ import AuthLayoutContainer from './containers/auth/AuthLayoutContainer'; import SubscriptionPopupScreen from './containers/subscription/SubscriptionPopupScreen'; import WorkspacesScreen from './features/workspaces/containers/WorkspacesScreen'; import EditWorkspaceScreen from './features/workspaces/containers/EditWorkspaceScreen'; +import { WORKSPACES_ROUTES } from './features/workspaces'; // Add Polyfills smoothScroll.polyfill(); @@ -77,8 +78,8 @@ window.addEventListener('load', () => { - - + + diff --git a/src/features/workspaces/index.js b/src/features/workspaces/index.js index fb5135743..ad9023b8b 100644 --- a/src/features/workspaces/index.js +++ b/src/features/workspaces/index.js @@ -30,3 +30,8 @@ export default function initWorkspaces(stores, actions) { }, ); } + +export const WORKSPACES_ROUTES = { + ROOT: '/settings/workspaces', + EDIT: '/settings/workspaces/:action/:id', +}; diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index 7bd969be0..2e1764f99 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -13,6 +13,7 @@ import { getUserWorkspacesRequest, updateWorkspaceRequest, } from './api'; +import { WORKSPACES_ROUTES } from './index'; const debug = require('debug')('Franz:feature:workspaces:store'); @@ -70,6 +71,7 @@ export default class WorkspacesStore extends FeatureStore { this._setFeatureEnabledReaction, this._setIsPremiumFeatureReaction, this._activateLastUsedWorkspaceReaction, + this._openDrawerWithSettingsReaction, ]); getUserWorkspacesRequest.execute(); @@ -100,6 +102,10 @@ export default class WorkspacesStore extends FeatureStore { // ========== PRIVATE ========= // + _wasDrawerOpenBeforeSettingsRoute = null; + + _isSettingsRouteActive = null; + _getWorkspaceById = id => this.workspaces.find(w => w.id === id); _updateSettings = (changes) => { @@ -229,4 +235,24 @@ export default class WorkspacesStore extends FeatureStore { } } }; + + _openDrawerWithSettingsReaction = () => { + const { router } = this.stores; + const isWorkspaceSettingsRoute = router.location.pathname.includes(WORKSPACES_ROUTES.ROOT); + const isSwitchingToSettingsRoute = !this._isSettingsRouteActive && isWorkspaceSettingsRoute; + const isLeavingSettingsRoute = !isWorkspaceSettingsRoute && this._isSettingsRouteActive; + + if (isSwitchingToSettingsRoute) { + this._isSettingsRouteActive = true; + this._wasDrawerOpenBeforeSettingsRoute = this.isWorkspaceDrawerOpen; + if (!this._wasDrawerOpenBeforeSettingsRoute) { + workspaceActions.toggleWorkspaceDrawer(); + } + } else if (isLeavingSettingsRoute) { + this._isSettingsRouteActive = false; + if (!this._wasDrawerOpenBeforeSettingsRoute && this.isWorkspaceDrawerOpen) { + workspaceActions.toggleWorkspaceDrawer(); + } + } + }; } -- cgit v1.2.3-54-g00ecf From 7caccf36dd55a8c7ac9dcd5e154634607adf5ef6 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Fri, 5 Apr 2019 21:02:55 +0200 Subject: add small text label for adding new workspace to drawer --- .../workspaces/components/WorkspaceDrawer.js | 42 ++++++++++++++++++++-- src/i18n/locales/defaultMessages.json | 13 +++++++ src/i18n/locales/en-US.json | 1 + .../workspaces/components/WorkspaceDrawer.json | 13 +++++++ 4 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/features/workspaces/components/WorkspaceDrawer.js b/src/features/workspaces/components/WorkspaceDrawer.js index f35faf691..0befcc869 100644 --- a/src/features/workspaces/components/WorkspaceDrawer.js +++ b/src/features/workspaces/components/WorkspaceDrawer.js @@ -37,6 +37,10 @@ const messages = defineMessages({ id: 'workspaceDrawer.reactivatePremiumAccountLabel', defaultMessage: '!!!Reactivate premium account', }, + addNewWorkspaceLabel: { + id: 'workspaceDrawer.addNewWorkspaceLabel', + defaultMessage: '!!!add new workspace', + }, }); const styles = theme => ({ @@ -48,11 +52,11 @@ const styles = theme => ({ fontSize: '24px', marginTop: '38px', marginBottom: '25px', - marginLeft: `${theme.workspaceDrawerPadding}px`, + marginLeft: theme.workspaceDrawerPadding, }, addWorkspaceButton: { float: 'right', - marginRight: `${theme.workspaceDrawerPadding}px`, + marginRight: theme.workspaceDrawerPadding, marginTop: '2px', }, addWorkspaceButtonIcon: { @@ -74,6 +78,24 @@ const styles = theme => ({ width: '100%', color: 'white !important', }, + addNewWorkspaceLabel: { + height: 'auto', + color: theme.workspaceDrawerServicesColor, + marginTop: 20, + marginLeft: theme.workspaceDrawerPadding, + '& > span': { + fontSize: '13px', + marginLeft: 10, + position: 'relative', + top: -3, + }, + '&:hover': { + color: theme.workspaceDrawerAddButtonHoverColor, + '& > svg': { + fill: theme.workspaceDrawerAddButtonHoverColor, + }, + }, + }, }); @injectSheet(styles) @observer @@ -180,6 +202,22 @@ class WorkspaceDrawer extends Component { ))}
)} +
{ + workspaceActions.openWorkspaceSettings(); + gaEvent(GA_CATEGORY_WORKSPACES, 'add', 'drawerAddLabel'); + }} + > + + + {intl.formatMessage(messages.addNewWorkspaceLabel)} + +
); diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index e5c1ea259..05df4cbac 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -3399,6 +3399,19 @@ "column": 28, "line": 36 } + }, + { + "defaultMessage": "!!!add new workspace", + "end": { + "column": 3, + "line": 43 + }, + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "id": "workspaceDrawer.addNewWorkspaceLabel", + "start": { + "column": 24, + "line": 40 + } } ], "path": "src/features/workspaces/components/WorkspaceDrawer.json" diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index c694b8729..78dcd83d7 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -306,6 +306,7 @@ "validation.url": "{field} is not a valid URL", "welcome.loginButton": "Login to your account", "welcome.signupButton": "Create a free account", + "workspaceDrawer.addNewWorkspaceLabel": "add new workspace", "workspaceDrawer.addWorkspaceTooltip": "Add workspace", "workspaceDrawer.allServices": "All services", "workspaceDrawer.headline": "Workspaces", diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json index 37bae262a..9b0b80321 100644 --- a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json +++ b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json @@ -76,5 +76,18 @@ "line": 39, "column": 3 } + }, + { + "id": "workspaceDrawer.addNewWorkspaceLabel", + "defaultMessage": "!!!add new workspace", + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "start": { + "line": 40, + "column": 24 + }, + "end": { + "line": 43, + "column": 3 + } } ] \ No newline at end of file -- cgit v1.2.3-54-g00ecf From 1fa1e165b159adf390375787df2af9b33e5f5856 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Sat, 6 Apr 2019 10:05:16 +0200 Subject: make workspace settings list items taller --- packages/theme/src/themes/dark/index.ts | 6 +++++ packages/theme/src/themes/default/index.ts | 6 +++++ .../workspaces/components/WorkspaceItem.js | 31 ++++++++++++---------- 3 files changed, 29 insertions(+), 14 deletions(-) diff --git a/packages/theme/src/themes/dark/index.ts b/packages/theme/src/themes/dark/index.ts index 1c0ede8e5..a9d1e1b46 100644 --- a/packages/theme/src/themes/dark/index.ts +++ b/packages/theme/src/themes/dark/index.ts @@ -64,6 +64,12 @@ export const selectSearchColor = inputBackground; // Modal export const colorModalOverlayBackground = color(legacyStyles.darkThemeBlack).alpha(0.8).rgb().string(); +// Workspace settings +export const workspaceSettings = { + listItemBorderColor: legacyStyles.darkThemeGrayDarker, + listItemHoverBgColor: legacyStyles.darkThemeGrayDarker, +}; + // Workspace Drawer export const workspaceDrawerBackground = color(colorBackground).lighten(0.3).hex(); export const workspaceDrawerAddButtonColor = legacyStyles.darkThemeGrayLighter; diff --git a/packages/theme/src/themes/default/index.ts b/packages/theme/src/themes/default/index.ts index 718ccf485..e4c74a5c9 100644 --- a/packages/theme/src/themes/default/index.ts +++ b/packages/theme/src/themes/default/index.ts @@ -143,6 +143,12 @@ export const badgeBorderRadius = 50; // Modal export const colorModalOverlayBackground = color('#000').alpha(0.5).rgb().string(); +// Workspace settings +export const workspaceSettings = { + listItemBorderColor: legacyStyles.themeGrayLightest, + listItemHoverBgColor: legacyStyles.themeGrayLightest, +}; + // Workspace Drawer export const workspaceDrawerWidth = 300; export const workspaceDrawerPadding = 20; diff --git a/src/features/workspaces/components/WorkspaceItem.js b/src/features/workspaces/components/WorkspaceItem.js index b2c2a4830..a950a981a 100644 --- a/src/features/workspaces/components/WorkspaceItem.js +++ b/src/features/workspaces/components/WorkspaceItem.js @@ -2,14 +2,25 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { intlShape } from 'react-intl'; import { observer } from 'mobx-react'; -import classnames from 'classnames'; +import injectSheet from 'react-jss'; + import Workspace from '../models/Workspace'; -// const messages = defineMessages({}); +const styles = theme => ({ + row: { + height: 57, + borderBottom: `1px solid ${theme.workspaceSettings.listItemBorderColor}`, + '&:hover': { + background: theme.workspaceSettings.listItemHoverBgColor, + }, + }, + columnName: {}, +}); -@observer +@injectSheet(styles) @observer class WorkspaceItem extends Component { static propTypes = { + classes: PropTypes.object.isRequired, workspace: PropTypes.instanceOf(Workspace).isRequired, onItemClick: PropTypes.func.isRequired, }; @@ -19,19 +30,11 @@ class WorkspaceItem extends Component { }; render() { - const { workspace, onItemClick } = this.props; - // const { intl } = this.context; + const { classes, workspace, onItemClick } = this.props; return ( - - onItemClick(workspace)} - > + + onItemClick(workspace)}> {workspace.name} -- cgit v1.2.3-54-g00ecf From 625c3b0ab1ede0a7d54992e9a5f25bfd702e7952 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Sat, 6 Apr 2019 10:11:14 +0200 Subject: refactor workspace table css away from legacy styles --- .../workspaces/components/WorkspacesDashboard.js | 10 +++- .../workspaces/styles/workspaces-table.scss | 53 ---------------------- src/styles/main.scss | 3 -- 3 files changed, 8 insertions(+), 58 deletions(-) delete mode 100644 src/features/workspaces/styles/workspaces-table.scss diff --git a/src/features/workspaces/components/WorkspacesDashboard.js b/src/features/workspaces/components/WorkspacesDashboard.js index a8b3b376c..dd4381a15 100644 --- a/src/features/workspaces/components/WorkspacesDashboard.js +++ b/src/features/workspaces/components/WorkspacesDashboard.js @@ -48,7 +48,13 @@ const messages = defineMessages({ }, }); -const styles = (theme) => ({ +const styles = theme => ({ + table: { + width: '100%', + '& td': { + padding: '10px', + }, + }, createForm: { height: 'auto', }, @@ -164,7 +170,7 @@ class WorkspacesDashboard extends Component { {intl.formatMessage(messages.workspacesRequestFailed)} ) : ( - +
{/* ===== Workspaces list ===== */} {workspaces.map(workspace => ( diff --git a/src/features/workspaces/styles/workspaces-table.scss b/src/features/workspaces/styles/workspaces-table.scss deleted file mode 100644 index 6d0e7b4f5..000000000 --- a/src/features/workspaces/styles/workspaces-table.scss +++ /dev/null @@ -1,53 +0,0 @@ -@import '../../../styles/config'; - -.theme__dark .workspace-table { - .workspace-table__column-info .mdi { color: $dark-theme-gray-lightest; } - - .workspace-table__row { - border-bottom: 1px solid $dark-theme-gray-darker; - - &:hover { background: $dark-theme-gray-darker; } - &.workspace-table__row--disabled { color: $dark-theme-gray; } - } -} - -.workspace-table { - width: 100%; - - .workspace-table__toggle { - width: 60px; - - .franz-form__field { - margin-bottom: 0; - } - } - - .workspace-table__column-action { - width: 40px - } - - .workspace-table__column-info { - width: 40px; - - .mdi { - color: $theme-gray-light; - display: block; - font-size: 18px; - } - } - - .workspace-table__row { - border-bottom: 1px solid $theme-gray-lightest; - - &:hover { - cursor: initial; - background: $theme-gray-lightest; - } - - &.workspace-table__row--disabled { - color: $theme-gray-light; - } - } - - td { padding: 10px; } -} diff --git a/src/styles/main.scss b/src/styles/main.scss index 9ba7f5827..784a04d3d 100644 --- a/src/styles/main.scss +++ b/src/styles/main.scss @@ -31,9 +31,6 @@ $mdi-font-path: '../node_modules/mdi/fonts'; @import './invite.scss'; @import './title-bar.scss'; -// Workspaces legacy css -@import '../features/workspaces/styles/workspaces-table'; - // form @import './input.scss'; @import './radio.scss'; -- cgit v1.2.3-54-g00ecf From b3afb9f45d47ebc352b28eb106b22fffc2f17707 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Sun, 7 Apr 2019 19:50:40 +0200 Subject: render workspace service list like services + toggle --- packages/forms/src/input/index.tsx | 1 + packages/forms/src/input/styles.ts | 5 ++ packages/forms/src/label/styles.ts | 4 +- packages/forms/src/select/index.tsx | 6 ++ packages/forms/src/toggle/index.tsx | 4 +- packages/theme/src/themes/dark/index.ts | 52 ++++++++++++++++- packages/theme/src/themes/default/index.ts | 57 +++++++++++++++++- src/components/ui/ServiceIcon.js | 67 ++++++++++++++++++++++ .../workspaces/components/EditWorkspaceForm.js | 4 +- .../workspaces/components/ServiceListItem.js | 48 ---------------- .../workspaces/components/WorkspaceItem.js | 6 +- .../components/WorkspaceServiceListItem.js | 50 ++++++++++++++++ 12 files changed, 243 insertions(+), 61 deletions(-) create mode 100644 src/components/ui/ServiceIcon.js delete mode 100644 src/features/workspaces/components/ServiceListItem.js create mode 100644 src/features/workspaces/components/WorkspaceServiceListItem.js diff --git a/packages/forms/src/input/index.tsx b/packages/forms/src/input/index.tsx index f89c91be5..e410f8fef 100644 --- a/packages/forms/src/input/index.tsx +++ b/packages/forms/src/input/index.tsx @@ -131,6 +131,7 @@ class InputComponent extends Component { title={label} showLabel={showLabel} htmlFor={id} + className={classes.label} >
({ }); export default (theme: Theme) => ({ + label: { + '& > div': { + marginTop: 5, + } + }, disabled: { opacity: theme.inputDisabledOpacity, }, diff --git a/packages/forms/src/label/styles.ts b/packages/forms/src/label/styles.ts index f3998de04..c64c9b285 100644 --- a/packages/forms/src/label/styles.ts +++ b/packages/forms/src/label/styles.ts @@ -1,9 +1,7 @@ import { Theme } from '../../../theme/lib'; export default (theme: Theme) => ({ - content: { - marginTop: 5, - }, + content: {}, label: { color: theme.labelColor, fontSize: theme.uiFontSize, diff --git a/packages/forms/src/select/index.tsx b/packages/forms/src/select/index.tsx index 4a9e3c56e..cfbe91dda 100644 --- a/packages/forms/src/select/index.tsx +++ b/packages/forms/src/select/index.tsx @@ -56,6 +56,11 @@ const styles = (theme: Theme) => ({ textAlign: 'left', color: theme.selectColor, }, + label: { + '& > div': { + marginTop: 5, + } + }, popup: { opacity: 0, height: 0, @@ -334,6 +339,7 @@ class SelectComponent extends Component { title={label} showLabel={showLabel} htmlFor={id} + className={classes.label} >
({ }, toggleLabel: { display: 'flex', + alignItems: 'center', '& > span': { order: 1, marginLeft: 15, - marginTop: 2, }, }, }); diff --git a/packages/theme/src/themes/dark/index.ts b/packages/theme/src/themes/dark/index.ts index a9d1e1b46..73ffa7f5e 100644 --- a/packages/theme/src/themes/dark/index.ts +++ b/packages/theme/src/themes/dark/index.ts @@ -1,4 +1,5 @@ import color from 'color'; +import { merge, cloneDeep } from 'lodash'; import * as defaultStyles from '../default'; import * as legacyStyles from '../legacy'; @@ -64,11 +65,51 @@ export const selectSearchColor = inputBackground; // Modal export const colorModalOverlayBackground = color(legacyStyles.darkThemeBlack).alpha(0.8).rgb().string(); +// Services +export const services = merge({}, defaultStyles.services, { + listItems: { + borderColor: legacyStyles.darkThemeGrayDarker, + hoverBgColor: legacyStyles.darkThemeGrayDarker, + disabled: { + color: legacyStyles.darkThemeGray, + }, + }, +}); + +// Workspaces +const drawerBg = color(colorBackground).lighten(0.3).hex(); + +export const workspaces = merge({}, defaultStyles.workspaces, { + settings: { + listItems: cloneDeep(services.listItems), + }, + drawer: { + background: drawerBg, + addButton: { + color: legacyStyles.darkThemeGrayLighter, + hoverColor: legacyStyles.darkThemeGraySmoke, + }, + listItem: { + border: color(drawerBg).lighten(0.2).hex(), + hoverBackground: color(drawerBg).lighten(0.2).hex(), + activeBackground: defaultStyles.brandPrimary, + name: { + color: colorText, + activeColor: 'white', + }, + services: { + color: color(colorText).darken(0.5).hex(), + active: color(defaultStyles.brandPrimary).lighten(0.5).hex(), + }, + }, + }, +}); + // Workspace settings -export const workspaceSettings = { +export const workspaceSettings = merge({}, defaultStyles.workspaceSettings, { listItemBorderColor: legacyStyles.darkThemeGrayDarker, listItemHoverBgColor: legacyStyles.darkThemeGrayDarker, -}; +}); // Workspace Drawer export const workspaceDrawerBackground = color(colorBackground).lighten(0.3).hex(); @@ -81,3 +122,10 @@ export const workspaceDrawerItemNameColor = colorText; export const workspaceDrawerItemNameActiveColor = 'white'; export const workspaceDrawerServicesColor = color(colorText).darken(0.5).hex(); export const workspaceDrawerServicesActiveColor = color(defaultStyles.brandPrimary).lighten(0.5).hex(); + +// Service Icon +export const serviceIcon = merge({}, defaultStyles.serviceIcon, { + isCustom: { + border: `1px solid ${legacyStyles.darkThemeGrayDark}`, + }, +}); diff --git a/packages/theme/src/themes/default/index.ts b/packages/theme/src/themes/default/index.ts index e4c74a5c9..d2b9014b4 100644 --- a/packages/theme/src/themes/default/index.ts +++ b/packages/theme/src/themes/default/index.ts @@ -1,4 +1,5 @@ import color from 'color'; +import { cloneDeep } from 'lodash'; import * as legacyStyles from '../legacy'; @@ -143,8 +144,52 @@ export const badgeBorderRadius = 50; // Modal export const colorModalOverlayBackground = color('#000').alpha(0.5).rgb().string(); -// Workspace settings +// Services +export const services = { + listItems: { + padding: 10, + height: 57, + borderColor: legacyStyles.themeGrayLightest, + hoverBgColor: legacyStyles.themeGrayLightest, + disabled: { + color: legacyStyles.themeGrayLight, + }, + }, +}; + +// Workspaces +const drawerBg = color(colorBackground).lighten(0.1).hex(); + +export const workspaces = { + settings: { + listItems: cloneDeep(services.listItems), + }, + drawer: { + width: 300, + padding: 20, + background: drawerBg, + addButton: { + color: legacyStyles.themeGrayLight, + hoverColor: color(legacyStyles.themeGrayLight).lighten(0.1).hex(), + }, + listItem: { + hoverBackground: color(drawerBg).darken(0.01).hex(), + activeBackground: legacyStyles.themeGrayLightest, + border: color(drawerBg).darken(0.05).hex(), + name: { + color: colorText, + activeColor: colorText, + }, + services: { + color: color(colorText).lighten(1.5).hex(), + active: color(colorText).lighten(1.5).hex(), + }, + }, + }, +}; + export const workspaceSettings = { + listItemHeight: 57, listItemBorderColor: legacyStyles.themeGrayLightest, listItemHoverBgColor: legacyStyles.themeGrayLightest, }; @@ -162,3 +207,13 @@ export const workspaceDrawerItemNameColor = colorText; export const workspaceDrawerItemNameActiveColor = colorText; export const workspaceDrawerServicesColor = color(colorText).lighten(1.5).hex(); export const workspaceDrawerServicesActiveColor = workspaceDrawerServicesColor; + +// Service Icon +export const serviceIcon = { + width: 35, + isCustom: { + border: `1px solid ${legacyStyles.themeGrayLighter}`, + borderRadius: legacyStyles.themeBorderRadius, + width: 37, + }, +}; diff --git a/src/components/ui/ServiceIcon.js b/src/components/ui/ServiceIcon.js new file mode 100644 index 000000000..0b9155a4e --- /dev/null +++ b/src/components/ui/ServiceIcon.js @@ -0,0 +1,67 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { observer } from 'mobx-react'; +import injectSheet from 'react-jss'; +import classnames from 'classnames'; + +import ServiceModel from '../../models/Service'; + +const styles = theme => ({ + root: { + height: 'auto', + }, + icon: { + width: theme.serviceIcon.width, + }, + isCustomIcon: { + width: theme.serviceIcon.isCustom.width, + border: theme.serviceIcon.isCustom.border, + borderRadius: theme.serviceIcon.isCustom.borderRadius, + }, + isDisabled: { + filter: 'grayscale(100%)', + opacity: '.5', + }, +}); + +@injectSheet(styles) @observer +class ServiceIcon extends Component { + static propTypes = { + classes: PropTypes.object.isRequired, + service: PropTypes.instanceOf(ServiceModel).isRequired, + className: PropTypes.string, + }; + + static defaultProps = { + className: '', + }; + + render() { + const { + classes, + className, + service, + } = this.props; + + return ( +
+ +
+ ); + } +} + +export default ServiceIcon; diff --git a/src/features/workspaces/components/EditWorkspaceForm.js b/src/features/workspaces/components/EditWorkspaceForm.js index e4bf44248..bba4485ff 100644 --- a/src/features/workspaces/components/EditWorkspaceForm.js +++ b/src/features/workspaces/components/EditWorkspaceForm.js @@ -10,7 +10,7 @@ import Workspace from '../models/Workspace'; import Service from '../../../models/Service'; import Form from '../../../lib/Form'; import { required } from '../../../helpers/validation-helpers'; -import ServiceListItem from './ServiceListItem'; +import WorkspaceServiceListItem from './WorkspaceServiceListItem'; import Request from '../../../stores/lib/Request'; import { gaEvent } from '../../../lib/analytics'; import { GA_CATEGORY_WORKSPACES } from '../index'; @@ -151,7 +151,7 @@ class EditWorkspaceForm extends Component {

{intl.formatMessage(messages.servicesInWorkspaceHeadline)}

{services.map(s => ( - ({ - service: { - height: 'auto', - display: 'flex', - }, - name: { - marginTop: '4px', - }, -}); - -@injectSheet(styles) @observer -class ServiceListItem extends Component { - static propTypes = { - classes: PropTypes.object.isRequired, - isInWorkspace: PropTypes.bool.isRequired, - onToggle: PropTypes.func.isRequired, - service: PropTypes.instanceOf(Service).isRequired, - }; - - render() { - const { - classes, - isInWorkspace, - onToggle, - service, - } = this.props; - - return ( -
- -
- ); - } -} - -export default ServiceListItem; diff --git a/src/features/workspaces/components/WorkspaceItem.js b/src/features/workspaces/components/WorkspaceItem.js index a950a981a..cc4b1a3ba 100644 --- a/src/features/workspaces/components/WorkspaceItem.js +++ b/src/features/workspaces/components/WorkspaceItem.js @@ -8,10 +8,10 @@ import Workspace from '../models/Workspace'; const styles = theme => ({ row: { - height: 57, - borderBottom: `1px solid ${theme.workspaceSettings.listItemBorderColor}`, + height: theme.workspaces.settings.listItems.height, + borderBottom: `1px solid ${theme.workspaces.settings.listItems.borderColor}`, '&:hover': { - background: theme.workspaceSettings.listItemHoverBgColor, + background: theme.workspaces.settings.listItems.hoverBgColor, }, }, columnName: {}, diff --git a/src/features/workspaces/components/WorkspaceServiceListItem.js b/src/features/workspaces/components/WorkspaceServiceListItem.js new file mode 100644 index 000000000..7b516d056 --- /dev/null +++ b/src/features/workspaces/components/WorkspaceServiceListItem.js @@ -0,0 +1,50 @@ +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; +import { observer } from 'mobx-react'; +import injectSheet from 'react-jss'; +import { Toggle } from '@meetfranz/forms'; + +import Service from '../../../models/Service'; +import ServiceIcon from '../../../components/ui/ServiceIcon'; + +const styles = theme => ({ + service: { + height: theme.workspaceSettings.listItemHeight, + display: 'flex', + }, + name: { + marginTop: '4px', + }, +}); + +@injectSheet(styles) @observer +class ServiceListItem extends Component { + static propTypes = { + classes: PropTypes.object.isRequired, + isInWorkspace: PropTypes.bool.isRequired, + onToggle: PropTypes.func.isRequired, + service: PropTypes.instanceOf(Service).isRequired, + }; + + render() { + const { + classes, + isInWorkspace, + onToggle, + service, + } = this.props; + + return ( +
+ + +
+ ); + } +} + +export default ServiceListItem; -- cgit v1.2.3-54-g00ecf From 4421584d41a5182b0f93f0ed7e3c73d34f98d3de Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Sun, 7 Apr 2019 19:56:00 +0200 Subject: change plus icon in workspace drawer to settings icon --- .../workspaces/components/WorkspaceDrawer.js | 22 +++++------ .../components/WorkspaceServiceListItem.js | 43 +++++++++++++++++----- src/i18n/locales/defaultMessages.json | 6 +-- src/i18n/locales/en-US.json | 2 +- .../workspaces/components/WorkspaceDrawer.json | 6 +-- 5 files changed, 52 insertions(+), 27 deletions(-) diff --git a/src/features/workspaces/components/WorkspaceDrawer.js b/src/features/workspaces/components/WorkspaceDrawer.js index 0befcc869..bb77aa72d 100644 --- a/src/features/workspaces/components/WorkspaceDrawer.js +++ b/src/features/workspaces/components/WorkspaceDrawer.js @@ -21,9 +21,9 @@ const messages = defineMessages({ id: 'workspaceDrawer.allServices', defaultMessage: '!!!All services', }, - addWorkspaceTooltip: { - id: 'workspaceDrawer.addWorkspaceTooltip', - defaultMessage: '!!!Add workspace', + workspacesSettingsTooltip: { + id: 'workspaceDrawer.workspacesSettingsTooltip', + defaultMessage: '!!!Workspaces settings', }, workspaceFeatureInfo: { id: 'workspaceDrawer.workspaceFeatureInfo', @@ -54,12 +54,12 @@ const styles = theme => ({ marginBottom: '25px', marginLeft: theme.workspaceDrawerPadding, }, - addWorkspaceButton: { + workspacesSettingsButton: { float: 'right', marginRight: theme.workspaceDrawerPadding, marginTop: '2px', }, - addWorkspaceButtonIcon: { + workspacesSettingsButtonIcon: { fill: theme.workspaceDrawerAddButtonColor, '&:hover': { fill: theme.workspaceDrawerAddButtonHoverColor, @@ -133,17 +133,17 @@ class WorkspaceDrawer extends Component {

{intl.formatMessage(messages.headline)} { workspaceActions.openWorkspaceSettings(); - gaEvent(GA_CATEGORY_WORKSPACES, 'add', 'drawerHeadline'); + gaEvent(GA_CATEGORY_WORKSPACES, 'settings', 'drawerHeadline'); }} - data-tip={`${intl.formatMessage(messages.addWorkspaceTooltip)}`} + data-tip={`${intl.formatMessage(messages.workspacesSettingsTooltip)}`} >

@@ -212,7 +212,7 @@ class WorkspaceDrawer extends Component { {intl.formatMessage(messages.addNewWorkspaceLabel)} diff --git a/src/features/workspaces/components/WorkspaceServiceListItem.js b/src/features/workspaces/components/WorkspaceServiceListItem.js index 7b516d056..e05b21440 100644 --- a/src/features/workspaces/components/WorkspaceServiceListItem.js +++ b/src/features/workspaces/components/WorkspaceServiceListItem.js @@ -2,23 +2,37 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { observer } from 'mobx-react'; import injectSheet from 'react-jss'; +import classnames from 'classnames'; import { Toggle } from '@meetfranz/forms'; import Service from '../../../models/Service'; import ServiceIcon from '../../../components/ui/ServiceIcon'; const styles = theme => ({ - service: { - height: theme.workspaceSettings.listItemHeight, + listItem: { + height: theme.workspaces.settings.listItems.height, + borderBottom: `1px solid ${theme.workspaces.settings.listItems.borderColor}`, display: 'flex', + alignItems: 'center', }, - name: { - marginTop: '4px', + serviceIcon: { + padding: theme.workspaces.settings.listItems.padding, + }, + toggle: { + height: 'auto', + margin: 0, + }, + label: { + padding: theme.workspaces.settings.listItems.padding, + flexGrow: 1, + }, + disabledLabel: { + color: theme.workspaces.settings.listItems.disabled.color, }, }); @injectSheet(styles) @observer -class ServiceListItem extends Component { +class WorkspaceServiceListItem extends Component { static propTypes = { classes: PropTypes.object.isRequired, isInWorkspace: PropTypes.bool.isRequired, @@ -35,16 +49,27 @@ class ServiceListItem extends Component { } = this.props; return ( -
- +
+ + + {service.name} +
); } } -export default ServiceListItem; +export default WorkspaceServiceListItem; diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 05df4cbac..f882e6030 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -3349,15 +3349,15 @@ } }, { - "defaultMessage": "!!!Add workspace", + "defaultMessage": "!!!Workspaces settings", "end": { "column": 3, "line": 27 }, "file": "src/features/workspaces/components/WorkspaceDrawer.js", - "id": "workspaceDrawer.addWorkspaceTooltip", + "id": "workspaceDrawer.workspacesSettingsTooltip", "start": { - "column": 23, + "column": 29, "line": 24 } }, diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 78dcd83d7..e55489418 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -307,12 +307,12 @@ "welcome.loginButton": "Login to your account", "welcome.signupButton": "Create a free account", "workspaceDrawer.addNewWorkspaceLabel": "add new workspace", - "workspaceDrawer.addWorkspaceTooltip": "Add workspace", "workspaceDrawer.allServices": "All services", "workspaceDrawer.headline": "Workspaces", "workspaceDrawer.item.noServicesAddedYet": "No services added yet", "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace", "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account", "workspaceDrawer.workspaceFeatureInfo": "

Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

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.

", + "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", "workspaces.switchingIndicator.switchingTo": "Switching to" } \ No newline at end of file diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json index 9b0b80321..d347622d2 100644 --- a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json +++ b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json @@ -26,12 +26,12 @@ } }, { - "id": "workspaceDrawer.addWorkspaceTooltip", - "defaultMessage": "!!!Add workspace", + "id": "workspaceDrawer.workspacesSettingsTooltip", + "defaultMessage": "!!!Workspaces settings", "file": "src/features/workspaces/components/WorkspaceDrawer.js", "start": { "line": 24, - "column": 23 + "column": 29 }, "end": { "line": 27, -- cgit v1.2.3-54-g00ecf From 142880f89f30eff57ec3ffa45efe6c241474697b Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Wed, 10 Apr 2019 10:53:54 +0200 Subject: autofocus create workspace input field --- src/features/workspaces/components/CreateWorkspaceForm.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/features/workspaces/components/CreateWorkspaceForm.js b/src/features/workspaces/components/CreateWorkspaceForm.js index 0be2d528f..2c00ea63c 100644 --- a/src/features/workspaces/components/CreateWorkspaceForm.js +++ b/src/features/workspaces/components/CreateWorkspaceForm.js @@ -82,6 +82,7 @@ class CreateWorkspaceForm extends Component { {...form.$('name').bind()} showLabel={false} onEnterKey={this.submitForm.bind(this, form)} + focus />
diff --git a/src/features/workspaces/components/WorkspaceSwitchingIndicator.js b/src/features/workspaces/components/WorkspaceSwitchingIndicator.js index ded6b8f2a..c4a800a7b 100644 --- a/src/features/workspaces/components/WorkspaceSwitchingIndicator.js +++ b/src/features/workspaces/components/WorkspaceSwitchingIndicator.js @@ -3,9 +3,9 @@ import PropTypes from 'prop-types'; import { observer } from 'mobx-react'; import injectSheet from 'react-jss'; import classnames from 'classnames'; +import { Loader } from '@meetfranz/ui'; import { defineMessages, intlShape } from 'react-intl'; -import LoaderComponent from '../../../components/ui/Loader'; import { workspaceStore } from '../index'; const messages = defineMessages({ @@ -39,12 +39,14 @@ const styles = theme => ({ zIndex: 200, }, spinner: { - width: '40px', - marginRight: '5px', + width: 40, + height: 40, + marginRight: 10, }, message: { fontSize: 16, whiteSpace: 'nowrap', + color: theme.colorAppLoaderSpinner, }, }); @@ -52,6 +54,7 @@ const styles = theme => ({ class WorkspaceSwitchingIndicator extends Component { static propTypes = { classes: PropTypes.object.isRequired, + theme: PropTypes.object.isRequired, }; static contextTypes = { @@ -59,7 +62,7 @@ class WorkspaceSwitchingIndicator extends Component { }; render() { - const { classes } = this.props; + const { classes, theme } = this.props; const { intl } = this.context; const { isSwitchingWorkspace, isWorkspaceDrawerOpen, nextWorkspace } = workspaceStore; if (!isSwitchingWorkspace) return null; @@ -72,9 +75,10 @@ class WorkspaceSwitchingIndicator extends Component { ])} >
-
- -
+

{`${intl.formatMessage(messages.switchingTo)} ${nextWorkspaceName}`}

-- cgit v1.2.3-54-g00ecf From 073212bf046b9218f9e3129988b1b63fba5d685d Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Wed, 10 Apr 2019 16:12:38 +0200 Subject: added generic pro badge component for settings nav --- packages/ui/src/badge/ProBadge.tsx | 65 ++++++++++++++++++++++ packages/ui/src/index.ts | 1 + .../settings/navigation/SettingsNavigation.js | 13 +++-- src/features/workspaces/store.js | 12 ++-- src/i18n/locales/defaultMessages.json | 28 +++++----- src/i18n/locales/en-US.json | 2 +- .../settings/navigation/SettingsNavigation.json | 28 +++++----- src/stores/UIStore.js | 9 +-- src/styles/settings.scss | 26 --------- uidev/src/stories/badge.stories.tsx | 12 +++- 10 files changed, 125 insertions(+), 71 deletions(-) create mode 100644 packages/ui/src/badge/ProBadge.tsx diff --git a/packages/ui/src/badge/ProBadge.tsx b/packages/ui/src/badge/ProBadge.tsx new file mode 100644 index 000000000..eb00e156d --- /dev/null +++ b/packages/ui/src/badge/ProBadge.tsx @@ -0,0 +1,65 @@ +import { Theme } from '@meetfranz/theme'; +import classnames from 'classnames'; +import React, { Component } from 'react'; +import injectStyle from 'react-jss'; + +import { Icon, Badge } from '../'; +import { IWithStyle } from '../typings/generic'; + +interface IProps extends IWithStyle { + badgeClasses?: string; + iconClasses?: string; + inverted?: boolean; +} + +const styles = (theme: Theme) => ({ + badge: { + height: 'auto', + padding: [4, 6, 2, 7], + borderRadius: theme.borderRadiusSmall, + }, + invertedBadge: { + background: theme.styleTypes.primary.contrast, + color: theme.styleTypes.primary.accent, + }, + icon: { + fill: theme.styleTypes.primary.contrast, + }, + invertedIcon: { + fill: theme.styleTypes.primary.accent, + }, +}); + +class ProBadgeComponent extends Component { + render() { + const { + classes, + badgeClasses, + iconClasses, + inverted, + } = this.props; + + return ( + + + + ); + } +} + +export const ProBadge = injectStyle(styles)(ProBadgeComponent); diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts index 1eeec5144..666495ce9 100644 --- a/packages/ui/src/index.ts +++ b/packages/ui/src/index.ts @@ -3,3 +3,4 @@ export { Infobox } from './infobox'; export * from './headline'; export { Loader } from './loader'; export { Badge } from './badge'; +export { ProBadge } from './badge/ProBadge'; diff --git a/src/components/settings/navigation/SettingsNavigation.js b/src/components/settings/navigation/SettingsNavigation.js index 1c51d50d6..993b0a44a 100644 --- a/src/components/settings/navigation/SettingsNavigation.js +++ b/src/components/settings/navigation/SettingsNavigation.js @@ -2,10 +2,11 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { defineMessages, intlShape } from 'react-intl'; import { inject, observer } from 'mobx-react'; -import { Icon } from '@meetfranz/ui'; +import { ProBadge } from '@meetfranz/ui'; import Link from '../../ui/Link'; import { workspaceStore } from '../../../features/workspaces'; +import UIStore from '../../../stores/UIStore'; const messages = defineMessages({ availableServices: { @@ -40,6 +41,9 @@ const messages = defineMessages({ export default @inject('stores') @observer class SettingsNavigation extends Component { static propTypes = { + stores: PropTypes.shape({ + ui: PropTypes.instanceOf(UIStore).isRequired, + }).isRequired, serviceCount: PropTypes.number.isRequired, workspaceCount: PropTypes.number.isRequired, }; @@ -49,7 +53,8 @@ export default @inject('stores') @observer class SettingsNavigation extends Comp }; render() { - const { serviceCount, workspaceCount } = this.props; + const { serviceCount, workspaceCount, stores } = this.props; + const { isDarkThemeActive } = stores.ui; const { intl } = this.context; return ( @@ -79,9 +84,7 @@ export default @inject('stores') @observer class SettingsNavigation extends Comp {intl.formatMessage(messages.yourWorkspaces)} {' '} {workspaceStore.isPremiumUpgradeRequired ? ( - - - + ) : ( {workspaceCount} )} diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index 2e1764f99..ba48022c2 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -36,6 +36,8 @@ export default class WorkspacesStore extends FeatureStore { @observable isWorkspaceDrawerOpen = false; + @observable isSettingsRouteActive = null; + @computed get workspaces() { if (!this.isFeatureActive) return []; return getUserWorkspacesRequest.result || []; @@ -104,8 +106,6 @@ export default class WorkspacesStore extends FeatureStore { _wasDrawerOpenBeforeSettingsRoute = null; - _isSettingsRouteActive = null; - _getWorkspaceById = id => this.workspaces.find(w => w.id === id); _updateSettings = (changes) => { @@ -239,17 +239,17 @@ export default class WorkspacesStore extends FeatureStore { _openDrawerWithSettingsReaction = () => { const { router } = this.stores; const isWorkspaceSettingsRoute = router.location.pathname.includes(WORKSPACES_ROUTES.ROOT); - const isSwitchingToSettingsRoute = !this._isSettingsRouteActive && isWorkspaceSettingsRoute; - const isLeavingSettingsRoute = !isWorkspaceSettingsRoute && this._isSettingsRouteActive; + const isSwitchingToSettingsRoute = !this.isSettingsRouteActive && isWorkspaceSettingsRoute; + const isLeavingSettingsRoute = !isWorkspaceSettingsRoute && this.isSettingsRouteActive; if (isSwitchingToSettingsRoute) { - this._isSettingsRouteActive = true; + this.isSettingsRouteActive = true; this._wasDrawerOpenBeforeSettingsRoute = this.isWorkspaceDrawerOpen; if (!this._wasDrawerOpenBeforeSettingsRoute) { workspaceActions.toggleWorkspaceDrawer(); } } else if (isLeavingSettingsRoute) { - this._isSettingsRouteActive = false; + this.isSettingsRouteActive = false; if (!this._wasDrawerOpenBeforeSettingsRoute && this.isWorkspaceDrawerOpen) { workspaceActions.toggleWorkspaceDrawer(); } diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index f882e6030..791c4dd53 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -1302,91 +1302,91 @@ "defaultMessage": "!!!Available services", "end": { "column": 3, - "line": 14 + "line": 15 }, "file": "src/components/settings/navigation/SettingsNavigation.js", "id": "settings.navigation.availableServices", "start": { "column": 21, - "line": 11 + "line": 12 } }, { "defaultMessage": "!!!Your services", "end": { "column": 3, - "line": 18 + "line": 19 }, "file": "src/components/settings/navigation/SettingsNavigation.js", "id": "settings.navigation.yourServices", "start": { "column": 16, - "line": 15 + "line": 16 } }, { "defaultMessage": "!!!Your workspaces", "end": { "column": 3, - "line": 22 + "line": 23 }, "file": "src/components/settings/navigation/SettingsNavigation.js", "id": "settings.navigation.yourWorkspaces", "start": { "column": 18, - "line": 19 + "line": 20 } }, { "defaultMessage": "!!!Account", "end": { "column": 3, - "line": 26 + "line": 27 }, "file": "src/components/settings/navigation/SettingsNavigation.js", "id": "settings.navigation.account", "start": { "column": 11, - "line": 23 + "line": 24 } }, { "defaultMessage": "!!!Settings", "end": { "column": 3, - "line": 30 + "line": 31 }, "file": "src/components/settings/navigation/SettingsNavigation.js", "id": "settings.navigation.settings", "start": { "column": 12, - "line": 27 + "line": 28 } }, { "defaultMessage": "!!!Invite Friends", "end": { "column": 3, - "line": 34 + "line": 35 }, "file": "src/components/settings/navigation/SettingsNavigation.js", "id": "settings.navigation.inviteFriends", "start": { "column": 17, - "line": 31 + "line": 32 } }, { "defaultMessage": "!!!Logout", "end": { "column": 3, - "line": 38 + "line": 39 }, "file": "src/components/settings/navigation/SettingsNavigation.js", "id": "settings.navigation.logout", "start": { "column": 10, - "line": 35 + "line": 36 } } ], diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index db1d51f3b..6591af2e2 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -315,4 +315,4 @@ "workspaceDrawer.workspaceFeatureInfo": "

Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

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.

", "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", "workspaces.switchingIndicator.switchingTo": "Switching to" -} +} \ No newline at end of file diff --git a/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json index de78a71cf..77b0ed8a4 100644 --- a/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json +++ b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json @@ -4,11 +4,11 @@ "defaultMessage": "!!!Available services", "file": "src/components/settings/navigation/SettingsNavigation.js", "start": { - "line": 11, + "line": 12, "column": 21 }, "end": { - "line": 14, + "line": 15, "column": 3 } }, @@ -17,11 +17,11 @@ "defaultMessage": "!!!Your services", "file": "src/components/settings/navigation/SettingsNavigation.js", "start": { - "line": 15, + "line": 16, "column": 16 }, "end": { - "line": 18, + "line": 19, "column": 3 } }, @@ -30,11 +30,11 @@ "defaultMessage": "!!!Your workspaces", "file": "src/components/settings/navigation/SettingsNavigation.js", "start": { - "line": 19, + "line": 20, "column": 18 }, "end": { - "line": 22, + "line": 23, "column": 3 } }, @@ -43,11 +43,11 @@ "defaultMessage": "!!!Account", "file": "src/components/settings/navigation/SettingsNavigation.js", "start": { - "line": 23, + "line": 24, "column": 11 }, "end": { - "line": 26, + "line": 27, "column": 3 } }, @@ -56,11 +56,11 @@ "defaultMessage": "!!!Settings", "file": "src/components/settings/navigation/SettingsNavigation.js", "start": { - "line": 27, + "line": 28, "column": 12 }, "end": { - "line": 30, + "line": 31, "column": 3 } }, @@ -69,11 +69,11 @@ "defaultMessage": "!!!Invite Friends", "file": "src/components/settings/navigation/SettingsNavigation.js", "start": { - "line": 31, + "line": 32, "column": 17 }, "end": { - "line": 34, + "line": 35, "column": 3 } }, @@ -82,11 +82,11 @@ "defaultMessage": "!!!Logout", "file": "src/components/settings/navigation/SettingsNavigation.js", "start": { - "line": 35, + "line": 36, "column": 10 }, "end": { - "line": 38, + "line": 39, "column": 3 } } diff --git a/src/stores/UIStore.js b/src/stores/UIStore.js index bb7965a4a..a95a8e1e0 100644 --- a/src/stores/UIStore.js +++ b/src/stores/UIStore.js @@ -21,11 +21,12 @@ export default class UIStore extends Store { return (settings.app.isAppMuted && settings.app.showMessageBadgeWhenMuted) || !settings.isAppMuted; } - @computed get theme() { - if (this.stores.settings.all.app.darkMode) { - return theme('dark'); - } + @computed get isDarkThemeActive() { + return this.stores.settings.all.app.darkMode; + } + @computed get theme() { + if (this.isDarkThemeActive) return theme('dark'); return theme('default'); } diff --git a/src/styles/settings.scss b/src/styles/settings.scss index 6340f2951..dd6f56d2b 100644 --- a/src/styles/settings.scss +++ b/src/styles/settings.scss @@ -85,11 +85,6 @@ .badge { background: $dark-theme-gray-lighter; color: $dark-theme-gray-smoke; - - &.badge--pro { - background: $theme-brand-primary; - padding: 4px 6px 3px 7px; - } } &:hover { @@ -98,11 +93,6 @@ .badge { background: $dark-theme-gray-lighter; color: $dark-theme-gray-smoke; - - &.badge--pro { - background: $theme-brand-primary; - padding: 4px 6px 3px 7px; - } } } @@ -433,15 +423,6 @@ text-decoration: none; transition: background $theme-transition-time, color $theme-transition-time; - .badge--pro { - background: $theme-brand-primary !important; - padding: 4px 6px 3px 7px; - - .badge-icon-pro { - fill: white; - } - } - &:hover { background: darken($theme-gray-lightest, 5%); @@ -454,13 +435,6 @@ background: $theme-brand-primary; color: #FFF; - .badge--pro { - background: white !important; - .badge-icon-pro { - fill: $theme-brand-primary; - } - } - .badge { background: #FFF; color: $theme-brand-primary; diff --git a/uidev/src/stories/badge.stories.tsx b/uidev/src/stories/badge.stories.tsx index 6de2034bf..d7b4d55b5 100644 --- a/uidev/src/stories/badge.stories.tsx +++ b/uidev/src/stories/badge.stories.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Badge } from '@meetfranz/ui'; +import { Badge, ProBadge } from '@meetfranz/ui'; import { storiesOf } from '../stores/stories'; storiesOf('Badge') @@ -18,4 +18,14 @@ storiesOf('Badge') danger inverted + )) + .add('Pro Badge', () => ( + <> + + + )) + .add('Pro Badge inverted', () => ( + <> + + )); -- cgit v1.2.3-54-g00ecf From 4c762972ab51e6017607f0450c2647f4c0e5660f Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Wed, 10 Apr 2019 16:27:44 +0200 Subject: add premium badge to workspace drawer headline --- packages/ui/src/badge/ProBadge.tsx | 1 - .../workspaces/components/WorkspaceDrawer.js | 49 ++++++++++++++-------- src/i18n/locales/defaultMessages.json | 13 ++++++ src/i18n/locales/en-US.json | 1 + .../workspaces/components/WorkspaceDrawer.json | 13 ++++++ 5 files changed, 59 insertions(+), 18 deletions(-) diff --git a/packages/ui/src/badge/ProBadge.tsx b/packages/ui/src/badge/ProBadge.tsx index eb00e156d..612e23210 100644 --- a/packages/ui/src/badge/ProBadge.tsx +++ b/packages/ui/src/badge/ProBadge.tsx @@ -47,7 +47,6 @@ class ProBadgeComponent extends Component { inverted && classes.invertedBadge, badgeClasses, ])} - data-type="franz-badge" > ({ @@ -54,6 +58,9 @@ const styles = theme => ({ marginBottom: '25px', marginLeft: theme.workspaces.drawer.padding, }, + headlineProBadge: { + marginRight: 15, + }, workspacesSettingsButton: { float: 'right', marginRight: theme.workspaces.drawer.padding, @@ -134,6 +141,14 @@ class WorkspaceDrawer extends Component { return (

+ {workspaceStore.isPremiumUpgradeRequired && ( + + + + )} {intl.formatMessage(messages.headline)} ))} +
{ + workspaceActions.openWorkspaceSettings(); + gaEvent(GA_CATEGORY_WORKSPACES, 'add', 'drawerAddLabel'); + }} + > + + + {intl.formatMessage(messages.addNewWorkspaceLabel)} + +

)} -
{ - workspaceActions.openWorkspaceSettings(); - gaEvent(GA_CATEGORY_WORKSPACES, 'add', 'drawerAddLabel'); - }} - > - - - {intl.formatMessage(messages.addNewWorkspaceLabel)} - -
); diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 791c4dd53..11a23805c 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -3412,6 +3412,19 @@ "column": 24, "line": 40 } + }, + { + "defaultMessage": "!!!Premium feature", + "end": { + "column": 3, + "line": 47 + }, + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "id": "workspaceDrawer.proFeatureBadge", + "start": { + "column": 23, + "line": 44 + } } ], "path": "src/features/workspaces/components/WorkspaceDrawer.json" diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 6591af2e2..a2f460f67 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -311,6 +311,7 @@ "workspaceDrawer.headline": "Workspaces", "workspaceDrawer.item.noServicesAddedYet": "No services added yet", "workspaceDrawer.premiumCtaButtonLabel": "Create your first workspace", + "workspaceDrawer.proFeatureBadge": "Premium feature", "workspaceDrawer.reactivatePremiumAccountLabel": "Reactivate premium account", "workspaceDrawer.workspaceFeatureInfo": "

Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

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.

", "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json index d347622d2..9f0935620 100644 --- a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json +++ b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json @@ -89,5 +89,18 @@ "line": 43, "column": 3 } + }, + { + "id": "workspaceDrawer.proFeatureBadge", + "defaultMessage": "!!!Premium feature", + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "start": { + "line": 44, + "column": 23 + }, + "end": { + "line": 47, + "column": 3 + } } ] \ No newline at end of file -- cgit v1.2.3-54-g00ecf From 664b59789ca032eaa393af52ff2559e173a9b0b5 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Wed, 10 Apr 2019 16:37:04 +0200 Subject: add context menu for workspace drawer items --- .../workspaces/components/WorkspaceDrawer.js | 1 + .../workspaces/components/WorkspaceDrawerItem.js | 29 ++++++++++++++++++++++ src/i18n/locales/defaultMessages.json | 17 +++++++++++-- src/i18n/locales/en-US.json | 3 ++- .../workspaces/components/WorkspaceDrawerItem.json | 17 +++++++++++-- 5 files changed, 62 insertions(+), 5 deletions(-) diff --git a/src/features/workspaces/components/WorkspaceDrawer.js b/src/features/workspaces/components/WorkspaceDrawer.js index 64c98dc63..684e50dd0 100644 --- a/src/features/workspaces/components/WorkspaceDrawer.js +++ b/src/features/workspaces/components/WorkspaceDrawer.js @@ -215,6 +215,7 @@ class WorkspaceDrawer extends Component { workspaceActions.toggleWorkspaceDrawer(); gaEvent(GA_CATEGORY_WORKSPACES, 'switch', 'drawer'); }} + onContextMenuEditClick={() => workspaceActions.edit({ workspace })} services={getServicesForWorkspace(workspace)} /> ))} diff --git a/src/features/workspaces/components/WorkspaceDrawerItem.js b/src/features/workspaces/components/WorkspaceDrawerItem.js index 57f0754d9..59a2144d3 100644 --- a/src/features/workspaces/components/WorkspaceDrawerItem.js +++ b/src/features/workspaces/components/WorkspaceDrawerItem.js @@ -1,3 +1,4 @@ +import { remote } from 'electron'; import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { observer } from 'mobx-react'; @@ -5,11 +6,17 @@ import injectSheet from 'react-jss'; import classnames from 'classnames'; import { defineMessages, intlShape } from 'react-intl'; +const { Menu } = remote; + const messages = defineMessages({ noServicesAddedYet: { id: 'workspaceDrawer.item.noServicesAddedYet', defaultMessage: '!!!No services added yet', }, + contextMenuEdit: { + id: 'workspaceDrawer.item.contextMenuEdit', + defaultMessage: '!!!edit', + }, }); const styles = theme => ({ @@ -61,6 +68,11 @@ class WorkspaceDrawerItem extends Component { name: PropTypes.string.isRequired, onClick: PropTypes.func.isRequired, services: PropTypes.arrayOf(PropTypes.string).isRequired, + onContextMenuEditClick: PropTypes.func, + }; + + static defaultProps = { + onContextMenuEditClick: null, }; static contextTypes = { @@ -73,9 +85,23 @@ class WorkspaceDrawerItem extends Component { isActive, name, onClick, + onContextMenuEditClick, services, } = this.props; const { intl } = this.context; + + const contextMenuTemplate = [{ + label: name, + enabled: false, + }, { + type: 'separator', + }, { + label: intl.formatMessage(messages.contextMenuEdit), + click: onContextMenuEditClick, + }]; + + const contextMenu = Menu.buildFromTemplate(contextMenuTemplate); + return (
( + onContextMenuEditClick && contextMenu.popup(remote.getCurrentWindow()) + )} > Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

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.

", "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", "workspaces.switchingIndicator.switchingTo": "Switching to" -} \ No newline at end of file +} diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawerItem.json b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawerItem.json index cdbd1d5b5..4ff190606 100644 --- a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawerItem.json +++ b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawerItem.json @@ -4,11 +4,24 @@ "defaultMessage": "!!!No services added yet", "file": "src/features/workspaces/components/WorkspaceDrawerItem.js", "start": { - "line": 9, + "line": 12, "column": 22 }, "end": { - "line": 12, + "line": 15, + "column": 3 + } + }, + { + "id": "workspaceDrawer.item.contextMenuEdit", + "defaultMessage": "!!!edit", + "file": "src/features/workspaces/components/WorkspaceDrawerItem.js", + "start": { + "line": 16, + "column": 19 + }, + "end": { + "line": 19, "column": 3 } } -- cgit v1.2.3-54-g00ecf From adf5ac074626dac5bfec9d8fb54b28149e492e1b Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Wed, 10 Apr 2019 17:17:02 +0200 Subject: handle deleted services that are attached to workspaces --- src/containers/layout/AppLayoutContainer.js | 2 +- src/features/workspaces/store.js | 32 ++++++++++++++++++++++------- src/i18n/locales/en-US.json | 2 +- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/containers/layout/AppLayoutContainer.js b/src/containers/layout/AppLayoutContainer.js index 52d4e0c27..2d855c78f 100644 --- a/src/containers/layout/AppLayoutContainer.js +++ b/src/containers/layout/AppLayoutContainer.js @@ -88,7 +88,7 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e const workspacesDrawer = ( ( - workspace ? workspace.services.map(id => services.one(id).name) : services.all.map(s => s.name) + workspace ? workspaceStore.getWorkspaceServices(workspace).map(s => s.name) : services.all.map(s => s.name) )} onUpgradeAccountClick={() => openSettings({ path: 'user' })} /> diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index ba48022c2..ea601700e 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -74,6 +74,7 @@ export default class WorkspacesStore extends FeatureStore { this._setIsPremiumFeatureReaction, this._activateLastUsedWorkspaceReaction, this._openDrawerWithSettingsReaction, + this._cleanupInvalidServiceReferences, ]); getUserWorkspacesRequest.execute(); @@ -92,16 +93,17 @@ export default class WorkspacesStore extends FeatureStore { filterServicesByActiveWorkspace = (services) => { const { activeWorkspace, isFeatureActive } = this; - - if (!isFeatureActive) return services; - if (activeWorkspace) { - return services.filter(s => ( - activeWorkspace.services.includes(s.id) - )); + if (isFeatureActive && activeWorkspace) { + return this.getWorkspaceServices(activeWorkspace); } return services; }; + getWorkspaceServices(workspace) { + const { services } = this.stores; + return workspace.services.map(id => services.one(id)).filter(s => !!s); + } + // ========== PRIVATE ========= // _wasDrawerOpenBeforeSettingsRoute = null; @@ -218,7 +220,8 @@ export default class WorkspacesStore extends FeatureStore { if (this.activeWorkspace) { const services = this.stores.services.allDisplayed; const activeService = services.find(s => s.isActive); - const workspaceServices = this.filterServicesByActiveWorkspace(services); + const workspaceServices = this.getWorkspaceServices(this.activeWorkspace); + if (workspaceServices.length <= 0) return; const isActiveServiceInWorkspace = workspaceServices.includes(activeService); if (!isActiveServiceInWorkspace) { this.actions.service.setActive({ serviceId: workspaceServices[0].id }); @@ -255,4 +258,19 @@ export default class WorkspacesStore extends FeatureStore { } } }; + + _cleanupInvalidServiceReferences = () => { + const { services } = this.stores; + let invalidServiceReferencesExist = false; + this.workspaces.forEach((workspace) => { + workspace.services.forEach((serviceId) => { + if (!services.one(serviceId)) { + invalidServiceReferencesExist = true; + } + }); + }); + if (invalidServiceReferencesExist) { + getUserWorkspacesRequest.execute(); + } + }; } diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index da7649b90..84a71117a 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -317,4 +317,4 @@ "workspaceDrawer.workspaceFeatureInfo": "

Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

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.

", "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", "workspaces.switchingIndicator.switchingTo": "Switching to" -} +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf From ca9d5863f9067f2a32498da763cd536e0bcc5c77 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Thu, 11 Apr 2019 12:53:16 +0200 Subject: refactor announcements to newest feature pattern --- src/components/layout/AppLayout.js | 2 +- src/containers/layout/AppLayoutContainer.js | 5 +- src/features/announcements/Component.js | 77 --------------------- src/features/announcements/api.js | 6 +- .../announcements/components/AnnouncementScreen.js | 79 ++++++++++++++++++++++ src/features/announcements/index.js | 17 ++--- src/features/announcements/state.js | 17 ----- src/features/announcements/store.js | 49 ++++++++------ src/i18n/locales/defaultMessages.json | 18 +++++ .../components/AnnouncementScreen.json | 15 ++++ 10 files changed, 156 insertions(+), 129 deletions(-) delete mode 100644 src/features/announcements/Component.js create mode 100644 src/features/announcements/components/AnnouncementScreen.js delete mode 100644 src/features/announcements/state.js create mode 100644 src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js index 985475c8d..eb3f03f12 100644 --- a/src/components/layout/AppLayout.js +++ b/src/components/layout/AppLayout.js @@ -14,7 +14,7 @@ import ErrorBoundary from '../util/ErrorBoundary'; // import globalMessages from '../../i18n/globalMessages'; import { isWindows } from '../../environment'; -import AnnouncementScreen from '../../features/announcements/Component'; +import AnnouncementScreen from '../../features/announcements/components/AnnouncementScreen'; import WorkspaceSwitchingIndicator from '../../features/workspaces/components/WorkspaceSwitchingIndicator'; import { workspaceStore } from '../../features/workspaces'; diff --git a/src/containers/layout/AppLayoutContainer.js b/src/containers/layout/AppLayoutContainer.js index 0357f63bd..8a0e105e7 100644 --- a/src/containers/layout/AppLayoutContainer.js +++ b/src/containers/layout/AppLayoutContainer.js @@ -20,10 +20,11 @@ import Services from '../../components/services/content/Services'; import AppLoader from '../../components/ui/AppLoader'; import { state as delayAppState } from '../../features/delayApp'; -import { announcementsState } from '../../features/announcements/state'; +import { } from '../../features/announcements/store'; import { workspaceActions } from '../../features/workspaces/actions'; import WorkspaceDrawer from '../../features/workspaces/components/WorkspaceDrawer'; import { workspaceStore } from '../../features/workspaces'; +import { announcementsStore } from '../../features/announcements'; export default @inject('stores', 'actions') @observer class AppLayoutContainer extends Component { static defaultProps = { @@ -150,7 +151,7 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e areRequiredRequestsLoading={requests.areRequiredRequestsLoading} darkMode={settings.all.app.darkMode} isDelayAppScreenVisible={delayAppState.isDelayAppScreenVisible} - isAnnouncementVisible={announcementsState.isAnnouncementVisible} + isAnnouncementVisible={announcementsStore.isAnnouncementVisible} > {React.Children.count(children) > 0 ? children : null} diff --git a/src/features/announcements/Component.js b/src/features/announcements/Component.js deleted file mode 100644 index 5d95f5d84..000000000 --- a/src/features/announcements/Component.js +++ /dev/null @@ -1,77 +0,0 @@ -import React, { Component } from 'react'; -import marked from 'marked'; -import PropTypes from 'prop-types'; -import { inject, observer } from 'mobx-react'; -import { defineMessages, intlShape } from 'react-intl'; -import injectSheet from 'react-jss'; -import { themeSidebarWidth } from '@meetfranz/theme/lib/themes/legacy'; -import state from './state'; - -const messages = defineMessages({ - headline: { - id: 'feature.announcements.headline', - defaultMessage: '!!!What\'s new in Franz {version}?', - }, -}); - -const styles = theme => ({ - container: { - background: theme.colorBackground, - position: 'absolute', - top: 0, - zIndex: 140, - width: `calc(100% - ${themeSidebarWidth})`, - display: 'flex', - 'flex-direction': 'column', - 'align-items': 'center', - 'justify-content': 'center', - }, - headline: { - color: theme.colorHeadline, - margin: [25, 0, 40], - 'max-width': 500, - 'text-align': 'center', - 'line-height': '1.3em', - }, - body: { - '& h3': { - fontSize: '24px', - margin: '1.5em 0 1em 0', - }, - '& li': { - marginBottom: '1em', - }, - }, -}); - - -@inject('actions') @injectSheet(styles) @observer -class AnnouncementScreen extends Component { - static propTypes = { - classes: PropTypes.object.isRequired, - }; - - static contextTypes = { - intl: intlShape, - }; - - render() { - const { classes } = this.props; - const { intl } = this.context; - return ( -
-

- {intl.formatMessage(messages.headline, { version: state.currentVersion })} -

-
-
- ); - } -} - -export default AnnouncementScreen; diff --git a/src/features/announcements/api.js b/src/features/announcements/api.js index ec16066a6..09fcb8235 100644 --- a/src/features/announcements/api.js +++ b/src/features/announcements/api.js @@ -1,8 +1,9 @@ import { remote } from 'electron'; +import Request from '../../stores/lib/Request'; const debug = require('debug')('Franz:feature:announcements:api'); -export default { +export const announcementsApi = { async getCurrentVersion() { debug('getting current version of electron app'); return Promise.resolve(remote.app.getVersion()); @@ -17,3 +18,6 @@ export default { return data.body; }, }; + +export const getCurrentVersionRequest = new Request(announcementsApi, 'getCurrentVersion'); +export const getAnnouncementRequest = new Request(announcementsApi, 'getAnnouncementForVersion'); diff --git a/src/features/announcements/components/AnnouncementScreen.js b/src/features/announcements/components/AnnouncementScreen.js new file mode 100644 index 000000000..5b3e7aeaa --- /dev/null +++ b/src/features/announcements/components/AnnouncementScreen.js @@ -0,0 +1,79 @@ +import React, { Component } from 'react'; +import marked from 'marked'; +import PropTypes from 'prop-types'; +import { inject, observer } from 'mobx-react'; +import { defineMessages, intlShape } from 'react-intl'; +import injectSheet from 'react-jss'; +import { themeSidebarWidth } from '../../../../packages/theme/lib/themes/legacy'; +import { announcementsStore } from '../index'; + +const messages = defineMessages({ + headline: { + id: 'feature.announcements.headline', + defaultMessage: '!!!What\'s new in Franz {version}?', + }, +}); + +const styles = theme => ({ + container: { + background: theme.colorBackground, + position: 'absolute', + top: 0, + zIndex: 140, + width: `calc(100% - ${themeSidebarWidth})`, + display: 'flex', + 'flex-direction': 'column', + 'align-items': 'center', + 'justify-content': 'center', + }, + headline: { + color: theme.colorHeadline, + margin: [25, 0, 40], + 'max-width': 500, + 'text-align': 'center', + 'line-height': '1.3em', + }, + body: { + '& h3': { + fontSize: '24px', + margin: '1.5em 0 1em 0', + }, + '& li': { + marginBottom: '1em', + }, + }, +}); + + +@inject('actions') @injectSheet(styles) @observer +class AnnouncementScreen extends Component { + static propTypes = { + classes: PropTypes.object.isRequired, + }; + + static contextTypes = { + intl: intlShape, + }; + + render() { + const { classes } = this.props; + const { intl } = this.context; + return ( +
+

+ {intl.formatMessage(messages.headline, { + version: announcementsStore.currentVersion, + })} +

+
+
+ ); + } +} + +export default AnnouncementScreen; diff --git a/src/features/announcements/index.js b/src/features/announcements/index.js index 5ea74e0af..c087689a7 100644 --- a/src/features/announcements/index.js +++ b/src/features/announcements/index.js @@ -1,11 +1,9 @@ -import { reaction, runInAction } from 'mobx'; +import { reaction } from 'mobx'; import { AnnouncementsStore } from './store'; -import api from './api'; -import state, { resetState } from './state'; const debug = require('debug')('Franz:feature:announcements'); -let store = null; +export const announcementsStore = new AnnouncementsStore(); export default function initAnnouncements(stores, actions) { // const { features } = stores; @@ -19,15 +17,10 @@ export default function initAnnouncements(stores, actions) { (isEnabled) => { if (isEnabled) { debug('Initializing `announcements` feature'); - store = new AnnouncementsStore(stores, api, actions, state); - store.initialize(); - runInAction(() => { state.isFeatureActive = true; }); - } else if (store) { + announcementsStore.start(stores, actions); + } else if (announcementsStore.isFeatureActive) { debug('Disabling `announcements` feature'); - runInAction(() => { state.isFeatureActive = false; }); - store.teardown(); - store = null; - resetState(); // Reset state to default + announcementsStore.stop(); } }, { diff --git a/src/features/announcements/state.js b/src/features/announcements/state.js deleted file mode 100644 index 81b632253..000000000 --- a/src/features/announcements/state.js +++ /dev/null @@ -1,17 +0,0 @@ -import { observable } from 'mobx'; - -const defaultState = { - announcement: null, - currentVersion: null, - lastUsedVersion: null, - isAnnouncementVisible: false, - isFeatureActive: false, -}; - -export const announcementsState = observable(defaultState); - -export function resetState() { - Object.assign(announcementsState, defaultState); -} - -export default announcementsState; diff --git a/src/features/announcements/store.js b/src/features/announcements/store.js index 004a44062..c59700926 100644 --- a/src/features/announcements/store.js +++ b/src/features/announcements/store.js @@ -1,28 +1,39 @@ import { action, observable, reaction } from 'mobx'; import semver from 'semver'; - -import Request from '../../stores/lib/Request'; -import Store from '../../stores/lib/Store'; +import { FeatureStore } from '../utils/FeatureStore'; +import { getAnnouncementRequest, getCurrentVersionRequest } from './api'; const debug = require('debug')('Franz:feature:announcements:store'); -export class AnnouncementsStore extends Store { - @observable getCurrentVersion = new Request(this.api, 'getCurrentVersion'); +export class AnnouncementsStore extends FeatureStore { - @observable getAnnouncement = new Request(this.api, 'getAnnouncementForVersion'); + @observable announcement = null; - constructor(stores, api, actions, state) { - super(stores, api, actions); - this.state = state; - } + @observable currentVersion = null; + + @observable lastUsedVersion = null; + + @observable isAnnouncementVisible = false; - async setup() { + @observable isFeatureActive = false; + + async start(stores, actions) { + debug('AnnouncementsStore::start'); + this.stores = stores; + this.actions = actions; await this.fetchLastUsedVersion(); await this.fetchCurrentVersion(); await this.fetchReleaseAnnouncement(); this.showAnnouncementIfNotSeenYet(); this.actions.announcements.show.listen(this._showAnnouncement.bind(this)); + this.isFeatureActive = true; + } + + stop() { + debug('AnnouncementsStore::stop'); + this.isFeatureActive = false; + this.isAnnouncementVisible = false; } // ====== PUBLIC ====== @@ -35,14 +46,14 @@ export class AnnouncementsStore extends Store { async fetchCurrentVersion() { debug('getting current version from api'); - const version = await this.getCurrentVersion.execute(); + const version = await getCurrentVersionRequest.execute(); this._setCurrentVersion(version); } async fetchReleaseAnnouncement() { debug('getting release announcement from api'); try { - const announcement = await this.getAnnouncement.execute(this.state.currentVersion); + const announcement = await getAnnouncementRequest.execute(this.currentVersion); this._setAnnouncement(announcement); } catch (error) { this._setAnnouncement(null); @@ -50,7 +61,7 @@ export class AnnouncementsStore extends Store { } showAnnouncementIfNotSeenYet() { - const { announcement, currentVersion, lastUsedVersion } = this.state; + const { announcement, currentVersion, lastUsedVersion } = this; if (announcement && semver.gt(currentVersion, lastUsedVersion)) { debug(`${currentVersion} < ${lastUsedVersion}: announcement is shown`); this._showAnnouncement(); @@ -64,21 +75,21 @@ export class AnnouncementsStore extends Store { @action _setCurrentVersion(version) { debug(`setting current version to ${version}`); - this.state.currentVersion = version; + this.currentVersion = version; } @action _setLastUsedVersion(version) { debug(`setting last used version to ${version}`); - this.state.lastUsedVersion = version; + this.lastUsedVersion = version; } @action _setAnnouncement(announcement) { debug(`setting announcement to ${announcement}`); - this.state.announcement = announcement; + this.announcement = announcement; } @action _showAnnouncement() { - this.state.isAnnouncementVisible = true; + this.isAnnouncementVisible = true; this.actions.service.blurActive(); const dispose = reaction( () => this.stores.services.active, @@ -90,6 +101,6 @@ export class AnnouncementsStore extends Store { } @action _hideAnnouncement() { - this.state.isAnnouncementVisible = false; + this.isAnnouncementVisible = false; } } diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 698698515..1dd31324e 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -3097,6 +3097,24 @@ ], "path": "src/features/announcements/Component.json" }, + { + "descriptors": [ + { + "defaultMessage": "!!!What's new in Franz {version}?", + "end": { + "column": 3, + "line": 14 + }, + "file": "src/features/announcements/components/AnnouncementScreen.js", + "id": "feature.announcements.headline", + "start": { + "column": 12, + "line": 11 + } + } + ], + "path": "src/features/announcements/components/AnnouncementScreen.json" + }, { "descriptors": [ { diff --git a/src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json b/src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json new file mode 100644 index 000000000..225670ee2 --- /dev/null +++ b/src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json @@ -0,0 +1,15 @@ +[ + { + "id": "feature.announcements.headline", + "defaultMessage": "!!!What's new in Franz {version}?", + "file": "src/features/announcements/components/AnnouncementScreen.js", + "start": { + "line": 11, + "column": 12 + }, + "end": { + "line": 14, + "column": 3 + } + } +] \ No newline at end of file -- cgit v1.2.3-54-g00ecf From eaf4aff646eed56e65c8dd8e70143ab5634ad4b4 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Thu, 11 Apr 2019 16:44:16 +0200 Subject: WIP: announcement feature and workspace fixes --- packages/theme/src/themes/dark/index.ts | 19 -- packages/theme/src/themes/default/index.ts | 20 -- src/features/announcements/actions.js | 4 +- src/features/announcements/api.js | 18 +- .../announcements/components/AnnouncementScreen.js | 152 ++++++++++++--- src/features/announcements/store.js | 151 +++++++++------ src/features/utils/FeatureStore.js | 29 ++- src/features/workspaces/store.js | 18 +- src/i18n/locales/defaultMessages.json | 6 +- src/i18n/locales/en-US.json | 6 +- .../src/features/announcements/Component.json | 4 +- .../components/AnnouncementScreen.json | 8 +- src/i18n/messages/src/lib/Menu.json | 214 ++++++++++----------- src/lib/Menu.js | 15 +- src/stores/index.js | 4 + 15 files changed, 405 insertions(+), 263 deletions(-) diff --git a/packages/theme/src/themes/dark/index.ts b/packages/theme/src/themes/dark/index.ts index fd04b106c..b17dc8965 100644 --- a/packages/theme/src/themes/dark/index.ts +++ b/packages/theme/src/themes/dark/index.ts @@ -111,22 +111,3 @@ export const workspaces = merge({}, defaultStyles.workspaces, { }, }, }); - -// // Workspace settings -// export const workspaceSettings = merge({}, defaultStyles.workspaceSettings, { -// listItemBorderColor: legacyStyles.darkThemeGrayDarker, -// listItemHoverBgColor: legacyStyles.darkThemeGrayDarker, -// }); -// -// // Workspace Drawer -// export const workspaceDrawerBackground = color(colorBackground).lighten(0.3).hex(); -// export const workspaceDrawerAddButtonColor = legacyStyles.darkThemeGrayLighter; -// export const workspaceDrawerAddButtonHoverColor = legacyStyles.darkThemeGraySmoke; -// export const workspaceDrawerItemBorder = color(workspaceDrawerBackground).lighten(0.2).hex(); -// export const workspaceDrawerItemHoverBackground = color(workspaceDrawerBackground).lighten(0.2).hex(); -// export const workspaceDrawerItemActiveBackground = defaultStyles.brandPrimary; -// export const workspaceDrawerItemNameColor = colorText; -// export const workspaceDrawerItemNameActiveColor = 'white'; -// export const workspaceDrawerServicesColor = color(colorText).darken(0.5).hex(); -// export const workspaceDrawerServicesActiveColor = color(defaultStyles.brandPrimary).lighten(0.5).hex(); -// diff --git a/packages/theme/src/themes/default/index.ts b/packages/theme/src/themes/default/index.ts index d0493b82f..46d29f593 100644 --- a/packages/theme/src/themes/default/index.ts +++ b/packages/theme/src/themes/default/index.ts @@ -200,23 +200,3 @@ export const workspaces = { spinnerColor: 'white', }, }; - -// export const workspaceSettings = { -// listItemHeight: 57, -// listItemBorderColor: legacyStyles.themeGrayLightest, -// listItemHoverBgColor: legacyStyles.themeGrayLightest, -// }; -// -// // Workspace Drawer -// export const workspaceDrawerWidth = 300; -// export const workspaceDrawerPadding = 20; -// export const workspaceDrawerBackground = color(colorBackground).lighten(0.1).hex(); -// export const workspaceDrawerAddButtonColor = legacyStyles.themeGrayLight; -// export const workspaceDrawerAddButtonHoverColor = color(legacyStyles.themeGrayLight).lighten(0.1).hex(); -// export const workspaceDrawerItemHoverBackground = color(workspaceDrawerBackground).darken(0.01).hex(); -// export const workspaceDrawerItemActiveBackground = legacyStyles.themeGrayLightest; -// export const workspaceDrawerItemBorder = color(workspaceDrawerBackground).darken(0.05).hex(); -// export const workspaceDrawerItemNameColor = colorText; -// export const workspaceDrawerItemNameActiveColor = colorText; -// export const workspaceDrawerServicesColor = color(colorText).lighten(1.5).hex(); -// export const workspaceDrawerServicesActiveColor = workspaceDrawerServicesColor; diff --git a/src/features/announcements/actions.js b/src/features/announcements/actions.js index 68b262ded..bab496314 100644 --- a/src/features/announcements/actions.js +++ b/src/features/announcements/actions.js @@ -2,7 +2,9 @@ import PropTypes from 'prop-types'; import { createActionsFromDefinitions } from '../../actions/lib/actions'; export const announcementActions = createActionsFromDefinitions({ - show: {}, + show: { + targetVersion: PropTypes.string, + }, }, PropTypes.checkPropTypes); export default announcementActions; diff --git a/src/features/announcements/api.js b/src/features/announcements/api.js index 09fcb8235..a581bd8de 100644 --- a/src/features/announcements/api.js +++ b/src/features/announcements/api.js @@ -1,5 +1,6 @@ import { remote } from 'electron'; import Request from '../../stores/lib/Request'; +import { API, API_VERSION } from '../../environment'; const debug = require('debug')('Franz:feature:announcements:api'); @@ -9,15 +10,24 @@ export const announcementsApi = { return Promise.resolve(remote.app.getVersion()); }, - async getAnnouncementForVersion(version) { - debug('fetching release announcement from Github'); + async getChangelog(version) { + debug('fetching release changelog from Github'); const url = `https://api.github.com/repos/meetfranz/franz/releases/tags/v${version}`; const request = await window.fetch(url, { method: 'GET' }); - if (!request.ok) throw request; + if (!request.ok) return null; const data = await request.json(); return data.body; }, + + async getAnnouncement(version) { + debug('fetching release announcement from api'); + const url = `${API}/${API_VERSION}/announcements/${version}`; + const response = await window.fetch(url, { method: 'GET' }); + if (!response.ok) return null; + return response.json(); + }, }; export const getCurrentVersionRequest = new Request(announcementsApi, 'getCurrentVersion'); -export const getAnnouncementRequest = new Request(announcementsApi, 'getAnnouncementForVersion'); +export const getChangelogRequest = new Request(announcementsApi, 'getChangelog'); +export const getAnnouncementRequest = new Request(announcementsApi, 'getAnnouncement'); diff --git a/src/features/announcements/components/AnnouncementScreen.js b/src/features/announcements/components/AnnouncementScreen.js index 5b3e7aeaa..2d5efc396 100644 --- a/src/features/announcements/components/AnnouncementScreen.js +++ b/src/features/announcements/components/AnnouncementScreen.js @@ -4,27 +4,29 @@ import PropTypes from 'prop-types'; import { inject, observer } from 'mobx-react'; import { defineMessages, intlShape } from 'react-intl'; import injectSheet from 'react-jss'; -import { themeSidebarWidth } from '../../../../packages/theme/lib/themes/legacy'; +import { Button } from '@meetfranz/forms'; + import { announcementsStore } from '../index'; +import UIStore from '../../../stores/UIStore'; const messages = defineMessages({ headline: { - id: 'feature.announcements.headline', - defaultMessage: '!!!What\'s new in Franz {version}?', + id: 'feature.announcements.changelog.headline', + defaultMessage: '!!!Changes in Franz {version}', }, }); +const smallScreen = '1000px'; + const styles = theme => ({ container: { background: theme.colorBackground, position: 'absolute', top: 0, zIndex: 140, - width: `calc(100% - ${themeSidebarWidth})`, - display: 'flex', - 'flex-direction': 'column', - 'align-items': 'center', - 'justify-content': 'center', + width: '100%', + height: '100%', + overflowY: 'auto', }, headline: { color: theme.colorHeadline, @@ -33,7 +35,76 @@ const styles = theme => ({ 'text-align': 'center', 'line-height': '1.3em', }, - body: { + announcement: { + height: '100vh', + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + }, + main: { + flexGrow: 1, + '& h1': { + marginTop: 40, + fontSize: 50, + color: theme.styleTypes.primary.accent, + textAlign: 'center', + [`@media(min-width: ${smallScreen})`]: { + marginTop: 75, + }, + }, + '& h2': { + fontSize: 24, + fontWeight: 300, + color: theme.colorText, + textAlign: 'center', + }, + }, + mainBody: { + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + width: 'calc(100% - 80px)', + height: 'auto', + margin: '0 auto', + [`@media(min-width: ${smallScreen})`]: { + flexDirection: 'row', + justifyContent: 'center', + }, + }, + mainImage: { + minWidth: 250, + maxWidth: 400, + margin: '0 auto', + marginBottom: 40, + '& img': { + width: '100%', + }, + [`@media(min-width: ${smallScreen})`]: { + margin: 0, + }, + }, + mainText: { + height: 'auto', + maxWidth: 600, + textAlign: 'center', + '& p': { + lineHeight: '1.5em', + }, + [`@media(min-width: ${smallScreen})`]: { + textAlign: 'left', + }, + }, + mainCtaButton: { + textAlign: 'center', + marginTop: 40, + [`@media(min-width: ${smallScreen})`]: { + textAlign: 'left', + }, + }, + spotlight: { + height: 'auto', + }, + changelog: { '& h3': { fontSize: '24px', margin: '1.5em 0 1em 0', @@ -45,10 +116,13 @@ const styles = theme => ({ }); -@inject('actions') @injectSheet(styles) @observer +@inject('stores', 'actions') @injectSheet(styles) @observer class AnnouncementScreen extends Component { static propTypes = { classes: PropTypes.object.isRequired, + stores: PropTypes.shape({ + ui: PropTypes.instanceOf(UIStore).isRequired, + }).isRequired, }; static contextTypes = { @@ -56,21 +130,55 @@ class AnnouncementScreen extends Component { }; render() { - const { classes } = this.props; + const { classes, stores } = this.props; const { intl } = this.context; + const { changelog, announcement } = announcementsStore; + const themeImage = stores.ui.isDarkThemeActive ? 'dark' : 'light'; return (
-

- {intl.formatMessage(messages.headline, { - version: announcementsStore.currentVersion, - })} -

-
+
+
+

{announcement.main.headline}

+

{announcement.main.subHeadline}

+
+
+ +
+
+

+

+
+
+
+
+ {announcement.spotlight && ( +
+

{announcement.spotlight.title}

+
+ )} +
+ {changelog && ( +
+

+ {intl.formatMessage(messages.headline, { + version: announcementsStore.currentVersion, + })} +

+
+
+ )}
); } diff --git a/src/features/announcements/store.js b/src/features/announcements/store.js index c59700926..d4fb0a52c 100644 --- a/src/features/announcements/store.js +++ b/src/features/announcements/store.js @@ -1,96 +1,93 @@ -import { action, observable, reaction } from 'mobx'; +import { + action, + computed, + observable, + reaction, +} from 'mobx'; import semver from 'semver'; +import localStorage from 'mobx-localstorage'; + import { FeatureStore } from '../utils/FeatureStore'; -import { getAnnouncementRequest, getCurrentVersionRequest } from './api'; +import { getAnnouncementRequest, getChangelogRequest, getCurrentVersionRequest } from './api'; +import { announcementActions } from './actions'; + +const LOCAL_STORAGE_KEY = 'announcements'; const debug = require('debug')('Franz:feature:announcements:store'); export class AnnouncementsStore extends FeatureStore { - - @observable announcement = null; - - @observable currentVersion = null; - - @observable lastUsedVersion = null; + @observable targetVersion = null; @observable isAnnouncementVisible = false; @observable isFeatureActive = false; - async start(stores, actions) { - debug('AnnouncementsStore::start'); - this.stores = stores; - this.actions = actions; - await this.fetchLastUsedVersion(); - await this.fetchCurrentVersion(); - await this.fetchReleaseAnnouncement(); - this.showAnnouncementIfNotSeenYet(); - - this.actions.announcements.show.listen(this._showAnnouncement.bind(this)); - this.isFeatureActive = true; + @computed get changelog() { + return getChangelogRequest.result; } - stop() { - debug('AnnouncementsStore::stop'); - this.isFeatureActive = false; - this.isAnnouncementVisible = false; + @computed get announcement() { + return getAnnouncementRequest.result; } - // ====== PUBLIC ====== - - async fetchLastUsedVersion() { - debug('getting last used version from local storage'); - const lastUsedVersion = window.localStorage.getItem('lastUsedVersion'); - this._setLastUsedVersion(lastUsedVersion == null ? '0.0.0' : lastUsedVersion); + @computed get settings() { + return localStorage.getItem(LOCAL_STORAGE_KEY) || {}; } - async fetchCurrentVersion() { - debug('getting current version from api'); - const version = await getCurrentVersionRequest.execute(); - this._setCurrentVersion(version); + @computed get lastSeenAnnouncementVersion() { + return this.settings.lastSeenAnnouncementVersion || null; } - async fetchReleaseAnnouncement() { - debug('getting release announcement from api'); - try { - const announcement = await getAnnouncementRequest.execute(this.currentVersion); - this._setAnnouncement(announcement); - } catch (error) { - this._setAnnouncement(null); - } + @computed get currentVersion() { + return getCurrentVersionRequest.result; } - showAnnouncementIfNotSeenYet() { - const { announcement, currentVersion, lastUsedVersion } = this; - if (announcement && semver.gt(currentVersion, lastUsedVersion)) { - debug(`${currentVersion} < ${lastUsedVersion}: announcement is shown`); - this._showAnnouncement(); - } else { - debug(`${currentVersion} >= ${lastUsedVersion}: announcement is hidden`); - this._hideAnnouncement(); - } + @computed get isNewUser() { + return this.stores.settings.stats.appStarts <= 1; } - // ====== PRIVATE ====== + async start(stores, actions) { + debug('AnnouncementsStore::start'); + this.stores = stores; + this.actions = actions; + getCurrentVersionRequest.execute(); - @action _setCurrentVersion(version) { - debug(`setting current version to ${version}`); - this.currentVersion = version; - } + this._registerActions([ + [announcementActions.show, this._showAnnouncement], + ]); - @action _setLastUsedVersion(version) { - debug(`setting last used version to ${version}`); - this.lastUsedVersion = version; + this._registerReactions([ + this._fetchAnnouncements, + this._showAnnouncementToUsersWhoUpdatedApp, + ]); + this.isFeatureActive = true; } - @action _setAnnouncement(announcement) { - debug(`setting announcement to ${announcement}`); - this.announcement = announcement; + stop() { + super.stop(); + debug('AnnouncementsStore::stop'); + this.isFeatureActive = false; + this.isAnnouncementVisible = false; } - @action _showAnnouncement() { + // ======= HELPERS ======= // + + _updateSettings = (changes) => { + localStorage.setItem(LOCAL_STORAGE_KEY, { + ...this.settings, + ...changes, + }); + }; + + // ======= ACTIONS ======= // + + @action _showAnnouncement = ({ targetVersion } = {}) => { + this.targetVersion = targetVersion || this.currentVersion; this.isAnnouncementVisible = true; this.actions.service.blurActive(); + this._updateSettings({ + lastSeenAnnouncementVersion: this.currentVersion, + }); const dispose = reaction( () => this.stores.services.active, () => { @@ -98,9 +95,37 @@ export class AnnouncementsStore extends FeatureStore { dispose(); }, ); - } + }; @action _hideAnnouncement() { this.isAnnouncementVisible = false; } + + // ======= REACTIONS ======== + + _showAnnouncementToUsersWhoUpdatedApp = () => { + const { announcement, isNewUser } = this; + console.log(announcement, isNewUser); + // Check if there is an announcement and on't show announcements to new users + if (!announcement || isNewUser) return; + + this._showAnnouncement(); + + // Check if the user has already used current version (= has seen the announcement) + // const { currentVersion, lastSeenAnnouncementVersion } = this; + // if (semver.gt(currentVersion, lastSeenAnnouncementVersion)) { + // debug(`${currentVersion} < ${lastSeenAnnouncementVersion}: announcement is shown`); + // this._showAnnouncement(); + // } else { + // debug(`${currentVersion} >= ${lastSeenAnnouncementVersion}: announcement is hidden`); + // this._hideAnnouncement(); + // } + }; + + _fetchAnnouncements = () => { + const targetVersion = this.targetVersion || this.currentVersion; + if (!targetVersion) return; + getChangelogRequest.execute('5.0.1'); + getAnnouncementRequest.execute('5.1.0'); + } } diff --git a/src/features/utils/FeatureStore.js b/src/features/utils/FeatureStore.js index 66b66a104..48962561d 100644 --- a/src/features/utils/FeatureStore.js +++ b/src/features/utils/FeatureStore.js @@ -5,17 +5,38 @@ export class FeatureStore { _reactions = null; - _listenToActions(actions) { - if (this._actions) this._actions.forEach(a => a[0].off(a[1])); + _registerActions(actions) { this._actions = []; actions.forEach(a => this._actions.push(a)); + this._startListeningToActions(); + } + + _startListeningToActions() { + this._stopListeningToActions(); this._actions.forEach(a => a[0].listen(a[1])); } - _startReactions(reactions) { - if (this._reactions) this._reactions.forEach(r => r.stop()); + _stopListeningToActions() { + this._actions.forEach(a => a[0].off(a[1])); + } + + _registerReactions(reactions) { this._reactions = []; reactions.forEach(r => this._reactions.push(new Reaction(r))); + this._startReactions(); + } + + _startReactions() { + this._stopReactions(); this._reactions.forEach(r => r.start()); } + + _stopReactions() { + this._reactions.forEach(r => r.stop()); + } + + stop() { + this._stopListeningToActions(); + this._stopReactions(); + } } diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index ea601700e..4841a4e08 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -51,12 +51,16 @@ export default class WorkspacesStore extends FeatureStore { return getUserWorkspacesRequest.wasExecuted && this.workspaces.length > 0; } + @computed get isUserAllowedToUseFeature() { + return !this.isPremiumUpgradeRequired; + } + start(stores, actions) { debug('WorkspacesStore::start'); this.stores = stores; this.actions = actions; - this._listenToActions([ + this._registerActions([ [workspaceActions.edit, this._edit], [workspaceActions.create, this._create], [workspaceActions.delete, this._delete], @@ -67,7 +71,7 @@ export default class WorkspacesStore extends FeatureStore { [workspaceActions.openWorkspaceSettings, this._openWorkspaceSettings], ]); - this._startReactions([ + this._registerReactions([ this._setWorkspaceBeingEditedReaction, this._setActiveServiceOnWorkspaceSwitchReaction, this._setFeatureEnabledReaction, @@ -75,6 +79,7 @@ export default class WorkspacesStore extends FeatureStore { this._activateLastUsedWorkspaceReaction, this._openDrawerWithSettingsReaction, this._cleanupInvalidServiceReferences, + this._disableActionsForFreeUser, ]); getUserWorkspacesRequest.execute(); @@ -82,6 +87,7 @@ export default class WorkspacesStore extends FeatureStore { } stop() { + super.stop(); debug('WorkspacesStore::stop'); this.isFeatureActive = false; this.activeWorkspace = null; @@ -273,4 +279,12 @@ export default class WorkspacesStore extends FeatureStore { getUserWorkspacesRequest.execute(); } }; + + _disableActionsForFreeUser = () => { + if (!this.isUserAllowedToUseFeature) { + this._stopListeningToActions(); + } else { + this._startListeningToActions(); + } + } } diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 1dd31324e..5ad7a8bd8 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -3088,7 +3088,7 @@ "line": 14 }, "file": "src/features/announcements/Component.js", - "id": "feature.announcements.headline", + "id": "feature.announcements.changelog.headline", "start": { "column": 12, "line": 11 @@ -3106,7 +3106,7 @@ "line": 14 }, "file": "src/features/announcements/components/AnnouncementScreen.js", - "id": "feature.announcements.headline", + "id": "feature.announcements.changelog.headline", "start": { "column": 12, "line": 11 @@ -4470,4 +4470,4 @@ ], "path": "src/lib/Menu.json" } -] \ No newline at end of file +] diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 13775d758..958b6fb6a 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -1,7 +1,7 @@ { "app.errorHandler.action": "Reload", "app.errorHandler.headline": "Something went wrong", - "feature.announcements.headline": "What's new in Franz {version}?", + "feature.announcements.changelog.headline": "Changes in Franz {version}", "feature.delayApp.action": "Get a Franz Supporter License", "feature.delayApp.headline": "Please purchase a Franz Supporter License to skip waiting", "feature.delayApp.text": "Franz will continue in {seconds} seconds.", @@ -44,7 +44,7 @@ "login.submit.label": "Sign in", "login.tokenExpired": "Your session expired, please login again.", "menu.app.about": "About Franz", - "menu.app.announcement": "What's new in Franz?", + "menu.app.announcement": "What's new?", "menu.app.hide": "Hide", "menu.app.hideOthers": "Hide Others", "menu.app.quit": "Quit", @@ -319,4 +319,4 @@ "workspaceDrawer.workspaceFeatureInfo": "

Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

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.

", "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", "workspaces.switchingIndicator.switchingTo": "Switching to" -} \ No newline at end of file +} diff --git a/src/i18n/messages/src/features/announcements/Component.json b/src/i18n/messages/src/features/announcements/Component.json index 18e1b84c5..c31c35fc7 100644 --- a/src/i18n/messages/src/features/announcements/Component.json +++ b/src/i18n/messages/src/features/announcements/Component.json @@ -1,6 +1,6 @@ [ { - "id": "feature.announcements.headline", + "id": "feature.announcements.changelog.headline", "defaultMessage": "!!!What's new in Franz {version}?", "file": "src/features/announcements/Component.js", "start": { @@ -12,4 +12,4 @@ "column": 3 } } -] \ No newline at end of file +] diff --git a/src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json b/src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json index 225670ee2..874c9dd9d 100644 --- a/src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json +++ b/src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json @@ -1,14 +1,14 @@ [ { - "id": "feature.announcements.headline", - "defaultMessage": "!!!What's new in Franz {version}?", + "id": "feature.announcements.changelog.headline", + "defaultMessage": "!!!Changes in Franz {version}", "file": "src/features/announcements/components/AnnouncementScreen.js", "start": { - "line": 11, + "line": 13, "column": 12 }, "end": { - "line": 14, + "line": 16, "column": 3 } } diff --git a/src/i18n/messages/src/lib/Menu.json b/src/i18n/messages/src/lib/Menu.json index f4cd35582..a2ce34cd4 100644 --- a/src/i18n/messages/src/lib/Menu.json +++ b/src/i18n/messages/src/lib/Menu.json @@ -4,11 +4,11 @@ "defaultMessage": "!!!Edit", "file": "src/lib/Menu.js", "start": { - "line": 13, + "line": 14, "column": 8 }, "end": { - "line": 16, + "line": 17, "column": 3 } }, @@ -17,11 +17,11 @@ "defaultMessage": "!!!Undo", "file": "src/lib/Menu.js", "start": { - "line": 17, + "line": 18, "column": 8 }, "end": { - "line": 20, + "line": 21, "column": 3 } }, @@ -30,11 +30,11 @@ "defaultMessage": "!!!Redo", "file": "src/lib/Menu.js", "start": { - "line": 21, + "line": 22, "column": 8 }, "end": { - "line": 24, + "line": 25, "column": 3 } }, @@ -43,11 +43,11 @@ "defaultMessage": "!!!Cut", "file": "src/lib/Menu.js", "start": { - "line": 25, + "line": 26, "column": 7 }, "end": { - "line": 28, + "line": 29, "column": 3 } }, @@ -56,11 +56,11 @@ "defaultMessage": "!!!Copy", "file": "src/lib/Menu.js", "start": { - "line": 29, + "line": 30, "column": 8 }, "end": { - "line": 32, + "line": 33, "column": 3 } }, @@ -69,11 +69,11 @@ "defaultMessage": "!!!Paste", "file": "src/lib/Menu.js", "start": { - "line": 33, + "line": 34, "column": 9 }, "end": { - "line": 36, + "line": 37, "column": 3 } }, @@ -82,11 +82,11 @@ "defaultMessage": "!!!Paste And Match Style", "file": "src/lib/Menu.js", "start": { - "line": 37, + "line": 38, "column": 22 }, "end": { - "line": 40, + "line": 41, "column": 3 } }, @@ -95,11 +95,11 @@ "defaultMessage": "!!!Delete", "file": "src/lib/Menu.js", "start": { - "line": 41, + "line": 42, "column": 10 }, "end": { - "line": 44, + "line": 45, "column": 3 } }, @@ -108,11 +108,11 @@ "defaultMessage": "!!!Select All", "file": "src/lib/Menu.js", "start": { - "line": 45, + "line": 46, "column": 13 }, "end": { - "line": 48, + "line": 49, "column": 3 } }, @@ -121,11 +121,11 @@ "defaultMessage": "!!!Speech", "file": "src/lib/Menu.js", "start": { - "line": 49, + "line": 50, "column": 10 }, "end": { - "line": 52, + "line": 53, "column": 3 } }, @@ -134,11 +134,11 @@ "defaultMessage": "!!!Start Speaking", "file": "src/lib/Menu.js", "start": { - "line": 53, + "line": 54, "column": 17 }, "end": { - "line": 56, + "line": 57, "column": 3 } }, @@ -147,11 +147,11 @@ "defaultMessage": "!!!Stop Speaking", "file": "src/lib/Menu.js", "start": { - "line": 57, + "line": 58, "column": 16 }, "end": { - "line": 60, + "line": 61, "column": 3 } }, @@ -160,11 +160,11 @@ "defaultMessage": "!!!Start Dictation", "file": "src/lib/Menu.js", "start": { - "line": 61, + "line": 62, "column": 18 }, "end": { - "line": 64, + "line": 65, "column": 3 } }, @@ -173,11 +173,11 @@ "defaultMessage": "!!!Emoji & Symbols", "file": "src/lib/Menu.js", "start": { - "line": 65, + "line": 66, "column": 16 }, "end": { - "line": 68, + "line": 69, "column": 3 } }, @@ -186,11 +186,11 @@ "defaultMessage": "!!!Actual Size", "file": "src/lib/Menu.js", "start": { - "line": 69, + "line": 70, "column": 13 }, "end": { - "line": 72, + "line": 73, "column": 3 } }, @@ -199,11 +199,11 @@ "defaultMessage": "!!!Zoom In", "file": "src/lib/Menu.js", "start": { - "line": 73, + "line": 74, "column": 10 }, "end": { - "line": 76, + "line": 77, "column": 3 } }, @@ -212,11 +212,11 @@ "defaultMessage": "!!!Zoom Out", "file": "src/lib/Menu.js", "start": { - "line": 77, + "line": 78, "column": 11 }, "end": { - "line": 80, + "line": 81, "column": 3 } }, @@ -225,11 +225,11 @@ "defaultMessage": "!!!Enter Full Screen", "file": "src/lib/Menu.js", "start": { - "line": 81, + "line": 82, "column": 19 }, "end": { - "line": 84, + "line": 85, "column": 3 } }, @@ -238,11 +238,11 @@ "defaultMessage": "!!!Exit Full Screen", "file": "src/lib/Menu.js", "start": { - "line": 85, + "line": 86, "column": 18 }, "end": { - "line": 88, + "line": 89, "column": 3 } }, @@ -251,11 +251,11 @@ "defaultMessage": "!!!Toggle Full Screen", "file": "src/lib/Menu.js", "start": { - "line": 89, + "line": 90, "column": 20 }, "end": { - "line": 92, + "line": 93, "column": 3 } }, @@ -264,11 +264,11 @@ "defaultMessage": "!!!Toggle Developer Tools", "file": "src/lib/Menu.js", "start": { - "line": 93, + "line": 94, "column": 18 }, "end": { - "line": 96, + "line": 97, "column": 3 } }, @@ -277,11 +277,11 @@ "defaultMessage": "!!!Toggle Service Developer Tools", "file": "src/lib/Menu.js", "start": { - "line": 97, + "line": 98, "column": 25 }, "end": { - "line": 100, + "line": 101, "column": 3 } }, @@ -290,11 +290,11 @@ "defaultMessage": "!!!Reload Service", "file": "src/lib/Menu.js", "start": { - "line": 101, + "line": 102, "column": 17 }, "end": { - "line": 104, + "line": 105, "column": 3 } }, @@ -303,11 +303,11 @@ "defaultMessage": "!!!Reload Franz", "file": "src/lib/Menu.js", "start": { - "line": 105, + "line": 106, "column": 15 }, "end": { - "line": 108, + "line": 109, "column": 3 } }, @@ -316,11 +316,11 @@ "defaultMessage": "!!!Minimize", "file": "src/lib/Menu.js", "start": { - "line": 109, + "line": 110, "column": 12 }, "end": { - "line": 112, + "line": 113, "column": 3 } }, @@ -329,11 +329,11 @@ "defaultMessage": "!!!Close", "file": "src/lib/Menu.js", "start": { - "line": 113, + "line": 114, "column": 9 }, "end": { - "line": 116, + "line": 117, "column": 3 } }, @@ -342,11 +342,11 @@ "defaultMessage": "!!!Learn More", "file": "src/lib/Menu.js", "start": { - "line": 117, + "line": 118, "column": 13 }, "end": { - "line": 120, + "line": 121, "column": 3 } }, @@ -355,11 +355,11 @@ "defaultMessage": "!!!Changelog", "file": "src/lib/Menu.js", "start": { - "line": 121, + "line": 122, "column": 13 }, "end": { - "line": 124, + "line": 125, "column": 3 } }, @@ -368,11 +368,11 @@ "defaultMessage": "!!!Support", "file": "src/lib/Menu.js", "start": { - "line": 125, + "line": 126, "column": 11 }, "end": { - "line": 128, + "line": 129, "column": 3 } }, @@ -381,11 +381,11 @@ "defaultMessage": "!!!Terms of Service", "file": "src/lib/Menu.js", "start": { - "line": 129, + "line": 130, "column": 7 }, "end": { - "line": 132, + "line": 133, "column": 3 } }, @@ -394,11 +394,11 @@ "defaultMessage": "!!!Privacy Statement", "file": "src/lib/Menu.js", "start": { - "line": 133, + "line": 134, "column": 11 }, "end": { - "line": 136, + "line": 137, "column": 3 } }, @@ -407,11 +407,11 @@ "defaultMessage": "!!!File", "file": "src/lib/Menu.js", "start": { - "line": 137, + "line": 138, "column": 8 }, "end": { - "line": 140, + "line": 141, "column": 3 } }, @@ -420,11 +420,11 @@ "defaultMessage": "!!!View", "file": "src/lib/Menu.js", "start": { - "line": 141, + "line": 142, "column": 8 }, "end": { - "line": 144, + "line": 145, "column": 3 } }, @@ -433,11 +433,11 @@ "defaultMessage": "!!!Services", "file": "src/lib/Menu.js", "start": { - "line": 145, + "line": 146, "column": 12 }, "end": { - "line": 148, + "line": 149, "column": 3 } }, @@ -446,11 +446,11 @@ "defaultMessage": "!!!Window", "file": "src/lib/Menu.js", "start": { - "line": 149, + "line": 150, "column": 10 }, "end": { - "line": 152, + "line": 153, "column": 3 } }, @@ -459,11 +459,11 @@ "defaultMessage": "!!!Help", "file": "src/lib/Menu.js", "start": { - "line": 153, + "line": 154, "column": 8 }, "end": { - "line": 156, + "line": 157, "column": 3 } }, @@ -472,24 +472,24 @@ "defaultMessage": "!!!About Franz", "file": "src/lib/Menu.js", "start": { - "line": 157, + "line": 158, "column": 9 }, "end": { - "line": 160, + "line": 161, "column": 3 } }, { "id": "menu.app.announcement", - "defaultMessage": "!!!What's new in Franz?", + "defaultMessage": "!!!What's new?", "file": "src/lib/Menu.js", "start": { - "line": 161, + "line": 162, "column": 16 }, "end": { - "line": 164, + "line": 165, "column": 3 } }, @@ -498,11 +498,11 @@ "defaultMessage": "!!!Settings", "file": "src/lib/Menu.js", "start": { - "line": 165, + "line": 166, "column": 12 }, "end": { - "line": 168, + "line": 169, "column": 3 } }, @@ -511,11 +511,11 @@ "defaultMessage": "!!!Hide", "file": "src/lib/Menu.js", "start": { - "line": 169, + "line": 170, "column": 8 }, "end": { - "line": 172, + "line": 173, "column": 3 } }, @@ -524,11 +524,11 @@ "defaultMessage": "!!!Hide Others", "file": "src/lib/Menu.js", "start": { - "line": 173, + "line": 174, "column": 14 }, "end": { - "line": 176, + "line": 177, "column": 3 } }, @@ -537,11 +537,11 @@ "defaultMessage": "!!!Unhide", "file": "src/lib/Menu.js", "start": { - "line": 177, + "line": 178, "column": 10 }, "end": { - "line": 180, + "line": 181, "column": 3 } }, @@ -550,11 +550,11 @@ "defaultMessage": "!!!Quit", "file": "src/lib/Menu.js", "start": { - "line": 181, + "line": 182, "column": 8 }, "end": { - "line": 184, + "line": 185, "column": 3 } }, @@ -563,11 +563,11 @@ "defaultMessage": "!!!Add New Service...", "file": "src/lib/Menu.js", "start": { - "line": 185, + "line": 186, "column": 17 }, "end": { - "line": 188, + "line": 189, "column": 3 } }, @@ -576,11 +576,11 @@ "defaultMessage": "!!!Add New Workspace...", "file": "src/lib/Menu.js", "start": { - "line": 189, + "line": 190, "column": 19 }, "end": { - "line": 192, + "line": 193, "column": 3 } }, @@ -589,11 +589,11 @@ "defaultMessage": "!!!Open workspace drawer", "file": "src/lib/Menu.js", "start": { - "line": 193, + "line": 194, "column": 23 }, "end": { - "line": 196, + "line": 197, "column": 3 } }, @@ -602,11 +602,11 @@ "defaultMessage": "!!!Close workspace drawer", "file": "src/lib/Menu.js", "start": { - "line": 197, + "line": 198, "column": 24 }, "end": { - "line": 200, + "line": 201, "column": 3 } }, @@ -615,11 +615,11 @@ "defaultMessage": "!!!Activate next service...", "file": "src/lib/Menu.js", "start": { - "line": 201, + "line": 202, "column": 23 }, "end": { - "line": 204, + "line": 205, "column": 3 } }, @@ -628,11 +628,11 @@ "defaultMessage": "!!!Activate previous service...", "file": "src/lib/Menu.js", "start": { - "line": 205, + "line": 206, "column": 27 }, "end": { - "line": 208, + "line": 209, "column": 3 } }, @@ -641,11 +641,11 @@ "defaultMessage": "!!!Disable notifications & audio", "file": "src/lib/Menu.js", "start": { - "line": 209, + "line": 210, "column": 11 }, "end": { - "line": 212, + "line": 213, "column": 3 } }, @@ -654,11 +654,11 @@ "defaultMessage": "!!!Enable notifications & audio", "file": "src/lib/Menu.js", "start": { - "line": 213, + "line": 214, "column": 13 }, "end": { - "line": 216, + "line": 217, "column": 3 } }, @@ -667,11 +667,11 @@ "defaultMessage": "!!!Workspaces", "file": "src/lib/Menu.js", "start": { - "line": 217, + "line": 218, "column": 14 }, "end": { - "line": 220, + "line": 221, "column": 3 } }, @@ -680,11 +680,11 @@ "defaultMessage": "!!!Default", "file": "src/lib/Menu.js", "start": { - "line": 221, + "line": 222, "column": 20 }, "end": { - "line": 224, + "line": 225, "column": 3 } } diff --git a/src/lib/Menu.js b/src/lib/Menu.js index 46a347237..3df06e05a 100644 --- a/src/lib/Menu.js +++ b/src/lib/Menu.js @@ -6,6 +6,7 @@ import { isMac, ctrlKey, cmdKey } from '../environment'; import { GA_CATEGORY_WORKSPACES, workspaceStore } from '../features/workspaces/index'; import { workspaceActions } from '../features/workspaces/actions'; import { gaEvent } from './analytics'; +import announcementActions from '../features/announcements/actions'; const { app, Menu, dialog } = remote; @@ -160,7 +161,7 @@ const menuItems = defineMessages({ }, announcement: { id: 'menu.app.announcement', - defaultMessage: '!!!What\'s new in Franz?', + defaultMessage: '!!!What\'s new?', }, settings: { id: 'menu.app.settings', @@ -352,8 +353,10 @@ const _templateFactory = intl => [ click() { shell.openExternal('https://meetfranz.com'); }, }, { - label: intl.formatMessage(menuItems.changelog), - click() { shell.openExternal('https://github.com/meetfranz/franz/blob/master/CHANGELOG.md'); }, + label: intl.formatMessage(menuItems.announcement), + click: () => { + announcementActions.show(); + }, }, { type: 'separator', @@ -621,12 +624,6 @@ export default class FranzMenu { label: intl.formatMessage(menuItems.about), role: 'about', }, - { - label: intl.formatMessage(menuItems.announcement), - click: () => { - this.actions.announcements.show(); - }, - }, { type: 'separator', }, diff --git a/src/stores/index.js b/src/stores/index.js index 96b844c95..1912418a2 100644 --- a/src/stores/index.js +++ b/src/stores/index.js @@ -10,6 +10,8 @@ import PaymentStore from './PaymentStore'; import NewsStore from './NewsStore'; import RequestStore from './RequestStore'; import GlobalErrorStore from './GlobalErrorStore'; +import { workspaceStore } from '../features/workspaces'; +import { announcementsStore } from '../features/announcements'; export default (api, actions, router) => { const stores = {}; @@ -27,6 +29,8 @@ export default (api, actions, router) => { news: new NewsStore(stores, api, actions), requests: new RequestStore(stores, api, actions), globalError: new GlobalErrorStore(stores, api, actions), + workspaces: workspaceStore, + announcements: announcementsStore, }); // Initialize all stores Object.keys(stores).forEach((name) => { -- cgit v1.2.3-54-g00ecf From 2af294e00cd14e7ba26ab36bc1b8fe7680661739 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Thu, 11 Apr 2019 16:47:28 +0200 Subject: fix lint issues --- src/containers/layout/AppLayoutContainer.js | 1 - .../announcements/components/AnnouncementScreen.js | 2 +- src/features/announcements/store.js | 16 ++++++++-------- src/lib/Menu.js | 2 +- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/containers/layout/AppLayoutContainer.js b/src/containers/layout/AppLayoutContainer.js index 8a0e105e7..8c1d2dfc1 100644 --- a/src/containers/layout/AppLayoutContainer.js +++ b/src/containers/layout/AppLayoutContainer.js @@ -20,7 +20,6 @@ import Services from '../../components/services/content/Services'; import AppLoader from '../../components/ui/AppLoader'; import { state as delayAppState } from '../../features/delayApp'; -import { } from '../../features/announcements/store'; import { workspaceActions } from '../../features/workspaces/actions'; import WorkspaceDrawer from '../../features/workspaces/components/WorkspaceDrawer'; import { workspaceStore } from '../../features/workspaces'; diff --git a/src/features/announcements/components/AnnouncementScreen.js b/src/features/announcements/components/AnnouncementScreen.js index 2d5efc396..2682b7890 100644 --- a/src/features/announcements/components/AnnouncementScreen.js +++ b/src/features/announcements/components/AnnouncementScreen.js @@ -150,7 +150,7 @@ class AnnouncementScreen extends Component {

diff --git a/src/features/announcements/store.js b/src/features/announcements/store.js index d4fb0a52c..3c46828bb 100644 --- a/src/features/announcements/store.js +++ b/src/features/announcements/store.js @@ -112,14 +112,14 @@ export class AnnouncementsStore extends FeatureStore { this._showAnnouncement(); // Check if the user has already used current version (= has seen the announcement) - // const { currentVersion, lastSeenAnnouncementVersion } = this; - // if (semver.gt(currentVersion, lastSeenAnnouncementVersion)) { - // debug(`${currentVersion} < ${lastSeenAnnouncementVersion}: announcement is shown`); - // this._showAnnouncement(); - // } else { - // debug(`${currentVersion} >= ${lastSeenAnnouncementVersion}: announcement is hidden`); - // this._hideAnnouncement(); - // } + const { currentVersion, lastSeenAnnouncementVersion } = this; + if (semver.gt(currentVersion, lastSeenAnnouncementVersion)) { + debug(`${currentVersion} < ${lastSeenAnnouncementVersion}: announcement is shown`); + this._showAnnouncement(); + } else { + debug(`${currentVersion} >= ${lastSeenAnnouncementVersion}: announcement is hidden`); + this._hideAnnouncement(); + } }; _fetchAnnouncements = () => { diff --git a/src/lib/Menu.js b/src/lib/Menu.js index 3df06e05a..6bea67860 100644 --- a/src/lib/Menu.js +++ b/src/lib/Menu.js @@ -6,7 +6,7 @@ import { isMac, ctrlKey, cmdKey } from '../environment'; import { GA_CATEGORY_WORKSPACES, workspaceStore } from '../features/workspaces/index'; import { workspaceActions } from '../features/workspaces/actions'; import { gaEvent } from './analytics'; -import announcementActions from '../features/announcements/actions'; +import { announcementActions } from '../features/announcements/actions'; const { app, Menu, dialog } = remote; -- cgit v1.2.3-54-g00ecf From 6a6f3fbc65077ac68d76382c4e76afc6cc6ed4b1 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Thu, 11 Apr 2019 21:25:07 +0200 Subject: Finalize styling --- package-lock.json | 230 ++++++++++----------- packages/theme/src/themes/dark/index.ts | 10 +- packages/theme/src/themes/default/index.ts | 8 + .../announcements/components/AnnouncementScreen.js | 124 +++++++++-- .../components/AnnouncementScreen.json | 4 +- 5 files changed, 244 insertions(+), 132 deletions(-) diff --git a/package-lock.json b/package-lock.json index 600d4b7d7..33f7d69f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1442,7 +1442,7 @@ "@lerna/get-packed": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-3.7.0.tgz", - "integrity": "sha1-VJx3OPe+XjsUM+gu2c2pEjvNHtU=", + "integrity": "sha512-yuFtjsUZIHjeIvIYQ/QuytC+FQcHwo3peB+yGBST2uWCLUCR5rx6knoQcPzbxdFDCuUb5IFccFGd3B1fHFg3RQ==", "dev": true, "requires": { "fs-extra": "^7.0.0", @@ -1567,7 +1567,7 @@ "@lerna/npm-conf": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-3.7.0.tgz", - "integrity": "sha1-8QHU/fB8788RYbz688DxBbQgpFA=", + "integrity": "sha512-+WSMDfPKcKzMfqq283ydz9RRpOU6p9wfx0wy4hVSUY/6YUpsyuk8SShjcRtY8zTM5AOrxvFBuuV90H4YpZ5+Ng==", "dev": true, "requires": { "config-chain": "^1.1.11", @@ -1823,7 +1823,7 @@ "@lerna/run-parallel-batches": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@lerna/run-parallel-batches/-/run-parallel-batches-3.0.0.tgz", - "integrity": "sha1-RocEk0CEx0mR0xJNgGB4V9TfqEA=", + "integrity": "sha512-Mj1ravlXF7AkkewKd9YFq9BtVrsStNrvVLedD/b2wIVbNqcxp8lS68vehXVOzoL/VWNEDotvqCQtyDBilCodGw==", "dev": true, "requires": { "p-map": "^1.2.0", @@ -1945,7 +1945,7 @@ "requires": { "@mdi/js": "^3.3.92", "@mdi/react": "^1.1.0", - "@meetfranz/theme": "^1.0.7", + "@meetfranz/theme": "^1.0.13", "react-html-attributes": "^1.4.3", "react-loader": "^2.4.5" } @@ -1961,14 +1961,14 @@ "requires": { "@mdi/js": "^3.3.92", "@mdi/react": "^1.1.0", - "@meetfranz/theme": "^1.0.7", + "@meetfranz/theme": "^1.0.13", "react-loader": "^2.4.5" } }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha1-UkryQNGjYFJ7cwR17PoTRKpUDd4=", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", "dev": true, "requires": { "call-me-maybe": "^1.0.1", @@ -1978,7 +1978,7 @@ "@nodelib/fs.stat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", - "integrity": "sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs=", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", "dev": true }, "@octokit/endpoint": { @@ -2355,7 +2355,7 @@ "dependencies": { "mime-types": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", "integrity": "sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4=", "dev": true } @@ -2413,7 +2413,7 @@ "agent-base": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha1-2J5ZmfeXh1Z0wH2H8mD8Qeg+jKk=", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", "dev": true, "requires": { "es6-promisify": "^5.0.0" @@ -2422,7 +2422,7 @@ "agentkeepalive": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha1-oROSTdP6JKC8O3gQjEUMKr7gD2c=", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", "dev": true, "requires": { "humanize-ms": "^1.2.1" @@ -2469,7 +2469,7 @@ }, "ansi-colors": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, "requires": { @@ -2900,7 +2900,7 @@ }, "util": { "version": "0.10.3", - "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { @@ -2935,7 +2935,7 @@ }, "async": { "version": "0.1.22", - "resolved": "http://registry.npmjs.org/async/-/async-0.1.22.tgz", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=" }, "async-done": { @@ -3758,7 +3758,7 @@ "byte-size": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-4.0.4.tgz", - "integrity": "sha1-KdOBcJ9BquDYnGMfHIGuyIzUCyM=", + "integrity": "sha512-82RPeneC6nqCdSwCX2hZUz3JPOvN5at/nTEw/CMf05Smu3Hrpo9Psb7LjN+k+XndNArG1EY8L4+BM3aTM4BCvw==", "dev": true }, "bytes": { @@ -3770,7 +3770,7 @@ "cacache": { "version": "11.3.2", "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", - "integrity": "sha1-LYHjCOPSWMo4Eltna5iyrJzmm/o=", + "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", "dev": true, "requires": { "bluebird": "^3.5.3", @@ -3792,7 +3792,7 @@ "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { "yallist": "^3.0.2" @@ -4489,7 +4489,7 @@ "config-chain": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha1-D96NCRIA616AjK8l/mGMAvSOTvo=", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", "dev": true, "requires": { "ini": "^1.3.4", @@ -4535,7 +4535,7 @@ "dependencies": { "debug": { "version": "1.0.4", - "resolved": "http://registry.npmjs.org/debug/-/debug-1.0.4.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz", "integrity": "sha1-W5wla9VLbsAigxdvqKDt5tFUy/g=", "dev": true, "requires": { @@ -4805,7 +4805,7 @@ "conventional-recommended-bump": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-4.0.4.tgz", - "integrity": "sha1-BVQFhGQdPadYyIY8CXiPyutYaHI=", + "integrity": "sha512-9mY5Yoblq+ZMqJpBzgS+RpSq+SUfP2miOR3H/NR9drGf08WCrY9B6HAGJZEm6+ThsVP917VHAahSOjM6k1vhPg==", "dev": true, "requires": { "concat-stream": "^1.6.0", @@ -4896,7 +4896,7 @@ "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "dev": true, "requires": { "aproba": "^1.1.1", @@ -5477,7 +5477,7 @@ "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "diffie-hellman": { @@ -5494,7 +5494,7 @@ "dir-glob": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha1-CyBdK2rvmCOMooZZioIE0p0KADQ=", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", "dev": true, "requires": { "arrify": "^1.0.1", @@ -5579,7 +5579,7 @@ "dependencies": { "domelementtype": { "version": "1.1.3", - "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" } } @@ -5623,7 +5623,7 @@ }, "dotenv": { "version": "4.0.0", - "resolved": "http://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=", "dev": true }, @@ -5643,7 +5643,7 @@ }, "duplexer": { "version": "0.1.1", - "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, @@ -5977,7 +5977,7 @@ }, "readable-stream": { "version": "1.1.14", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { @@ -6507,7 +6507,7 @@ }, "debug": { "version": "2.3.3", - "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", "dev": true, "requires": { @@ -6516,7 +6516,7 @@ }, "ms": { "version": "0.7.2", - "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", "dev": true }, @@ -6550,7 +6550,7 @@ "dependencies": { "debug": { "version": "2.3.3", - "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", "dev": true, "requires": { @@ -6559,7 +6559,7 @@ }, "ms": { "version": "0.7.2", - "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", "dev": true } @@ -6683,12 +6683,12 @@ "es6-promise": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", - "integrity": "sha1-2m0NVpLvtGHggsFIF/4kJ9j10FQ=", + "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", "dev": true }, "es6-promisify": { "version": "5.0.0", - "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { @@ -6895,7 +6895,7 @@ }, "load-json-file": { "version": "2.0.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { @@ -7378,7 +7378,7 @@ }, "finalhandler": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "dev": true, "requires": { @@ -7706,7 +7706,7 @@ "figgy-pudding": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha1-hiRwESkBxyeg5JWoB0S9W6odZ5A=", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", "dev": true }, "figures": { @@ -7764,7 +7764,7 @@ }, "finalhandler": { "version": "0.1.0", - "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-0.1.0.tgz", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.1.0.tgz", "integrity": "sha1-2gW7xPX0owyEzh2R88FUAHxOnao=", "dev": true, "requires": { @@ -7774,7 +7774,7 @@ "dependencies": { "debug": { "version": "1.0.4", - "resolved": "http://registry.npmjs.org/debug/-/debug-1.0.4.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz", "integrity": "sha1-W5wla9VLbsAigxdvqKDt5tFUy/g=", "dev": true, "requires": { @@ -7783,7 +7783,7 @@ }, "ms": { "version": "0.6.2", - "resolved": "http://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=", "dev": true } @@ -8386,7 +8386,7 @@ "genfun": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", - "integrity": "sha1-ndlxCgaQClxKW/V6yl2k5S/nZTc=", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", "dev": true }, "get-caller-file": { @@ -8925,7 +8925,7 @@ }, "got": { "version": "6.7.1", - "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { @@ -9507,7 +9507,7 @@ }, "yargs": { "version": "3.32.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", "dev": true, "requires": { @@ -9682,7 +9682,7 @@ }, "lodash": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", "dev": true }, @@ -9742,7 +9742,7 @@ }, "readable-stream": { "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { @@ -10323,7 +10323,7 @@ "http-cache-semantics": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha1-ObDhat2bYFvwqe89nar0hDtMrNI=", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true }, "http-deceiver": { @@ -10334,7 +10334,7 @@ }, "http-errors": { "version": "1.6.3", - "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "dev": true, "requires": { @@ -10372,7 +10372,7 @@ "http-proxy-agent": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha1-5IIb7vWyFCogJr1zkm/lN2McVAU=", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", "dev": true, "requires": { "agent-base": "4", @@ -10382,7 +10382,7 @@ "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -10430,7 +10430,7 @@ "https-proxy-agent": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha1-UVUpcPoE1yPgTFbQQXjD+SWSu8A=", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", "dev": true, "requires": { "agent-base": "^4.1.0", @@ -10440,7 +10440,7 @@ "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -10449,7 +10449,7 @@ "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true } } @@ -10465,7 +10465,7 @@ }, "hunspell-asm": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/hunspell-asm/-/hunspell-asm-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/hunspell-asm/-/hunspell-asm-1.0.2.tgz", "integrity": "sha512-UTLBvc0yZiIcHl9qrgxnFTZbX3zF4CprzEY+u+N0iXlUKZnUJRIgvgppTdgiQTsucm5b0aN/rHsgXz2q/0kBRA==", "requires": { "emscripten-wasm-loader": "^1.0.0", @@ -10543,7 +10543,7 @@ "ignore-walk": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha1-qD5i59JyrA47VRqqgoMaGbafgvg=", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "dev": true, "requires": { "minimatch": "^3.0.4" @@ -10585,7 +10585,7 @@ "import-local": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha1-Xk/9wD9P5sAJxnKb6yljHC+CJ7w=", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", "dev": true, "requires": { "pkg-dir": "^2.0.0", @@ -10649,7 +10649,7 @@ "init-package-json": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.10.3.tgz", - "integrity": "sha1-Rf/i9hCoyhNPK9HbVjeyNQcPbL4=", + "integrity": "sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==", "dev": true, "requires": { "glob": "^7.1.1", @@ -10753,7 +10753,7 @@ "inversify": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/inversify/-/inversify-5.0.1.tgz", - "integrity": "sha1-UA1wmxQ0iWzloNWJFcSkIQ40+24=", + "integrity": "sha512-Ieh06s48WnEYGcqHepdsJUIJUXpwH5o5vodAX+DK2JA/gjy4EbEcQZxw+uFfzysmKjiLXGYwNG3qDZsKVMcINQ==", "dev": true }, "invert-kv": { @@ -10782,7 +10782,7 @@ }, "is": { "version": "0.3.0", - "resolved": "http://registry.npmjs.org/is/-/is-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/is/-/is-0.3.0.tgz", "integrity": "sha1-qPcd/IpuKDcWJ/JskpCYxvTV1dc=", "dev": true }, @@ -11006,7 +11006,7 @@ }, "is-obj": { "version": "1.0.1", - "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, @@ -11188,7 +11188,7 @@ }, "isemail": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=" }, "isexe": { @@ -11219,7 +11219,7 @@ }, "joi": { "version": "6.10.1", - "resolved": "http://registry.npmjs.org/joi/-/joi-6.10.1.tgz", + "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=", "requires": { "hoek": "2.x.x", @@ -11626,7 +11626,7 @@ "libnpmaccess": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-3.0.1.tgz", - "integrity": "sha1-Wzqd5iHyk9QlGRqi53kQL4QWf6g=", + "integrity": "sha512-RlZ7PNarCBt+XbnP7R6PoVgOq9t+kou5rvhaInoNibhPO7eMlRfS0B8yjatgn2yaHIwWNyoJDolC/6Lc5L/IQA==", "dev": true, "requires": { "aproba": "^2.0.0", @@ -11638,7 +11638,7 @@ "aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha1-UlILiuW1aSFbNU78DKo/4eRaitw=", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true } } @@ -12084,7 +12084,7 @@ "make-fetch-happen": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz", - "integrity": "sha1-FBSXy4ePJDupMTbIPYq6EsIWwIM=", + "integrity": "sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ==", "dev": true, "requires": { "agentkeepalive": "^3.4.1", @@ -12180,7 +12180,7 @@ }, "media-typer": { "version": "0.3.0", - "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, @@ -12271,7 +12271,7 @@ }, "readable-stream": { "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { @@ -12302,7 +12302,7 @@ "merge2": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha1-fumdvWm7ZIFoklPwGEiKG5ArDtU=", + "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", "dev": true }, "methods": { @@ -12396,7 +12396,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, @@ -12430,7 +12430,7 @@ "mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "dev": true, "requires": { "concat-stream": "^1.5.0", @@ -12468,7 +12468,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" @@ -12476,7 +12476,7 @@ "dependencies": { "minimist": { "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" } } @@ -12648,7 +12648,7 @@ }, "multimatch": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", "dev": true, "requires": { @@ -12786,7 +12786,7 @@ "node-fetch-npm": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", - "integrity": "sha1-cljJBGGC3KNFtCCO2pGNrzNpf/c=", + "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", "dev": true, "requires": { "encoding": "^0.1.11", @@ -12822,7 +12822,7 @@ "dependencies": { "semver": { "version": "5.3.0", - "resolved": "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", "dev": true }, @@ -14000,7 +14000,7 @@ "p-map": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", "dev": true }, "p-map-series": { @@ -14173,7 +14173,7 @@ "dependencies": { "color-convert": { "version": "0.5.3", - "resolved": "http://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", "dev": true } @@ -14318,7 +14318,7 @@ }, "path-browserify": { "version": "0.0.0", - "resolved": "http://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", "dev": true }, @@ -14597,7 +14597,7 @@ }, "pretty-hrtime": { "version": "1.0.3", - "resolved": "http://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", "dev": true }, @@ -14743,7 +14743,7 @@ "protoduck": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", - "integrity": "sha1-A8NlnKGAB7aaUP2Cp+vMUWJhFR8=", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", "dev": true, "requires": { "genfun": "^5.0.0" @@ -15103,7 +15103,7 @@ }, "react-router": { "version": "3.2.1", - "resolved": "http://registry.npmjs.org/react-router/-/react-router-3.2.1.tgz", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-3.2.1.tgz", "integrity": "sha512-SXkhC0nr3G0ltzVU07IN8jYl0bB6FsrDIqlLC9dK3SITXqyTJyM7yhXlUqs89w3Nqi5OkXsfRUeHX+P874HQrg==", "requires": { "create-react-class": "^15.5.1", @@ -15218,7 +15218,7 @@ "read-package-json": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", - "integrity": "sha1-LoLr2fYTuqbS6+Oqcs7+P2jkH0o=", + "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==", "dev": true, "requires": { "glob": "^7.1.1", @@ -15239,7 +15239,7 @@ "read-package-tree": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.2.1.tgz", - "integrity": "sha1-Yhixh9b6yCKJzkOHu7r47vU2rWM=", + "integrity": "sha512-2CNoRoh95LxY47LvqrehIAfUVda2JbuFE/HaGYs42bNrGG+ojbw1h3zOcPcQ+1GQ3+rkzNndZn85u1XyZ3UsIA==", "dev": true, "requires": { "debuglog": "^1.0.1", @@ -15607,7 +15607,7 @@ }, "htmlparser2": { "version": "3.3.0", - "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", "dev": true, "requires": { @@ -15625,7 +15625,7 @@ }, "readable-stream": { "version": "1.0.34", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { @@ -15637,7 +15637,7 @@ }, "string_decoder": { "version": "0.10.31", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true }, @@ -16260,7 +16260,7 @@ "dependencies": { "debug": { "version": "1.0.4", - "resolved": "http://registry.npmjs.org/debug/-/debug-1.0.4.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz", "integrity": "sha1-W5wla9VLbsAigxdvqKDt5tFUy/g=", "dev": true, "requires": { @@ -16275,7 +16275,7 @@ }, "ms": { "version": "0.6.2", - "resolved": "http://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=", "dev": true } @@ -16352,7 +16352,7 @@ }, "sha.js": { "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { @@ -16603,7 +16603,7 @@ "dependencies": { "debug": { "version": "2.3.3", - "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", "dev": true, "requires": { @@ -16612,7 +16612,7 @@ }, "ms": { "version": "0.7.2", - "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", "dev": true }, @@ -16636,7 +16636,7 @@ "dependencies": { "debug": { "version": "2.3.3", - "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", "dev": true, "requires": { @@ -16645,7 +16645,7 @@ }, "ms": { "version": "0.7.2", - "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", "dev": true } @@ -16672,7 +16672,7 @@ "dependencies": { "debug": { "version": "2.3.3", - "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", "dev": true, "requires": { @@ -16681,7 +16681,7 @@ }, "ms": { "version": "0.7.2", - "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", "dev": true } @@ -16707,7 +16707,7 @@ }, "debug": { "version": "2.2.0", - "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", "dev": true, "requires": { @@ -16722,7 +16722,7 @@ }, "ms": { "version": "0.7.1", - "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", "dev": true } @@ -16798,7 +16798,7 @@ "socks-proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz", - "integrity": "sha1-WTa/i3B6mTB5xvN9sgkYIb/6ZHM=", + "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==", "dev": true, "requires": { "agent-base": "~4.2.0", @@ -17035,7 +17035,7 @@ "ssri": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", "dev": true, "requires": { "figgy-pudding": "^3.5.1" @@ -17154,7 +17154,7 @@ "stream-each": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -17550,7 +17550,7 @@ }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -17822,7 +17822,7 @@ "tslint": { "version": "5.12.0", "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.0.tgz", - "integrity": "sha1-R/LbopHtPVgHUtEJhm+2QHaPyjY=", + "integrity": "sha512-CKEcH1MHUBhoV43SA/Jmy1l24HJJgI0eyLbBNSRyFlsQvb9v6Zdq+Nz2vEOH00nC5SUx4SneJ59PZUS/ARcokQ==", "dev": true, "requires": { "babel-code-frame": "^6.22.0", @@ -17842,7 +17842,7 @@ "tslint-config-airbnb": { "version": "5.11.1", "resolved": "https://registry.npmjs.org/tslint-config-airbnb/-/tslint-config-airbnb-5.11.1.tgz", - "integrity": "sha1-UaJ/u4vyTBRNBkonSnHaR+fs5hc=", + "integrity": "sha512-hkaittm2607vVMe8eotANGN1CimD5tor7uoY3ypg2VTtEcDB/KGWYbJOz58t8LI4cWSyWtgqYQ5F0HwKxxhlkQ==", "dev": true, "requires": { "tslint-consistent-codestyle": "^1.14.1", @@ -17864,7 +17864,7 @@ "tslint-eslint-rules": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", - "integrity": "sha1-5IjMkYG/GT/lzXv8ohOnaV8XN7U=", + "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", "dev": true, "requires": { "doctrine": "0.7.2", @@ -17874,7 +17874,7 @@ "dependencies": { "doctrine": { "version": "0.7.2", - "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", "dev": true, "requires": { @@ -17897,7 +17897,7 @@ "tslib": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha1-43qG/ajLuvI6BX9HPJ9Nxk5fwug=", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", "dev": true }, "tsutils": { @@ -17914,7 +17914,7 @@ "tslint-microsoft-contrib": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz", - "integrity": "sha1-pihoOfgA4lkdBB6igAx3SHhErYE=", + "integrity": "sha512-PDYjvpo0gN9IfMULwKk0KpVOPMhU6cNoT9VwCOLeDl/QS8v8W2yspRpFFuUS7/c5EIH/n8ApMi8TxJAz1tfFUA==", "dev": true, "requires": { "tsutils": "^2.27.2 <2.29.0" @@ -17923,7 +17923,7 @@ "tsutils": { "version": "2.28.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", - "integrity": "sha1-a9ceFggo+dAZtvToRHQiKPhRaaE=", + "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -17934,7 +17934,7 @@ "tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha1-MrSIUBRnrL7dS4VJhnOggSrKC5k=", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -17942,7 +17942,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -17989,7 +17989,7 @@ "typescript": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", - "integrity": "sha1-/oEBxGqhI/g1NSPr3PVzDCrkk+U=", + "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", "dev": true }, "ua-parser-js": { @@ -18128,7 +18128,7 @@ "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, "requires": { "unique-slug": "^2.0.0" @@ -18137,7 +18137,7 @@ "unique-slug": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha1-Xp7cbRzo+yZNsYpQfvm9hURFHKY=", + "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", "dev": true, "requires": { "imurmurhash": "^0.1.4" @@ -18582,7 +18582,7 @@ }, "vm-browserify": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", "dev": true, "requires": { @@ -18687,7 +18687,7 @@ "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha1-qFWYCx8LazWbodXZ+zmulB+qY60=", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, "webpack": { @@ -19178,7 +19178,7 @@ }, "wrap-ansi": { "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { @@ -19286,7 +19286,7 @@ "write-pkg": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.2.0.tgz", - "integrity": "sha1-DheP6Xgg04mokovHlTXb5ows/yE=", + "integrity": "sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw==", "dev": true, "requires": { "sort-keys": "^2.0.0", @@ -19328,7 +19328,7 @@ }, "xmlbuilder": { "version": "9.0.7", - "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", "dev": true }, diff --git a/packages/theme/src/themes/dark/index.ts b/packages/theme/src/themes/dark/index.ts index b17dc8965..6796c7cbb 100644 --- a/packages/theme/src/themes/dark/index.ts +++ b/packages/theme/src/themes/dark/index.ts @@ -1,5 +1,5 @@ import color from 'color'; -import { merge, cloneDeep } from 'lodash'; +import { cloneDeep, merge } from 'lodash'; import * as defaultStyles from '../default'; import * as legacyStyles from '../legacy'; @@ -111,3 +111,11 @@ export const workspaces = merge({}, defaultStyles.workspaces, { }, }, }); + +// Announcements + +export const announcements = merge({}, defaultStyles.workspaces, { + spotlight: { + background: legacyStyles.darkThemeGrayDark, + }, +}); diff --git a/packages/theme/src/themes/default/index.ts b/packages/theme/src/themes/default/index.ts index 46d29f593..a85dcb366 100644 --- a/packages/theme/src/themes/default/index.ts +++ b/packages/theme/src/themes/default/index.ts @@ -1,6 +1,7 @@ import color from 'color'; import { cloneDeep } from 'lodash'; +import { theme } from '../..'; import * as legacyStyles from '../legacy'; export interface IStyleTypes { @@ -200,3 +201,10 @@ export const workspaces = { spinnerColor: 'white', }, }; + +// Announcements +export const announcements = { + spotlight: { + background: legacyStyles.themeGrayLightest, + }, +}; diff --git a/src/features/announcements/components/AnnouncementScreen.js b/src/features/announcements/components/AnnouncementScreen.js index 2682b7890..e0c65c11f 100644 --- a/src/features/announcements/components/AnnouncementScreen.js +++ b/src/features/announcements/components/AnnouncementScreen.js @@ -8,6 +8,13 @@ import { Button } from '@meetfranz/forms'; import { announcementsStore } from '../index'; import UIStore from '../../../stores/UIStore'; +import { gaEvent } from '../../../lib/analytics'; + +const renderer = new marked.Renderer(); + +renderer.link = (href, title, text) => `${text}`; + +const markedOptions = { sanitize: true, renderer }; const messages = defineMessages({ headline: { @@ -31,32 +38,42 @@ const styles = theme => ({ headline: { color: theme.colorHeadline, margin: [25, 0, 40], - 'max-width': 500, + // 'max-width': 500, 'text-align': 'center', 'line-height': '1.3em', }, announcement: { - height: '100vh', - display: 'flex', - flexDirection: 'column', - justifyContent: 'center', + height: 'auto', + + [`@media(min-width: ${smallScreen})`]: { + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + height: '100vh', + }, }, main: { + display: 'flex', + flexDirection: 'column', flexGrow: 1, + justifyContent: 'center', + '& h1': { - marginTop: 40, - fontSize: 50, + margin: [40, 0, 15], + fontSize: 70, color: theme.styleTypes.primary.accent, textAlign: 'center', + [`@media(min-width: ${smallScreen})`]: { - marginTop: 75, + marginTop: 0, }, }, '& h2': { - fontSize: 24, + fontSize: 30, fontWeight: 300, color: theme.colorText, textAlign: 'center', + marginBottom: 60, }, }, mainBody: { @@ -103,8 +120,55 @@ const styles = theme => ({ }, spotlight: { height: 'auto', + background: theme.announcements.spotlight.background, + padding: 60, + marginTop: 80, + [`@media(min-width: ${smallScreen})`]: { + marginTop: 0, + justifyContent: 'center', + alignItems: 'flex-start', + display: 'flex', + flexDirection: 'row', + }, + }, + spotlightTopicContainer: { + textAlign: 'center', + marginBottom: 20, + + [`@media(min-width: ${smallScreen})`]: { + marginBottom: 0, + minWidth: 250, + maxWidth: 400, + width: '100%', + textAlign: 'right', + paddingRight: 80, + }, + }, + spotlightContentContainer: { + textAlign: 'center', + [`@media(min-width: ${smallScreen})`]: { + height: 'auto', + maxWidth: 600, + textAlign: 'left', + }, + '& p': { + lineHeight: '1.5em', + }, + }, + spotlightTopic: { + fontSize: 20, + marginBottom: 5, + letterSpacing: 0, + fontWeight: 100, + }, + spotlightSubject: { + fontSize: 20, }, changelog: { + maxWidth: 650, + margin: [100, 'auto'], + height: 'auto', + '& h3': { fontSize: '24px', margin: '1.5em 0 1em 0', @@ -112,6 +176,9 @@ const styles = theme => ({ '& li': { marginBottom: '1em', }, + '& div': { + height: 'auto', + }, }, }); @@ -148,20 +215,49 @@ class AnnouncementScreen extends Component { />
-

-
{announcement.spotlight && (
-

{announcement.spotlight.title}

+
+

{announcement.spotlight.title}

+

{announcement.spotlight.subject}

+
+
+
+
+
+
)}
@@ -174,7 +270,7 @@ class AnnouncementScreen extends Component {
diff --git a/src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json b/src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json index 874c9dd9d..eb1b66916 100644 --- a/src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json +++ b/src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json @@ -4,11 +4,11 @@ "defaultMessage": "!!!Changes in Franz {version}", "file": "src/features/announcements/components/AnnouncementScreen.js", "start": { - "line": 13, + "line": 20, "column": 12 }, "end": { - "line": 16, + "line": 23, "column": 3 } } -- cgit v1.2.3-54-g00ecf From 70cfc34d8c834185e6a3afc8488846bd997b0343 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Fri, 12 Apr 2019 08:55:11 +0200 Subject: Update strings --- src/i18n/locales/defaultMessages.json | 222 +++++++++++++++++----------------- src/i18n/locales/en-US.json | 2 +- 2 files changed, 112 insertions(+), 112 deletions(-) diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 5ad7a8bd8..877e67588 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -3100,16 +3100,16 @@ { "descriptors": [ { - "defaultMessage": "!!!What's new in Franz {version}?", + "defaultMessage": "!!!Changes in Franz {version}", "end": { "column": 3, - "line": 14 + "line": 23 }, "file": "src/features/announcements/components/AnnouncementScreen.js", "id": "feature.announcements.changelog.headline", "start": { "column": 12, - "line": 11 + "line": 20 } } ], @@ -3782,692 +3782,692 @@ "defaultMessage": "!!!Edit", "end": { "column": 3, - "line": 16 + "line": 17 }, "file": "src/lib/Menu.js", "id": "menu.edit", "start": { "column": 8, - "line": 13 + "line": 14 } }, { "defaultMessage": "!!!Undo", "end": { "column": 3, - "line": 20 + "line": 21 }, "file": "src/lib/Menu.js", "id": "menu.edit.undo", "start": { "column": 8, - "line": 17 + "line": 18 } }, { "defaultMessage": "!!!Redo", "end": { "column": 3, - "line": 24 + "line": 25 }, "file": "src/lib/Menu.js", "id": "menu.edit.redo", "start": { "column": 8, - "line": 21 + "line": 22 } }, { "defaultMessage": "!!!Cut", "end": { "column": 3, - "line": 28 + "line": 29 }, "file": "src/lib/Menu.js", "id": "menu.edit.cut", "start": { "column": 7, - "line": 25 + "line": 26 } }, { "defaultMessage": "!!!Copy", "end": { "column": 3, - "line": 32 + "line": 33 }, "file": "src/lib/Menu.js", "id": "menu.edit.copy", "start": { "column": 8, - "line": 29 + "line": 30 } }, { "defaultMessage": "!!!Paste", "end": { "column": 3, - "line": 36 + "line": 37 }, "file": "src/lib/Menu.js", "id": "menu.edit.paste", "start": { "column": 9, - "line": 33 + "line": 34 } }, { "defaultMessage": "!!!Paste And Match Style", "end": { "column": 3, - "line": 40 + "line": 41 }, "file": "src/lib/Menu.js", "id": "menu.edit.pasteAndMatchStyle", "start": { "column": 22, - "line": 37 + "line": 38 } }, { "defaultMessage": "!!!Delete", "end": { "column": 3, - "line": 44 + "line": 45 }, "file": "src/lib/Menu.js", "id": "menu.edit.delete", "start": { "column": 10, - "line": 41 + "line": 42 } }, { "defaultMessage": "!!!Select All", "end": { "column": 3, - "line": 48 + "line": 49 }, "file": "src/lib/Menu.js", "id": "menu.edit.selectAll", "start": { "column": 13, - "line": 45 + "line": 46 } }, { "defaultMessage": "!!!Speech", "end": { "column": 3, - "line": 52 + "line": 53 }, "file": "src/lib/Menu.js", "id": "menu.edit.speech", "start": { "column": 10, - "line": 49 + "line": 50 } }, { "defaultMessage": "!!!Start Speaking", "end": { "column": 3, - "line": 56 + "line": 57 }, "file": "src/lib/Menu.js", "id": "menu.edit.startSpeaking", "start": { "column": 17, - "line": 53 + "line": 54 } }, { "defaultMessage": "!!!Stop Speaking", "end": { "column": 3, - "line": 60 + "line": 61 }, "file": "src/lib/Menu.js", "id": "menu.edit.stopSpeaking", "start": { "column": 16, - "line": 57 + "line": 58 } }, { "defaultMessage": "!!!Start Dictation", "end": { "column": 3, - "line": 64 + "line": 65 }, "file": "src/lib/Menu.js", "id": "menu.edit.startDictation", "start": { "column": 18, - "line": 61 + "line": 62 } }, { "defaultMessage": "!!!Emoji & Symbols", "end": { "column": 3, - "line": 68 + "line": 69 }, "file": "src/lib/Menu.js", "id": "menu.edit.emojiSymbols", "start": { "column": 16, - "line": 65 + "line": 66 } }, { "defaultMessage": "!!!Actual Size", "end": { "column": 3, - "line": 72 + "line": 73 }, "file": "src/lib/Menu.js", "id": "menu.view.resetZoom", "start": { "column": 13, - "line": 69 + "line": 70 } }, { "defaultMessage": "!!!Zoom In", "end": { "column": 3, - "line": 76 + "line": 77 }, "file": "src/lib/Menu.js", "id": "menu.view.zoomIn", "start": { "column": 10, - "line": 73 + "line": 74 } }, { "defaultMessage": "!!!Zoom Out", "end": { "column": 3, - "line": 80 + "line": 81 }, "file": "src/lib/Menu.js", "id": "menu.view.zoomOut", "start": { "column": 11, - "line": 77 + "line": 78 } }, { "defaultMessage": "!!!Enter Full Screen", "end": { "column": 3, - "line": 84 + "line": 85 }, "file": "src/lib/Menu.js", "id": "menu.view.enterFullScreen", "start": { "column": 19, - "line": 81 + "line": 82 } }, { "defaultMessage": "!!!Exit Full Screen", "end": { "column": 3, - "line": 88 + "line": 89 }, "file": "src/lib/Menu.js", "id": "menu.view.exitFullScreen", "start": { "column": 18, - "line": 85 + "line": 86 } }, { "defaultMessage": "!!!Toggle Full Screen", "end": { "column": 3, - "line": 92 + "line": 93 }, "file": "src/lib/Menu.js", "id": "menu.view.toggleFullScreen", "start": { "column": 20, - "line": 89 + "line": 90 } }, { "defaultMessage": "!!!Toggle Developer Tools", "end": { "column": 3, - "line": 96 + "line": 97 }, "file": "src/lib/Menu.js", "id": "menu.view.toggleDevTools", "start": { "column": 18, - "line": 93 + "line": 94 } }, { "defaultMessage": "!!!Toggle Service Developer Tools", "end": { "column": 3, - "line": 100 + "line": 101 }, "file": "src/lib/Menu.js", "id": "menu.view.toggleServiceDevTools", "start": { "column": 25, - "line": 97 + "line": 98 } }, { "defaultMessage": "!!!Reload Service", "end": { "column": 3, - "line": 104 + "line": 105 }, "file": "src/lib/Menu.js", "id": "menu.view.reloadService", "start": { "column": 17, - "line": 101 + "line": 102 } }, { "defaultMessage": "!!!Reload Franz", "end": { "column": 3, - "line": 108 + "line": 109 }, "file": "src/lib/Menu.js", "id": "menu.view.reloadFranz", "start": { "column": 15, - "line": 105 + "line": 106 } }, { "defaultMessage": "!!!Minimize", "end": { "column": 3, - "line": 112 + "line": 113 }, "file": "src/lib/Menu.js", "id": "menu.window.minimize", "start": { "column": 12, - "line": 109 + "line": 110 } }, { "defaultMessage": "!!!Close", "end": { "column": 3, - "line": 116 + "line": 117 }, "file": "src/lib/Menu.js", "id": "menu.window.close", "start": { "column": 9, - "line": 113 + "line": 114 } }, { "defaultMessage": "!!!Learn More", "end": { "column": 3, - "line": 120 + "line": 121 }, "file": "src/lib/Menu.js", "id": "menu.help.learnMore", "start": { "column": 13, - "line": 117 + "line": 118 } }, { "defaultMessage": "!!!Changelog", "end": { "column": 3, - "line": 124 + "line": 125 }, "file": "src/lib/Menu.js", "id": "menu.help.changelog", "start": { "column": 13, - "line": 121 + "line": 122 } }, { "defaultMessage": "!!!Support", "end": { "column": 3, - "line": 128 + "line": 129 }, "file": "src/lib/Menu.js", "id": "menu.help.support", "start": { "column": 11, - "line": 125 + "line": 126 } }, { "defaultMessage": "!!!Terms of Service", "end": { "column": 3, - "line": 132 + "line": 133 }, "file": "src/lib/Menu.js", "id": "menu.help.tos", "start": { "column": 7, - "line": 129 + "line": 130 } }, { "defaultMessage": "!!!Privacy Statement", "end": { "column": 3, - "line": 136 + "line": 137 }, "file": "src/lib/Menu.js", "id": "menu.help.privacy", "start": { "column": 11, - "line": 133 + "line": 134 } }, { "defaultMessage": "!!!File", "end": { "column": 3, - "line": 140 + "line": 141 }, "file": "src/lib/Menu.js", "id": "menu.file", "start": { "column": 8, - "line": 137 + "line": 138 } }, { "defaultMessage": "!!!View", "end": { "column": 3, - "line": 144 + "line": 145 }, "file": "src/lib/Menu.js", "id": "menu.view", "start": { "column": 8, - "line": 141 + "line": 142 } }, { "defaultMessage": "!!!Services", "end": { "column": 3, - "line": 148 + "line": 149 }, "file": "src/lib/Menu.js", "id": "menu.services", "start": { "column": 12, - "line": 145 + "line": 146 } }, { "defaultMessage": "!!!Window", "end": { "column": 3, - "line": 152 + "line": 153 }, "file": "src/lib/Menu.js", "id": "menu.window", "start": { "column": 10, - "line": 149 + "line": 150 } }, { "defaultMessage": "!!!Help", "end": { "column": 3, - "line": 156 + "line": 157 }, "file": "src/lib/Menu.js", "id": "menu.help", "start": { "column": 8, - "line": 153 + "line": 154 } }, { "defaultMessage": "!!!About Franz", "end": { "column": 3, - "line": 160 + "line": 161 }, "file": "src/lib/Menu.js", "id": "menu.app.about", "start": { "column": 9, - "line": 157 + "line": 158 } }, { - "defaultMessage": "!!!What's new in Franz?", + "defaultMessage": "!!!What's new?", "end": { "column": 3, - "line": 164 + "line": 165 }, "file": "src/lib/Menu.js", "id": "menu.app.announcement", "start": { "column": 16, - "line": 161 + "line": 162 } }, { "defaultMessage": "!!!Settings", "end": { "column": 3, - "line": 168 + "line": 169 }, "file": "src/lib/Menu.js", "id": "menu.app.settings", "start": { "column": 12, - "line": 165 + "line": 166 } }, { "defaultMessage": "!!!Hide", "end": { "column": 3, - "line": 172 + "line": 173 }, "file": "src/lib/Menu.js", "id": "menu.app.hide", "start": { "column": 8, - "line": 169 + "line": 170 } }, { "defaultMessage": "!!!Hide Others", "end": { "column": 3, - "line": 176 + "line": 177 }, "file": "src/lib/Menu.js", "id": "menu.app.hideOthers", "start": { "column": 14, - "line": 173 + "line": 174 } }, { "defaultMessage": "!!!Unhide", "end": { "column": 3, - "line": 180 + "line": 181 }, "file": "src/lib/Menu.js", "id": "menu.app.unhide", "start": { "column": 10, - "line": 177 + "line": 178 } }, { "defaultMessage": "!!!Quit", "end": { "column": 3, - "line": 184 + "line": 185 }, "file": "src/lib/Menu.js", "id": "menu.app.quit", "start": { "column": 8, - "line": 181 + "line": 182 } }, { "defaultMessage": "!!!Add New Service...", "end": { "column": 3, - "line": 188 + "line": 189 }, "file": "src/lib/Menu.js", "id": "menu.services.addNewService", "start": { "column": 17, - "line": 185 + "line": 186 } }, { "defaultMessage": "!!!Add New Workspace...", "end": { "column": 3, - "line": 192 + "line": 193 }, "file": "src/lib/Menu.js", "id": "menu.workspaces.addNewWorkspace", "start": { "column": 19, - "line": 189 + "line": 190 } }, { "defaultMessage": "!!!Open workspace drawer", "end": { "column": 3, - "line": 196 + "line": 197 }, "file": "src/lib/Menu.js", "id": "menu.workspaces.openWorkspaceDrawer", "start": { "column": 23, - "line": 193 + "line": 194 } }, { "defaultMessage": "!!!Close workspace drawer", "end": { "column": 3, - "line": 200 + "line": 201 }, "file": "src/lib/Menu.js", "id": "menu.workspaces.closeWorkspaceDrawer", "start": { "column": 24, - "line": 197 + "line": 198 } }, { "defaultMessage": "!!!Activate next service...", "end": { "column": 3, - "line": 204 + "line": 205 }, "file": "src/lib/Menu.js", "id": "menu.services.setNextServiceActive", "start": { "column": 23, - "line": 201 + "line": 202 } }, { "defaultMessage": "!!!Activate previous service...", "end": { "column": 3, - "line": 208 + "line": 209 }, "file": "src/lib/Menu.js", "id": "menu.services.activatePreviousService", "start": { "column": 27, - "line": 205 + "line": 206 } }, { "defaultMessage": "!!!Disable notifications & audio", "end": { "column": 3, - "line": 212 + "line": 213 }, "file": "src/lib/Menu.js", "id": "sidebar.muteApp", "start": { "column": 11, - "line": 209 + "line": 210 } }, { "defaultMessage": "!!!Enable notifications & audio", "end": { "column": 3, - "line": 216 + "line": 217 }, "file": "src/lib/Menu.js", "id": "sidebar.unmuteApp", "start": { "column": 13, - "line": 213 + "line": 214 } }, { "defaultMessage": "!!!Workspaces", "end": { "column": 3, - "line": 220 + "line": 221 }, "file": "src/lib/Menu.js", "id": "menu.workspaces", "start": { "column": 14, - "line": 217 + "line": 218 } }, { "defaultMessage": "!!!Default", "end": { "column": 3, - "line": 224 + "line": 225 }, "file": "src/lib/Menu.js", "id": "menu.workspaces.defaultWorkspace", "start": { "column": 20, - "line": 221 + "line": 222 } } ], "path": "src/lib/Menu.json" } -] +] \ No newline at end of file diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 958b6fb6a..07602e61f 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -319,4 +319,4 @@ "workspaceDrawer.workspaceFeatureInfo": "

Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

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.

", "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", "workspaces.switchingIndicator.switchingTo": "Switching to" -} +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf From a120ff9413f89adf963ffc2a1570816012412208 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Fri, 12 Apr 2019 12:11:33 +0200 Subject: disable autofocus on create workspace input for free users --- src/features/workspaces/components/CreateWorkspaceForm.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/features/workspaces/components/CreateWorkspaceForm.js b/src/features/workspaces/components/CreateWorkspaceForm.js index 2c00ea63c..cddbb2b04 100644 --- a/src/features/workspaces/components/CreateWorkspaceForm.js +++ b/src/features/workspaces/components/CreateWorkspaceForm.js @@ -7,7 +7,7 @@ import injectSheet from 'react-jss'; import Form from '../../../lib/Form'; import { required } from '../../../helpers/validation-helpers'; import { gaEvent } from '../../../lib/analytics'; -import { GA_CATEGORY_WORKSPACES } from '../index'; +import { GA_CATEGORY_WORKSPACES, workspaceStore } from '../index'; const messages = defineMessages({ submitButton: { @@ -82,7 +82,7 @@ class CreateWorkspaceForm extends Component { {...form.$('name').bind()} showLabel={false} onEnterKey={this.submitForm.bind(this, form)} - focus + focus={workspaceStore.isUserAllowedToUseFeature} />
diff --git a/src/features/announcements/store.js b/src/features/announcements/store.js index 3c46828bb..b99309ca7 100644 --- a/src/features/announcements/store.js +++ b/src/features/announcements/store.js @@ -10,6 +10,8 @@ import localStorage from 'mobx-localstorage'; import { FeatureStore } from '../utils/FeatureStore'; import { getAnnouncementRequest, getChangelogRequest, getCurrentVersionRequest } from './api'; import { announcementActions } from './actions'; +import { createActionBindings } from '../utils/ActionBinding'; +import { createReactions } from '../../stores/lib/Reaction'; const LOCAL_STORAGE_KEY = 'announcements'; @@ -52,14 +54,15 @@ export class AnnouncementsStore extends FeatureStore { this.actions = actions; getCurrentVersionRequest.execute(); - this._registerActions([ + this._registerActions(createActionBindings([ [announcementActions.show, this._showAnnouncement], - ]); + ])); - this._registerReactions([ + this._reactions = createReactions([ this._fetchAnnouncements, this._showAnnouncementToUsersWhoUpdatedApp, ]); + this._registerReactions(this._reactions); this.isFeatureActive = true; } @@ -105,7 +108,6 @@ export class AnnouncementsStore extends FeatureStore { _showAnnouncementToUsersWhoUpdatedApp = () => { const { announcement, isNewUser } = this; - console.log(announcement, isNewUser); // Check if there is an announcement and on't show announcements to new users if (!announcement || isNewUser) return; @@ -125,7 +127,7 @@ export class AnnouncementsStore extends FeatureStore { _fetchAnnouncements = () => { const targetVersion = this.targetVersion || this.currentVersion; if (!targetVersion) return; - getChangelogRequest.execute('5.0.1'); - getAnnouncementRequest.execute('5.1.0'); + getChangelogRequest.execute(targetVersion); + getAnnouncementRequest.execute(targetVersion); } } diff --git a/src/features/utils/ActionBinding.js b/src/features/utils/ActionBinding.js new file mode 100644 index 000000000..497aa071b --- /dev/null +++ b/src/features/utils/ActionBinding.js @@ -0,0 +1,29 @@ +export default class ActionBinding { + action; + + isActive = false; + + constructor(action) { + this.action = action; + } + + start() { + if (!this.isActive) { + const { action } = this; + action[0].listen(action[1]); + this.isActive = true; + } + } + + stop() { + if (this.isActive) { + const { action } = this; + action[0].off(action[1]); + this.isActive = false; + } + } +} + +export const createActionBindings = actions => ( + actions.map(a => new ActionBinding(a)) +); diff --git a/src/features/utils/FeatureStore.js b/src/features/utils/FeatureStore.js index d863f7464..967e745b2 100644 --- a/src/features/utils/FeatureStore.js +++ b/src/features/utils/FeatureStore.js @@ -1,4 +1,4 @@ -import Reaction from '../../stores/lib/Reaction'; +import { union } from 'lodash'; export class FeatureStore { _actions = null; @@ -13,25 +13,24 @@ export class FeatureStore { // ACTIONS _registerActions(actions) { - this._actions = []; - actions.forEach(a => this._actions.push(a)); - this._startActions(this._actions); + this._actions = union(this._actions, actions); + this._startActions(); } _startActions(actions = this._actions) { - actions.forEach(a => a[0].listen(a[1])); + console.log(actions); + actions.forEach(a => a.start()); } _stopActions(actions = this._actions) { - actions.forEach(a => a[0].off(a[1])); + actions.forEach(a => a.stop()); } // REACTIONS _registerReactions(reactions) { - this._reactions = []; - reactions.forEach(r => this._reactions.push(new Reaction(r))); - this._startReactions(this._reactions); + this._reactions = union(this._reactions, reactions); + this._startReactions(); } _startReactions(reactions = this._reactions) { diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index bb18dc182..e11513d1f 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -14,6 +14,8 @@ import { updateWorkspaceRequest, } from './api'; import { WORKSPACES_ROUTES } from './index'; +import { createReactions } from '../../stores/lib/Reaction'; +import { createActionBindings } from '../utils/ActionBinding'; const debug = require('debug')('Franz:feature:workspaces:store'); @@ -80,41 +82,39 @@ export default class WorkspacesStore extends FeatureStore { // ACTIONS - this._freeUserActions = [ + this._freeUserActions = createActionBindings([ [workspaceActions.toggleWorkspaceDrawer, this._toggleWorkspaceDrawer], [workspaceActions.openWorkspaceSettings, this._openWorkspaceSettings], - ]; - this._premiumUserActions = [ + ]); + this._premiumUserActions = createActionBindings([ [workspaceActions.edit, this._edit], [workspaceActions.create, this._create], [workspaceActions.delete, this._delete], [workspaceActions.update, this._update], [workspaceActions.activate, this._setActiveWorkspace], [workspaceActions.deactivate, this._deactivateActiveWorkspace], - ]; + ]); this._allActions = this._freeUserActions.concat(this._premiumUserActions); this._registerActions(this._allActions); // REACTIONS - this._freeUserReactions = [ + this._freeUserReactions = createReactions([ this._stopPremiumActionsAndReactions, this._openDrawerWithSettingsReaction, this._setFeatureEnabledReaction, this._setIsPremiumFeatureReaction, this._cleanupInvalidServiceReferences, - ]; - this._premiumUserReactions = [ + ]); + this._premiumUserReactions = createReactions([ this._setActiveServiceOnWorkspaceSwitchReaction, this._activateLastUsedWorkspaceReaction, this._setWorkspaceBeingEditedReaction, - ]; + ]); this._allReactions = this._freeUserReactions.concat(this._premiumUserReactions); this._registerReactions(this._allReactions); - console.log(this._reactions); - getUserWorkspacesRequest.execute(); this.isFeatureActive = true; } diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json deleted file mode 100644 index 877e67588..000000000 --- a/src/i18n/locales/defaultMessages.json +++ /dev/null @@ -1,4473 +0,0 @@ -[ - { - "descriptors": [ - { - "defaultMessage": "!!!Import your Franz 4 services", - "end": { - "column": 3, - "line": 16 - }, - "file": "src/components/auth/Import.js", - "id": "import.headline", - "start": { - "column": 12, - "line": 13 - } - }, - { - "defaultMessage": "!!!Services not yet supported in Franz 5", - "end": { - "column": 3, - "line": 20 - }, - "file": "src/components/auth/Import.js", - "id": "import.notSupportedHeadline", - "start": { - "column": 24, - "line": 17 - } - }, - { - "defaultMessage": "!!!Import {count} services", - "end": { - "column": 3, - "line": 24 - }, - "file": "src/components/auth/Import.js", - "id": "import.submit.label", - "start": { - "column": 21, - "line": 21 - } - }, - { - "defaultMessage": "!!!I want to add services manually", - "end": { - "column": 3, - "line": 28 - }, - "file": "src/components/auth/Import.js", - "id": "import.skip.label", - "start": { - "column": 19, - "line": 25 - } - } - ], - "path": "src/components/auth/Import.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Invite Friends", - "end": { - "column": 3, - "line": 19 - }, - "file": "src/components/auth/Invite.js", - "id": "settings.invite.headline", - "start": { - "column": 20, - "line": 16 - } - }, - { - "defaultMessage": "!!!Invite 3 of your friends or colleagues", - "end": { - "column": 3, - "line": 23 - }, - "file": "src/components/auth/Invite.js", - "id": "invite.headline.friends", - "start": { - "column": 12, - "line": 20 - } - }, - { - "defaultMessage": "!!!Name", - "end": { - "column": 3, - "line": 27 - }, - "file": "src/components/auth/Invite.js", - "id": "invite.name.label", - "start": { - "column": 13, - "line": 24 - } - }, - { - "defaultMessage": "!!!Email address", - "end": { - "column": 3, - "line": 31 - }, - "file": "src/components/auth/Invite.js", - "id": "invite.email.label", - "start": { - "column": 14, - "line": 28 - } - }, - { - "defaultMessage": "!!!Send invites", - "end": { - "column": 3, - "line": 35 - }, - "file": "src/components/auth/Invite.js", - "id": "invite.submit.label", - "start": { - "column": 21, - "line": 32 - } - }, - { - "defaultMessage": "!!!I want to do this later", - "end": { - "column": 3, - "line": 39 - }, - "file": "src/components/auth/Invite.js", - "id": "invite.skip.label", - "start": { - "column": 19, - "line": 36 - } - }, - { - "defaultMessage": "!!!Invitations sent successfully", - "end": { - "column": 3, - "line": 43 - }, - "file": "src/components/auth/Invite.js", - "id": "invite.successInfo", - "start": { - "column": 21, - "line": 40 - } - } - ], - "path": "src/components/auth/Invite.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Sign in", - "end": { - "column": 3, - "line": 20 - }, - "file": "src/components/auth/Login.js", - "id": "login.headline", - "start": { - "column": 12, - "line": 17 - } - }, - { - "defaultMessage": "!!!Email address", - "end": { - "column": 3, - "line": 24 - }, - "file": "src/components/auth/Login.js", - "id": "login.email.label", - "start": { - "column": 14, - "line": 21 - } - }, - { - "defaultMessage": "!!!Password", - "end": { - "column": 3, - "line": 28 - }, - "file": "src/components/auth/Login.js", - "id": "login.password.label", - "start": { - "column": 17, - "line": 25 - } - }, - { - "defaultMessage": "!!!Sign in", - "end": { - "column": 3, - "line": 32 - }, - "file": "src/components/auth/Login.js", - "id": "login.submit.label", - "start": { - "column": 21, - "line": 29 - } - }, - { - "defaultMessage": "!!!Email or password not valid", - "end": { - "column": 3, - "line": 36 - }, - "file": "src/components/auth/Login.js", - "id": "login.invalidCredentials", - "start": { - "column": 22, - "line": 33 - } - }, - { - "defaultMessage": "!!!Your session expired, please login again.", - "end": { - "column": 3, - "line": 40 - }, - "file": "src/components/auth/Login.js", - "id": "login.tokenExpired", - "start": { - "column": 16, - "line": 37 - } - }, - { - "defaultMessage": "!!!Your session expired, please login again.", - "end": { - "column": 3, - "line": 44 - }, - "file": "src/components/auth/Login.js", - "id": "login.serverLogout", - "start": { - "column": 16, - "line": 41 - } - }, - { - "defaultMessage": "!!!Create a free account", - "end": { - "column": 3, - "line": 48 - }, - "file": "src/components/auth/Login.js", - "id": "login.link.signup", - "start": { - "column": 14, - "line": 45 - } - }, - { - "defaultMessage": "!!!Forgot password", - "end": { - "column": 3, - "line": 52 - }, - "file": "src/components/auth/Login.js", - "id": "login.link.password", - "start": { - "column": 16, - "line": 49 - } - } - ], - "path": "src/components/auth/Login.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Forgot password", - "end": { - "column": 3, - "line": 17 - }, - "file": "src/components/auth/Password.js", - "id": "password.headline", - "start": { - "column": 12, - "line": 14 - } - }, - { - "defaultMessage": "!!!Email address", - "end": { - "column": 3, - "line": 21 - }, - "file": "src/components/auth/Password.js", - "id": "password.email.label", - "start": { - "column": 14, - "line": 18 - } - }, - { - "defaultMessage": "!!!Submit", - "end": { - "column": 3, - "line": 25 - }, - "file": "src/components/auth/Password.js", - "id": "password.submit.label", - "start": { - "column": 21, - "line": 22 - } - }, - { - "defaultMessage": "!!!Your new password was sent to your email address", - "end": { - "column": 3, - "line": 29 - }, - "file": "src/components/auth/Password.js", - "id": "password.successInfo", - "start": { - "column": 15, - "line": 26 - } - }, - { - "defaultMessage": "!!!No user affiliated with that email address", - "end": { - "column": 3, - "line": 33 - }, - "file": "src/components/auth/Password.js", - "id": "password.noUser", - "start": { - "column": 10, - "line": 30 - } - }, - { - "defaultMessage": "!!!Create a free account", - "end": { - "column": 3, - "line": 37 - }, - "file": "src/components/auth/Password.js", - "id": "password.link.signup", - "start": { - "column": 14, - "line": 34 - } - }, - { - "defaultMessage": "!!!Sign in to your account", - "end": { - "column": 3, - "line": 41 - }, - "file": "src/components/auth/Password.js", - "id": "password.link.login", - "start": { - "column": 13, - "line": 38 - } - } - ], - "path": "src/components/auth/Password.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Support Franz", - "end": { - "column": 3, - "line": 16 - }, - "file": "src/components/auth/Pricing.js", - "id": "pricing.headline", - "start": { - "column": 12, - "line": 13 - } - }, - { - "defaultMessage": "!!!Select your support plan", - "end": { - "column": 3, - "line": 20 - }, - "file": "src/components/auth/Pricing.js", - "id": "pricing.support.label", - "start": { - "column": 23, - "line": 17 - } - }, - { - "defaultMessage": "!!!Support the development of Franz", - "end": { - "column": 3, - "line": 24 - }, - "file": "src/components/auth/Pricing.js", - "id": "pricing.submit.label", - "start": { - "column": 21, - "line": 21 - } - }, - { - "defaultMessage": "!!!I don't want to support the development of Franz.", - "end": { - "column": 3, - "line": 28 - }, - "file": "src/components/auth/Pricing.js", - "id": "pricing.link.skipPayment", - "start": { - "column": 15, - "line": 25 - } - } - ], - "path": "src/components/auth/Pricing.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Sign up", - "end": { - "column": 3, - "line": 21 - }, - "file": "src/components/auth/Signup.js", - "id": "signup.headline", - "start": { - "column": 12, - "line": 18 - } - }, - { - "defaultMessage": "!!!Firstname", - "end": { - "column": 3, - "line": 25 - }, - "file": "src/components/auth/Signup.js", - "id": "signup.firstname.label", - "start": { - "column": 18, - "line": 22 - } - }, - { - "defaultMessage": "!!!Lastname", - "end": { - "column": 3, - "line": 29 - }, - "file": "src/components/auth/Signup.js", - "id": "signup.lastname.label", - "start": { - "column": 17, - "line": 26 - } - }, - { - "defaultMessage": "!!!Email address", - "end": { - "column": 3, - "line": 33 - }, - "file": "src/components/auth/Signup.js", - "id": "signup.email.label", - "start": { - "column": 14, - "line": 30 - } - }, - { - "defaultMessage": "!!!Company", - "end": { - "column": 3, - "line": 37 - }, - "file": "src/components/auth/Signup.js", - "id": "signup.company.label", - "start": { - "column": 16, - "line": 34 - } - }, - { - "defaultMessage": "!!!Password", - "end": { - "column": 3, - "line": 41 - }, - "file": "src/components/auth/Signup.js", - "id": "signup.password.label", - "start": { - "column": 17, - "line": 38 - } - }, - { - "defaultMessage": "!!!By creating a Franz account you accept the", - "end": { - "column": 3, - "line": 45 - }, - "file": "src/components/auth/Signup.js", - "id": "signup.legal.info", - "start": { - "column": 13, - "line": 42 - } - }, - { - "defaultMessage": "!!!Terms of service", - "end": { - "column": 3, - "line": 49 - }, - "file": "src/components/auth/Signup.js", - "id": "signup.legal.terms", - "start": { - "column": 9, - "line": 46 - } - }, - { - "defaultMessage": "!!!Privacy Statement", - "end": { - "column": 3, - "line": 53 - }, - "file": "src/components/auth/Signup.js", - "id": "signup.legal.privacy", - "start": { - "column": 11, - "line": 50 - } - }, - { - "defaultMessage": "!!!Create account", - "end": { - "column": 3, - "line": 57 - }, - "file": "src/components/auth/Signup.js", - "id": "signup.submit.label", - "start": { - "column": 21, - "line": 54 - } - }, - { - "defaultMessage": "!!!Already have an account, sign in?", - "end": { - "column": 3, - "line": 61 - }, - "file": "src/components/auth/Signup.js", - "id": "signup.link.login", - "start": { - "column": 13, - "line": 58 - } - }, - { - "defaultMessage": "!!!A user with that email address already exists", - "end": { - "column": 3, - "line": 65 - }, - "file": "src/components/auth/Signup.js", - "id": "signup.emailDuplicate", - "start": { - "column": 18, - "line": 62 - } - } - ], - "path": "src/components/auth/Signup.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Create a free account", - "end": { - "column": 3, - "line": 12 - }, - "file": "src/components/auth/Welcome.js", - "id": "welcome.signupButton", - "start": { - "column": 16, - "line": 9 - } - }, - { - "defaultMessage": "!!!Login to your account", - "end": { - "column": 3, - "line": 16 - }, - "file": "src/components/auth/Welcome.js", - "id": "welcome.loginButton", - "start": { - "column": 15, - "line": 13 - } - } - ], - "path": "src/components/auth/Welcome.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Your services have been updated.", - "end": { - "column": 3, - "line": 29 - }, - "file": "src/components/layout/AppLayout.js", - "id": "infobar.servicesUpdated", - "start": { - "column": 19, - "line": 26 - } - }, - { - "defaultMessage": "!!!A new update for Franz is available.", - "end": { - "column": 3, - "line": 33 - }, - "file": "src/components/layout/AppLayout.js", - "id": "infobar.updateAvailable", - "start": { - "column": 19, - "line": 30 - } - }, - { - "defaultMessage": "!!!Reload services", - "end": { - "column": 3, - "line": 37 - }, - "file": "src/components/layout/AppLayout.js", - "id": "infobar.buttonReloadServices", - "start": { - "column": 24, - "line": 34 - } - }, - { - "defaultMessage": "!!!Changelog", - "end": { - "column": 3, - "line": 41 - }, - "file": "src/components/layout/AppLayout.js", - "id": "infobar.buttonChangelog", - "start": { - "column": 13, - "line": 38 - } - }, - { - "defaultMessage": "!!!Restart & install update", - "end": { - "column": 3, - "line": 45 - }, - "file": "src/components/layout/AppLayout.js", - "id": "infobar.buttonInstallUpdate", - "start": { - "column": 23, - "line": 42 - } - }, - { - "defaultMessage": "!!!Could not load services and user information", - "end": { - "column": 3, - "line": 49 - }, - "file": "src/components/layout/AppLayout.js", - "id": "infobar.requiredRequestsFailed", - "start": { - "column": 26, - "line": 46 - } - } - ], - "path": "src/components/layout/AppLayout.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Settings", - "end": { - "column": 3, - "line": 16 - }, - "file": "src/components/layout/Sidebar.js", - "id": "sidebar.settings", - "start": { - "column": 12, - "line": 13 - } - }, - { - "defaultMessage": "!!!Add new service", - "end": { - "column": 3, - "line": 20 - }, - "file": "src/components/layout/Sidebar.js", - "id": "sidebar.addNewService", - "start": { - "column": 17, - "line": 17 - } - }, - { - "defaultMessage": "!!!Disable notifications & audio", - "end": { - "column": 3, - "line": 24 - }, - "file": "src/components/layout/Sidebar.js", - "id": "sidebar.muteApp", - "start": { - "column": 8, - "line": 21 - } - }, - { - "defaultMessage": "!!!Enable notifications & audio", - "end": { - "column": 3, - "line": 28 - }, - "file": "src/components/layout/Sidebar.js", - "id": "sidebar.unmuteApp", - "start": { - "column": 10, - "line": 25 - } - }, - { - "defaultMessage": "!!!Open workspace drawer", - "end": { - "column": 3, - "line": 32 - }, - "file": "src/components/layout/Sidebar.js", - "id": "sidebar.openWorkspaceDrawer", - "start": { - "column": 23, - "line": 29 - } - }, - { - "defaultMessage": "!!!Close workspace drawer", - "end": { - "column": 3, - "line": 36 - }, - "file": "src/components/layout/Sidebar.js", - "id": "sidebar.closeWorkspaceDrawer", - "start": { - "column": 24, - "line": 33 - } - } - ], - "path": "src/components/layout/Sidebar.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Oh no!", - "end": { - "column": 3, - "line": 15 - }, - "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js", - "id": "service.errorHandler.headline", - "start": { - "column": 12, - "line": 12 - } - }, - { - "defaultMessage": "!!!{name} has failed to load.", - "end": { - "column": 3, - "line": 19 - }, - "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js", - "id": "service.errorHandler.text", - "start": { - "column": 8, - "line": 16 - } - }, - { - "defaultMessage": "!!!Reload {name}", - "end": { - "column": 3, - "line": 23 - }, - "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js", - "id": "service.errorHandler.action", - "start": { - "column": 10, - "line": 20 - } - }, - { - "defaultMessage": "!!!Edit {name}", - "end": { - "column": 3, - "line": 27 - }, - "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js", - "id": "service.errorHandler.editAction", - "start": { - "column": 14, - "line": 24 - } - }, - { - "defaultMessage": "!!!Error:", - "end": { - "column": 3, - "line": 31 - }, - "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js", - "id": "service.errorHandler.message", - "start": { - "column": 16, - "line": 28 - } - } - ], - "path": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!{name} is disabled", - "end": { - "column": 3, - "line": 12 - }, - "file": "src/components/services/content/ServiceDisabled.js", - "id": "service.disabledHandler.headline", - "start": { - "column": 12, - "line": 9 - } - }, - { - "defaultMessage": "!!!Enable {name}", - "end": { - "column": 3, - "line": 16 - }, - "file": "src/components/services/content/ServiceDisabled.js", - "id": "service.disabledHandler.action", - "start": { - "column": 10, - "line": 13 - } - } - ], - "path": "src/components/services/content/ServiceDisabled.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Welcome to Franz", - "end": { - "column": 3, - "line": 14 - }, - "file": "src/components/services/content/Services.js", - "id": "services.welcome", - "start": { - "column": 11, - "line": 11 - } - }, - { - "defaultMessage": "!!!Get started", - "end": { - "column": 3, - "line": 18 - }, - "file": "src/components/services/content/Services.js", - "id": "services.getStarted", - "start": { - "column": 14, - "line": 15 - } - } - ], - "path": "src/components/services/content/Services.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Oh no!", - "end": { - "column": 3, - "line": 13 - }, - "file": "src/components/services/content/WebviewCrashHandler.js", - "id": "service.crashHandler.headline", - "start": { - "column": 12, - "line": 10 - } - }, - { - "defaultMessage": "!!!{name} has caused an error.", - "end": { - "column": 3, - "line": 17 - }, - "file": "src/components/services/content/WebviewCrashHandler.js", - "id": "service.crashHandler.text", - "start": { - "column": 8, - "line": 14 - } - }, - { - "defaultMessage": "!!!Reload {name}", - "end": { - "column": 3, - "line": 21 - }, - "file": "src/components/services/content/WebviewCrashHandler.js", - "id": "service.crashHandler.action", - "start": { - "column": 10, - "line": 18 - } - }, - { - "defaultMessage": "!!!Trying to automatically restore {name} in {seconds} seconds", - "end": { - "column": 3, - "line": 25 - }, - "file": "src/components/services/content/WebviewCrashHandler.js", - "id": "service.crashHandler.autoReload", - "start": { - "column": 14, - "line": 22 - } - } - ], - "path": "src/components/services/content/WebviewCrashHandler.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Reload", - "end": { - "column": 3, - "line": 18 - }, - "file": "src/components/services/tabs/TabItem.js", - "id": "tabs.item.reload", - "start": { - "column": 10, - "line": 15 - } - }, - { - "defaultMessage": "!!!Edit", - "end": { - "column": 3, - "line": 22 - }, - "file": "src/components/services/tabs/TabItem.js", - "id": "tabs.item.edit", - "start": { - "column": 8, - "line": 19 - } - }, - { - "defaultMessage": "!!!Disable notifications", - "end": { - "column": 3, - "line": 26 - }, - "file": "src/components/services/tabs/TabItem.js", - "id": "tabs.item.disableNotifications", - "start": { - "column": 24, - "line": 23 - } - }, - { - "defaultMessage": "!!!Enable notifications", - "end": { - "column": 3, - "line": 30 - }, - "file": "src/components/services/tabs/TabItem.js", - "id": "tabs.item.enableNotification", - "start": { - "column": 23, - "line": 27 - } - }, - { - "defaultMessage": "!!!Disable audio", - "end": { - "column": 3, - "line": 34 - }, - "file": "src/components/services/tabs/TabItem.js", - "id": "tabs.item.disableAudio", - "start": { - "column": 16, - "line": 31 - } - }, - { - "defaultMessage": "!!!Enable audio", - "end": { - "column": 3, - "line": 38 - }, - "file": "src/components/services/tabs/TabItem.js", - "id": "tabs.item.enableAudio", - "start": { - "column": 15, - "line": 35 - } - }, - { - "defaultMessage": "!!!Disable Service", - "end": { - "column": 3, - "line": 42 - }, - "file": "src/components/services/tabs/TabItem.js", - "id": "tabs.item.disableService", - "start": { - "column": 18, - "line": 39 - } - }, - { - "defaultMessage": "!!!Enable Service", - "end": { - "column": 3, - "line": 46 - }, - "file": "src/components/services/tabs/TabItem.js", - "id": "tabs.item.enableService", - "start": { - "column": 17, - "line": 43 - } - }, - { - "defaultMessage": "!!!Delete Service", - "end": { - "column": 3, - "line": 50 - }, - "file": "src/components/services/tabs/TabItem.js", - "id": "tabs.item.deleteService", - "start": { - "column": 17, - "line": 47 - } - } - ], - "path": "src/components/services/tabs/TabItem.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Account", - "end": { - "column": 3, - "line": 18 - }, - "file": "src/components/settings/account/AccountDashboard.js", - "id": "settings.account.headline", - "start": { - "column": 12, - "line": 15 - } - }, - { - "defaultMessage": "!!!Your Subscription", - "end": { - "column": 3, - "line": 22 - }, - "file": "src/components/settings/account/AccountDashboard.js", - "id": "settings.account.headlineSubscription", - "start": { - "column": 24, - "line": 19 - } - }, - { - "defaultMessage": "!!!Upgrade your Account", - "end": { - "column": 3, - "line": 26 - }, - "file": "src/components/settings/account/AccountDashboard.js", - "id": "settings.account.headlineUpgrade", - "start": { - "column": 19, - "line": 23 - } - }, - { - "defaultMessage": "!!Invoices", - "end": { - "column": 3, - "line": 30 - }, - "file": "src/components/settings/account/AccountDashboard.js", - "id": "settings.account.headlineInvoices", - "start": { - "column": 20, - "line": 27 - } - }, - { - "defaultMessage": "!!Danger Zone", - "end": { - "column": 3, - "line": 34 - }, - "file": "src/components/settings/account/AccountDashboard.js", - "id": "settings.account.headlineDangerZone", - "start": { - "column": 22, - "line": 31 - } - }, - { - "defaultMessage": "!!!Manage your subscription", - "end": { - "column": 3, - "line": 38 - }, - "file": "src/components/settings/account/AccountDashboard.js", - "id": "settings.account.manageSubscription.label", - "start": { - "column": 33, - "line": 35 - } - }, - { - "defaultMessage": "!!!Basic Account", - "end": { - "column": 3, - "line": 42 - }, - "file": "src/components/settings/account/AccountDashboard.js", - "id": "settings.account.accountType.basic", - "start": { - "column": 20, - "line": 39 - } - }, - { - "defaultMessage": "!!!Premium Supporter Account", - "end": { - "column": 3, - "line": 46 - }, - "file": "src/components/settings/account/AccountDashboard.js", - "id": "settings.account.accountType.premium", - "start": { - "column": 22, - "line": 43 - } - }, - { - "defaultMessage": "!!!Edit Account", - "end": { - "column": 3, - "line": 50 - }, - "file": "src/components/settings/account/AccountDashboard.js", - "id": "settings.account.account.editButton", - "start": { - "column": 21, - "line": 47 - } - }, - { - "defaultMessage": "!!!Download", - "end": { - "column": 3, - "line": 54 - }, - "file": "src/components/settings/account/AccountDashboard.js", - "id": "settings.account.invoiceDownload", - "start": { - "column": 19, - "line": 51 - } - }, - { - "defaultMessage": "!!!Could not load user information", - "end": { - "column": 3, - "line": 58 - }, - "file": "src/components/settings/account/AccountDashboard.js", - "id": "settings.account.userInfoRequestFailed", - "start": { - "column": 25, - "line": 55 - } - }, - { - "defaultMessage": "!!!Try again", - "end": { - "column": 3, - "line": 62 - }, - "file": "src/components/settings/account/AccountDashboard.js", - "id": "settings.account.tryReloadUserInfoRequest", - "start": { - "column": 28, - "line": 59 - } - }, - { - "defaultMessage": "!!!Delete account", - "end": { - "column": 3, - "line": 66 - }, - "file": "src/components/settings/account/AccountDashboard.js", - "id": "settings.account.deleteAccount", - "start": { - "column": 17, - "line": 63 - } - }, - { - "defaultMessage": "!!!If you don't need your Franz account any longer, you can delete your account and all related data here.", - "end": { - "column": 3, - "line": 70 - }, - "file": "src/components/settings/account/AccountDashboard.js", - "id": "settings.account.deleteInfo", - "start": { - "column": 14, - "line": 67 - } - }, - { - "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!", - "end": { - "column": 3, - "line": 74 - }, - "file": "src/components/settings/account/AccountDashboard.js", - "id": "settings.account.deleteEmailSent", - "start": { - "column": 19, - "line": 71 - } - } - ], - "path": "src/components/settings/account/AccountDashboard.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Available services", - "end": { - "column": 3, - "line": 15 - }, - "file": "src/components/settings/navigation/SettingsNavigation.js", - "id": "settings.navigation.availableServices", - "start": { - "column": 21, - "line": 12 - } - }, - { - "defaultMessage": "!!!Your services", - "end": { - "column": 3, - "line": 19 - }, - "file": "src/components/settings/navigation/SettingsNavigation.js", - "id": "settings.navigation.yourServices", - "start": { - "column": 16, - "line": 16 - } - }, - { - "defaultMessage": "!!!Your workspaces", - "end": { - "column": 3, - "line": 23 - }, - "file": "src/components/settings/navigation/SettingsNavigation.js", - "id": "settings.navigation.yourWorkspaces", - "start": { - "column": 18, - "line": 20 - } - }, - { - "defaultMessage": "!!!Account", - "end": { - "column": 3, - "line": 27 - }, - "file": "src/components/settings/navigation/SettingsNavigation.js", - "id": "settings.navigation.account", - "start": { - "column": 11, - "line": 24 - } - }, - { - "defaultMessage": "!!!Settings", - "end": { - "column": 3, - "line": 31 - }, - "file": "src/components/settings/navigation/SettingsNavigation.js", - "id": "settings.navigation.settings", - "start": { - "column": 12, - "line": 28 - } - }, - { - "defaultMessage": "!!!Invite Friends", - "end": { - "column": 3, - "line": 35 - }, - "file": "src/components/settings/navigation/SettingsNavigation.js", - "id": "settings.navigation.inviteFriends", - "start": { - "column": 17, - "line": 32 - } - }, - { - "defaultMessage": "!!!Logout", - "end": { - "column": 3, - "line": 39 - }, - "file": "src/components/settings/navigation/SettingsNavigation.js", - "id": "settings.navigation.logout", - "start": { - "column": 10, - "line": 36 - } - } - ], - "path": "src/components/settings/navigation/SettingsNavigation.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Available Services", - "end": { - "column": 3, - "line": 18 - }, - "file": "src/components/settings/recipes/RecipesDashboard.js", - "id": "settings.recipes.headline", - "start": { - "column": 12, - "line": 15 - } - }, - { - "defaultMessage": "!!!Search service", - "end": { - "column": 3, - "line": 22 - }, - "file": "src/components/settings/recipes/RecipesDashboard.js", - "id": "settings.searchService", - "start": { - "column": 17, - "line": 19 - } - }, - { - "defaultMessage": "!!!Most popular", - "end": { - "column": 3, - "line": 26 - }, - "file": "src/components/settings/recipes/RecipesDashboard.js", - "id": "settings.recipes.mostPopular", - "start": { - "column": 22, - "line": 23 - } - }, - { - "defaultMessage": "!!!All services", - "end": { - "column": 3, - "line": 30 - }, - "file": "src/components/settings/recipes/RecipesDashboard.js", - "id": "settings.recipes.all", - "start": { - "column": 14, - "line": 27 - } - }, - { - "defaultMessage": "!!!Development", - "end": { - "column": 3, - "line": 34 - }, - "file": "src/components/settings/recipes/RecipesDashboard.js", - "id": "settings.recipes.dev", - "start": { - "column": 14, - "line": 31 - } - }, - { - "defaultMessage": "!!!Sorry, but no service matched your search term.", - "end": { - "column": 3, - "line": 38 - }, - "file": "src/components/settings/recipes/RecipesDashboard.js", - "id": "settings.recipes.nothingFound", - "start": { - "column": 16, - "line": 35 - } - }, - { - "defaultMessage": "!!!Service successfully added", - "end": { - "column": 3, - "line": 42 - }, - "file": "src/components/settings/recipes/RecipesDashboard.js", - "id": "settings.recipes.servicesSuccessfulAddedInfo", - "start": { - "column": 31, - "line": 39 - } - }, - { - "defaultMessage": "!!!Missing a service?", - "end": { - "column": 3, - "line": 46 - }, - "file": "src/components/settings/recipes/RecipesDashboard.js", - "id": "settings.recipes.missingService", - "start": { - "column": 18, - "line": 43 - } - } - ], - "path": "src/components/settings/recipes/RecipesDashboard.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Save service", - "end": { - "column": 3, - "line": 25 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.saveButton", - "start": { - "column": 15, - "line": 22 - } - }, - { - "defaultMessage": "!!!Delete Service", - "end": { - "column": 3, - "line": 29 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.deleteButton", - "start": { - "column": 17, - "line": 26 - } - }, - { - "defaultMessage": "!!!Available services", - "end": { - "column": 3, - "line": 33 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.availableServices", - "start": { - "column": 21, - "line": 30 - } - }, - { - "defaultMessage": "!!!Your services", - "end": { - "column": 3, - "line": 37 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.yourServices", - "start": { - "column": 16, - "line": 34 - } - }, - { - "defaultMessage": "!!!Add {name}", - "end": { - "column": 3, - "line": 41 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.addServiceHeadline", - "start": { - "column": 22, - "line": 38 - } - }, - { - "defaultMessage": "!!!Edit {name}", - "end": { - "column": 3, - "line": 45 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.editServiceHeadline", - "start": { - "column": 23, - "line": 42 - } - }, - { - "defaultMessage": "!!!Hosted", - "end": { - "column": 3, - "line": 49 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.tabHosted", - "start": { - "column": 13, - "line": 46 - } - }, - { - "defaultMessage": "!!!Self hosted ⭐️", - "end": { - "column": 3, - "line": 53 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.tabOnPremise", - "start": { - "column": 16, - "line": 50 - } - }, - { - "defaultMessage": "!!!Use the hosted {name} service.", - "end": { - "column": 3, - "line": 57 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.useHostedService", - "start": { - "column": 20, - "line": 54 - } - }, - { - "defaultMessage": "!!!Could not validate custom {name} server.", - "end": { - "column": 3, - "line": 61 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.customUrlValidationError", - "start": { - "column": 28, - "line": 58 - } - }, - { - "defaultMessage": "!!!To add self hosted services, you need a Franz Premium Supporter Account.", - "end": { - "column": 3, - "line": 65 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.customUrlPremiumInfo", - "start": { - "column": 24, - "line": 62 - } - }, - { - "defaultMessage": "!!!Upgrade your account", - "end": { - "column": 3, - "line": 69 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.customUrlUpgradeAccount", - "start": { - "column": 27, - "line": 66 - } - }, - { - "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...", - "end": { - "column": 3, - "line": 73 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.indirectMessageInfo", - "start": { - "column": 23, - "line": 70 - } - }, - { - "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted", - "end": { - "column": 3, - "line": 77 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.isMutedInfo", - "start": { - "column": 15, - "line": 74 - } - }, - { - "defaultMessage": "!!!Notifications", - "end": { - "column": 3, - "line": 81 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.headlineNotifications", - "start": { - "column": 25, - "line": 78 - } - }, - { - "defaultMessage": "!!!Unread message badges", - "end": { - "column": 3, - "line": 85 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.headlineBadges", - "start": { - "column": 18, - "line": 82 - } - }, - { - "defaultMessage": "!!!General", - "end": { - "column": 3, - "line": 89 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.headlineGeneral", - "start": { - "column": 19, - "line": 86 - } - }, - { - "defaultMessage": "!!!Delete", - "end": { - "column": 3, - "line": 93 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.iconDelete", - "start": { - "column": 14, - "line": 90 - } - }, - { - "defaultMessage": "!!!Drop your image, or click here", - "end": { - "column": 3, - "line": 97 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.iconUpload", - "start": { - "column": 14, - "line": 94 - } - }, - { - "defaultMessage": "!!!HTTP/HTTPS Proxy Settings", - "end": { - "column": 3, - "line": 101 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.proxy.headline", - "start": { - "column": 17, - "line": 98 - } - }, - { - "defaultMessage": "!!!Please restart Franz after changing proxy Settings.", - "end": { - "column": 3, - "line": 105 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.proxy.restartInfo", - "start": { - "column": 20, - "line": 102 - } - }, - { - "defaultMessage": "!!!Proxy settings will not be synchronized with the Franz servers.", - "end": { - "column": 3, - "line": 109 - }, - "file": "src/components/settings/services/EditServiceForm.js", - "id": "settings.service.form.proxy.info", - "start": { - "column": 13, - "line": 106 - } - } - ], - "path": "src/components/settings/services/EditServiceForm.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Error", - "end": { - "column": 3, - "line": 13 - }, - "file": "src/components/settings/services/ServiceError.js", - "id": "settings.service.error.headline", - "start": { - "column": 12, - "line": 10 - } - }, - { - "defaultMessage": "!!!Back to services", - "end": { - "column": 3, - "line": 17 - }, - "file": "src/components/settings/services/ServiceError.js", - "id": "settings.service.error.goBack", - "start": { - "column": 10, - "line": 14 - } - }, - { - "defaultMessage": "!!!Available services", - "end": { - "column": 3, - "line": 21 - }, - "file": "src/components/settings/services/ServiceError.js", - "id": "settings.service.form.availableServices", - "start": { - "column": 21, - "line": 18 - } - }, - { - "defaultMessage": "!!!Could not load service recipe.", - "end": { - "column": 3, - "line": 25 - }, - "file": "src/components/settings/services/ServiceError.js", - "id": "settings.service.error.message", - "start": { - "column": 16, - "line": 22 - } - } - ], - "path": "src/components/settings/services/ServiceError.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Service is disabled", - "end": { - "column": 3, - "line": 14 - }, - "file": "src/components/settings/services/ServiceItem.js", - "id": "settings.services.tooltip.isDisabled", - "start": { - "column": 21, - "line": 11 - } - }, - { - "defaultMessage": "!!!Notifications are disabled", - "end": { - "column": 3, - "line": 18 - }, - "file": "src/components/settings/services/ServiceItem.js", - "id": "settings.services.tooltip.notificationsDisabled", - "start": { - "column": 32, - "line": 15 - } - }, - { - "defaultMessage": "!!!All sounds are muted", - "end": { - "column": 3, - "line": 22 - }, - "file": "src/components/settings/services/ServiceItem.js", - "id": "settings.services.tooltip.isMuted", - "start": { - "column": 18, - "line": 19 - } - } - ], - "path": "src/components/settings/services/ServiceItem.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Your services", - "end": { - "column": 3, - "line": 17 - }, - "file": "src/components/settings/services/ServicesDashboard.js", - "id": "settings.services.headline", - "start": { - "column": 12, - "line": 14 - } - }, - { - "defaultMessage": "!!!Search service", - "end": { - "column": 3, - "line": 21 - }, - "file": "src/components/settings/services/ServicesDashboard.js", - "id": "settings.searchService", - "start": { - "column": 17, - "line": 18 - } - }, - { - "defaultMessage": "!!!You haven't added any services yet.", - "end": { - "column": 3, - "line": 25 - }, - "file": "src/components/settings/services/ServicesDashboard.js", - "id": "settings.services.noServicesAdded", - "start": { - "column": 19, - "line": 22 - } - }, - { - "defaultMessage": "!!!Sorry, but no service matched your search term.", - "end": { - "column": 3, - "line": 29 - }, - "file": "src/components/settings/services/ServicesDashboard.js", - "id": "settings.recipes.nothingFound", - "start": { - "column": 18, - "line": 26 - } - }, - { - "defaultMessage": "!!!Discover services", - "end": { - "column": 3, - "line": 33 - }, - "file": "src/components/settings/services/ServicesDashboard.js", - "id": "settings.services.discoverServices", - "start": { - "column": 20, - "line": 30 - } - }, - { - "defaultMessage": "!!!Could not load your services", - "end": { - "column": 3, - "line": 37 - }, - "file": "src/components/settings/services/ServicesDashboard.js", - "id": "settings.services.servicesRequestFailed", - "start": { - "column": 25, - "line": 34 - } - }, - { - "defaultMessage": "!!!Try again", - "end": { - "column": 3, - "line": 41 - }, - "file": "src/components/settings/services/ServicesDashboard.js", - "id": "settings.account.tryReloadServices", - "start": { - "column": 21, - "line": 38 - } - }, - { - "defaultMessage": "!!!Your changes have been saved", - "end": { - "column": 3, - "line": 45 - }, - "file": "src/components/settings/services/ServicesDashboard.js", - "id": "settings.services.updatedInfo", - "start": { - "column": 15, - "line": 42 - } - }, - { - "defaultMessage": "!!!Service has been deleted", - "end": { - "column": 3, - "line": 49 - }, - "file": "src/components/settings/services/ServicesDashboard.js", - "id": "settings.services.deletedInfo", - "start": { - "column": 15, - "line": 46 - } - } - ], - "path": "src/components/settings/services/ServicesDashboard.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Settings", - "end": { - "column": 3, - "line": 19 - }, - "file": "src/components/settings/settings/EditSettingsForm.js", - "id": "settings.app.headline", - "start": { - "column": 12, - "line": 16 - } - }, - { - "defaultMessage": "!!!General", - "end": { - "column": 3, - "line": 23 - }, - "file": "src/components/settings/settings/EditSettingsForm.js", - "id": "settings.app.headlineGeneral", - "start": { - "column": 19, - "line": 20 - } - }, - { - "defaultMessage": "!!!Language", - "end": { - "column": 3, - "line": 27 - }, - "file": "src/components/settings/settings/EditSettingsForm.js", - "id": "settings.app.headlineLanguage", - "start": { - "column": 20, - "line": 24 - } - }, - { - "defaultMessage": "!!!Updates", - "end": { - "column": 3, - "line": 31 - }, - "file": "src/components/settings/settings/EditSettingsForm.js", - "id": "settings.app.headlineUpdates", - "start": { - "column": 19, - "line": 28 - } - }, - { - "defaultMessage": "!!!Appearance", - "end": { - "column": 3, - "line": 35 - }, - "file": "src/components/settings/settings/EditSettingsForm.js", - "id": "settings.app.headlineAppearance", - "start": { - "column": 22, - "line": 32 - } - }, - { - "defaultMessage": "!!!Advanced", - "end": { - "column": 3, - "line": 39 - }, - "file": "src/components/settings/settings/EditSettingsForm.js", - "id": "settings.app.headlineAdvanced", - "start": { - "column": 20, - "line": 36 - } - }, - { - "defaultMessage": "!!!Help us to translate Franz into your language.", - "end": { - "column": 3, - "line": 43 - }, - "file": "src/components/settings/settings/EditSettingsForm.js", - "id": "settings.app.translationHelp", - "start": { - "column": 19, - "line": 40 - } - }, - { - "defaultMessage": "!!!Cache", - "end": { - "column": 3, - "line": 47 - }, - "file": "src/components/settings/settings/EditSettingsForm.js", - "id": "settings.app.subheadlineCache", - "start": { - "column": 20, - "line": 44 - } - }, - { - "defaultMessage": "!!!Franz cache is currently using {size} of disk space.", - "end": { - "column": 3, - "line": 51 - }, - "file": "src/components/settings/settings/EditSettingsForm.js", - "id": "settings.app.cacheInfo", - "start": { - "column": 13, - "line": 48 - } - }, - { - "defaultMessage": "!!!Clear cache", - "end": { - "column": 3, - "line": 55 - }, - "file": "src/components/settings/settings/EditSettingsForm.js", - "id": "settings.app.buttonClearAllCache", - "start": { - "column": 23, - "line": 52 - } - }, - { - "defaultMessage": "!!!Check for updates", - "end": { - "column": 3, - "line": 59 - }, - "file": "src/components/settings/settings/EditSettingsForm.js", - "id": "settings.app.buttonSearchForUpdate", - "start": { - "column": 25, - "line": 56 - } - }, - { - "defaultMessage": "!!!Restart & install update", - "end": { - "column": 3, - "line": 63 - }, - "file": "src/components/settings/settings/EditSettingsForm.js", - "id": "settings.app.buttonInstallUpdate", - "start": { - "column": 23, - "line": 60 - } - }, - { - "defaultMessage": "!!!Is searching for update", - "end": { - "column": 3, - "line": 67 - }, - "file": "src/components/settings/settings/EditSettingsForm.js", - "id": "settings.app.updateStatusSearching", - "start": { - "column": 25, - "line": 64 - } - }, - { - "defaultMessage": "!!!Update available, downloading...", - "end": { - "column": 3, - "line": 71 - }, - "file": "src/components/settings/settings/EditSettingsForm.js", - "id": "settings.app.updateStatusAvailable", - "start": { - "column": 25, - "line": 68 - } - }, - { - "defaultMessage": "!!!You are using the latest version of Franz", - "end": { - "column": 3, - "line": 75 - }, - "file": "src/components/settings/settings/EditSettingsForm.js", - "id": "settings.app.updateStatusUpToDate", - "start": { - "column": 24, - "line": 72 - } - }, - { - "defaultMessage": "!!!Current version:", - "end": { - "column": 3, - "line": 79 - }, - "file": "src/components/settings/settings/EditSettingsForm.js", - "id": "settings.app.currentVersion", - "start": { - "column": 18, - "line": 76 - } - }, - { - "defaultMessage": "!!!Changes require restart", - "end": { - "column": 3, - "line": 83 - }, - "file": "src/components/settings/settings/EditSettingsForm.js", - "id": "settings.app.restartRequired", - "start": { - "column": 29, - "line": 80 - } - } - ], - "path": "src/components/settings/settings/EditSettingsForm.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Account", - "end": { - "column": 3, - "line": 18 - }, - "file": "src/components/settings/user/EditUserForm.js", - "id": "settings.account.headline", - "start": { - "column": 12, - "line": 15 - } - }, - { - "defaultMessage": "!!!Update Profile", - "end": { - "column": 3, - "line": 22 - }, - "file": "src/components/settings/user/EditUserForm.js", - "id": "settings.account.headlineProfile", - "start": { - "column": 19, - "line": 19 - } - }, - { - "defaultMessage": "!!!Account Information", - "end": { - "column": 3, - "line": 26 - }, - "file": "src/components/settings/user/EditUserForm.js", - "id": "settings.account.headlineAccount", - "start": { - "column": 19, - "line": 23 - } - }, - { - "defaultMessage": "!!!Change Password", - "end": { - "column": 3, - "line": 30 - }, - "file": "src/components/settings/user/EditUserForm.js", - "id": "settings.account.headlinePassword", - "start": { - "column": 20, - "line": 27 - } - }, - { - "defaultMessage": "!!!Your changes have been saved", - "end": { - "column": 3, - "line": 34 - }, - "file": "src/components/settings/user/EditUserForm.js", - "id": "settings.account.successInfo", - "start": { - "column": 15, - "line": 31 - } - }, - { - "defaultMessage": "!!!Update profile", - "end": { - "column": 3, - "line": 38 - }, - "file": "src/components/settings/user/EditUserForm.js", - "id": "settings.account.buttonSave", - "start": { - "column": 14, - "line": 35 - } - } - ], - "path": "src/components/settings/user/EditUserForm.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Support the development of Franz", - "end": { - "column": 3, - "line": 17 - }, - "file": "src/components/subscription/SubscriptionForm.js", - "id": "subscription.submit.label", - "start": { - "column": 21, - "line": 14 - } - }, - { - "defaultMessage": "!!!Could not initialize payment form", - "end": { - "column": 3, - "line": 21 - }, - "file": "src/components/subscription/SubscriptionForm.js", - "id": "subscription.paymentSessionError", - "start": { - "column": 23, - "line": 18 - } - }, - { - "defaultMessage": "!!!free", - "end": { - "column": 3, - "line": 25 - }, - "file": "src/components/subscription/SubscriptionForm.js", - "id": "subscription.type.free", - "start": { - "column": 12, - "line": 22 - } - }, - { - "defaultMessage": "!!!month", - "end": { - "column": 3, - "line": 29 - }, - "file": "src/components/subscription/SubscriptionForm.js", - "id": "subscription.type.month", - "start": { - "column": 15, - "line": 26 - } - }, - { - "defaultMessage": "!!!year", - "end": { - "column": 3, - "line": 33 - }, - "file": "src/components/subscription/SubscriptionForm.js", - "id": "subscription.type.year", - "start": { - "column": 14, - "line": 30 - } - }, - { - "defaultMessage": "!!!The Franz Premium Supporter Account includes", - "end": { - "column": 3, - "line": 37 - }, - "file": "src/components/subscription/SubscriptionForm.js", - "id": "subscription.includedFeatures", - "start": { - "column": 20, - "line": 34 - } - }, - { - "defaultMessage": "!!!Add on-premise/hosted services like Mattermost", - "end": { - "column": 3, - "line": 41 - }, - "file": "src/components/subscription/SubscriptionForm.js", - "id": "subscription.features.onpremise.mattermost", - "start": { - "column": 13, - "line": 38 - } - }, - { - "defaultMessage": "!!!No app delays & nagging to upgrade license", - "end": { - "column": 3, - "line": 45 - }, - "file": "src/components/subscription/SubscriptionForm.js", - "id": "subscription.features.noInterruptions", - "start": { - "column": 19, - "line": 42 - } - }, - { - "defaultMessage": "!!!Proxy support for services", - "end": { - "column": 3, - "line": 49 - }, - "file": "src/components/subscription/SubscriptionForm.js", - "id": "subscription.features.proxy", - "start": { - "column": 9, - "line": 46 - } - }, - { - "defaultMessage": "!!!Support for Spellchecker", - "end": { - "column": 3, - "line": 53 - }, - "file": "src/components/subscription/SubscriptionForm.js", - "id": "subscription.features.spellchecker", - "start": { - "column": 16, - "line": 50 - } - }, - { - "defaultMessage": "!!!No ads, ever!", - "end": { - "column": 3, - "line": 57 - }, - "file": "src/components/subscription/SubscriptionForm.js", - "id": "subscription.features.ads", - "start": { - "column": 7, - "line": 54 - } - }, - { - "defaultMessage": "!!!coming soon", - "end": { - "column": 3, - "line": 61 - }, - "file": "src/components/subscription/SubscriptionForm.js", - "id": "subscription.features.comingSoon", - "start": { - "column": 14, - "line": 58 - } - }, - { - "defaultMessage": "!!!EU residents: local sales tax may apply", - "end": { - "column": 3, - "line": 65 - }, - "file": "src/components/subscription/SubscriptionForm.js", - "id": "subscription.euTaxInfo", - "start": { - "column": 13, - "line": 62 - } - } - ], - "path": "src/components/subscription/SubscriptionForm.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Cancel", - "end": { - "column": 3, - "line": 14 - }, - "file": "src/components/subscription/SubscriptionPopup.js", - "id": "subscriptionPopup.buttonCancel", - "start": { - "column": 16, - "line": 11 - } - }, - { - "defaultMessage": "!!!Done", - "end": { - "column": 3, - "line": 18 - }, - "file": "src/components/subscription/SubscriptionPopup.js", - "id": "subscriptionPopup.buttonDone", - "start": { - "column": 14, - "line": 15 - } - } - ], - "path": "src/components/subscription/SubscriptionPopup.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Upgrade account", - "end": { - "column": 3, - "line": 18 - }, - "file": "src/components/ui/PremiumFeatureContainer/index.js", - "id": "premiumFeature.button.upgradeAccount", - "start": { - "column": 10, - "line": 15 - } - } - ], - "path": "src/components/ui/PremiumFeatureContainer/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Loading", - "end": { - "column": 3, - "line": 14 - }, - "file": "src/components/ui/WebviewLoader/index.js", - "id": "service.webviewLoader.loading", - "start": { - "column": 11, - "line": 11 - } - } - ], - "path": "src/components/ui/WebviewLoader/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Something went wrong.", - "end": { - "column": 3, - "line": 14 - }, - "file": "src/components/util/ErrorBoundary/index.js", - "id": "app.errorHandler.headline", - "start": { - "column": 12, - "line": 11 - } - }, - { - "defaultMessage": "!!!Reload", - "end": { - "column": 3, - "line": 18 - }, - "file": "src/components/util/ErrorBoundary/index.js", - "id": "app.errorHandler.action", - "start": { - "column": 10, - "line": 15 - } - } - ], - "path": "src/components/util/ErrorBoundary/index.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Name", - "end": { - "column": 3, - "line": 31 - }, - "file": "src/containers/settings/EditServiceScreen.js", - "id": "settings.service.form.name", - "start": { - "column": 8, - "line": 28 - } - }, - { - "defaultMessage": "!!!Enable service", - "end": { - "column": 3, - "line": 35 - }, - "file": "src/containers/settings/EditServiceScreen.js", - "id": "settings.service.form.enableService", - "start": { - "column": 17, - "line": 32 - } - }, - { - "defaultMessage": "!!!Enable Notifications", - "end": { - "column": 3, - "line": 39 - }, - "file": "src/containers/settings/EditServiceScreen.js", - "id": "settings.service.form.enableNotification", - "start": { - "column": 22, - "line": 36 - } - }, - { - "defaultMessage": "!!!Show unread message badges", - "end": { - "column": 3, - "line": 43 - }, - "file": "src/containers/settings/EditServiceScreen.js", - "id": "settings.service.form.enableBadge", - "start": { - "column": 15, - "line": 40 - } - }, - { - "defaultMessage": "!!!Enable audio", - "end": { - "column": 3, - "line": 47 - }, - "file": "src/containers/settings/EditServiceScreen.js", - "id": "settings.service.form.enableAudio", - "start": { - "column": 15, - "line": 44 - } - }, - { - "defaultMessage": "!!!Team", - "end": { - "column": 3, - "line": 51 - }, - "file": "src/containers/settings/EditServiceScreen.js", - "id": "settings.service.form.team", - "start": { - "column": 8, - "line": 48 - } - }, - { - "defaultMessage": "!!!Custom server", - "end": { - "column": 3, - "line": 55 - }, - "file": "src/containers/settings/EditServiceScreen.js", - "id": "settings.service.form.customUrl", - "start": { - "column": 13, - "line": 52 - } - }, - { - "defaultMessage": "!!!Show message badge for all new messages", - "end": { - "column": 3, - "line": 59 - }, - "file": "src/containers/settings/EditServiceScreen.js", - "id": "settings.service.form.indirectMessages", - "start": { - "column": 20, - "line": 56 - } - }, - { - "defaultMessage": "!!!Custom icon", - "end": { - "column": 3, - "line": 63 - }, - "file": "src/containers/settings/EditServiceScreen.js", - "id": "settings.service.form.icon", - "start": { - "column": 8, - "line": 60 - } - }, - { - "defaultMessage": "!!!Enable Dark Mode", - "end": { - "column": 3, - "line": 67 - }, - "file": "src/containers/settings/EditServiceScreen.js", - "id": "settings.service.form.enableDarkMode", - "start": { - "column": 18, - "line": 64 - } - }, - { - "defaultMessage": "!!!Use Proxy", - "end": { - "column": 3, - "line": 71 - }, - "file": "src/containers/settings/EditServiceScreen.js", - "id": "settings.service.form.proxy.isEnabled", - "start": { - "column": 15, - "line": 68 - } - }, - { - "defaultMessage": "!!!Proxy Host/IP", - "end": { - "column": 3, - "line": 75 - }, - "file": "src/containers/settings/EditServiceScreen.js", - "id": "settings.service.form.proxy.host", - "start": { - "column": 13, - "line": 72 - } - }, - { - "defaultMessage": "!!!Port", - "end": { - "column": 3, - "line": 79 - }, - "file": "src/containers/settings/EditServiceScreen.js", - "id": "settings.service.form.proxy.port", - "start": { - "column": 13, - "line": 76 - } - }, - { - "defaultMessage": "!!!User", - "end": { - "column": 3, - "line": 83 - }, - "file": "src/containers/settings/EditServiceScreen.js", - "id": "settings.service.form.proxy.user", - "start": { - "column": 13, - "line": 80 - } - }, - { - "defaultMessage": "!!!Password", - "end": { - "column": 3, - "line": 87 - }, - "file": "src/containers/settings/EditServiceScreen.js", - "id": "settings.service.form.proxy.password", - "start": { - "column": 17, - "line": 84 - } - } - ], - "path": "src/containers/settings/EditServiceScreen.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Launch Franz on start", - "end": { - "column": 3, - "line": 25 - }, - "file": "src/containers/settings/EditSettingsScreen.js", - "id": "settings.app.form.autoLaunchOnStart", - "start": { - "column": 21, - "line": 22 - } - }, - { - "defaultMessage": "!!!Open in background", - "end": { - "column": 3, - "line": 29 - }, - "file": "src/containers/settings/EditSettingsScreen.js", - "id": "settings.app.form.autoLaunchInBackground", - "start": { - "column": 26, - "line": 26 - } - }, - { - "defaultMessage": "!!!Keep Franz in background when closing the window", - "end": { - "column": 3, - "line": 33 - }, - "file": "src/containers/settings/EditSettingsScreen.js", - "id": "settings.app.form.runInBackground", - "start": { - "column": 19, - "line": 30 - } - }, - { - "defaultMessage": "!!!Show Franz in system tray", - "end": { - "column": 3, - "line": 37 - }, - "file": "src/containers/settings/EditSettingsScreen.js", - "id": "settings.app.form.enableSystemTray", - "start": { - "column": 20, - "line": 34 - } - }, - { - "defaultMessage": "!!!Minimize Franz to system tray", - "end": { - "column": 3, - "line": 41 - }, - "file": "src/containers/settings/EditSettingsScreen.js", - "id": "settings.app.form.minimizeToSystemTray", - "start": { - "column": 24, - "line": 38 - } - }, - { - "defaultMessage": "!!!Language", - "end": { - "column": 3, - "line": 45 - }, - "file": "src/containers/settings/EditSettingsScreen.js", - "id": "settings.app.form.language", - "start": { - "column": 12, - "line": 42 - } - }, - { - "defaultMessage": "!!!Dark Mode", - "end": { - "column": 3, - "line": 49 - }, - "file": "src/containers/settings/EditSettingsScreen.js", - "id": "settings.app.form.darkMode", - "start": { - "column": 12, - "line": 46 - } - }, - { - "defaultMessage": "!!!Display disabled services tabs", - "end": { - "column": 3, - "line": 53 - }, - "file": "src/containers/settings/EditSettingsScreen.js", - "id": "settings.app.form.showDisabledServices", - "start": { - "column": 24, - "line": 50 - } - }, - { - "defaultMessage": "!!!Show unread message badge when notifications are disabled", - "end": { - "column": 3, - "line": 57 - }, - "file": "src/containers/settings/EditSettingsScreen.js", - "id": "settings.app.form.showMessagesBadgesWhenMuted", - "start": { - "column": 29, - "line": 54 - } - }, - { - "defaultMessage": "!!!Enable spell checking", - "end": { - "column": 3, - "line": 61 - }, - "file": "src/containers/settings/EditSettingsScreen.js", - "id": "settings.app.form.enableSpellchecking", - "start": { - "column": 23, - "line": 58 - } - }, - { - "defaultMessage": "!!!Enable GPU Acceleration", - "end": { - "column": 3, - "line": 65 - }, - "file": "src/containers/settings/EditSettingsScreen.js", - "id": "settings.app.form.enableGPUAcceleration", - "start": { - "column": 25, - "line": 62 - } - }, - { - "defaultMessage": "!!!Include beta versions", - "end": { - "column": 3, - "line": 69 - }, - "file": "src/containers/settings/EditSettingsScreen.js", - "id": "settings.app.form.beta", - "start": { - "column": 8, - "line": 66 - } - } - ], - "path": "src/containers/settings/EditSettingsScreen.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Firstname", - "end": { - "column": 3, - "line": 17 - }, - "file": "src/containers/settings/EditUserScreen.js", - "id": "settings.user.form.firstname", - "start": { - "column": 13, - "line": 14 - } - }, - { - "defaultMessage": "!!!Lastname", - "end": { - "column": 3, - "line": 21 - }, - "file": "src/containers/settings/EditUserScreen.js", - "id": "settings.user.form.lastname", - "start": { - "column": 12, - "line": 18 - } - }, - { - "defaultMessage": "!!!Email", - "end": { - "column": 3, - "line": 25 - }, - "file": "src/containers/settings/EditUserScreen.js", - "id": "settings.user.form.email", - "start": { - "column": 9, - "line": 22 - } - }, - { - "defaultMessage": "!!!Account type", - "end": { - "column": 3, - "line": 29 - }, - "file": "src/containers/settings/EditUserScreen.js", - "id": "settings.user.form.accountType.label", - "start": { - "column": 20, - "line": 26 - } - }, - { - "defaultMessage": "!!!Individual", - "end": { - "column": 3, - "line": 33 - }, - "file": "src/containers/settings/EditUserScreen.js", - "id": "settings.user.form.accountType.individual", - "start": { - "column": 25, - "line": 30 - } - }, - { - "defaultMessage": "!!!Non-Profit", - "end": { - "column": 3, - "line": 37 - }, - "file": "src/containers/settings/EditUserScreen.js", - "id": "settings.user.form.accountType.non-profit", - "start": { - "column": 24, - "line": 34 - } - }, - { - "defaultMessage": "!!!Company", - "end": { - "column": 3, - "line": 41 - }, - "file": "src/containers/settings/EditUserScreen.js", - "id": "settings.user.form.accountType.company", - "start": { - "column": 22, - "line": 38 - } - }, - { - "defaultMessage": "!!!Current password", - "end": { - "column": 3, - "line": 45 - }, - "file": "src/containers/settings/EditUserScreen.js", - "id": "settings.user.form.currentPassword", - "start": { - "column": 19, - "line": 42 - } - }, - { - "defaultMessage": "!!!New password", - "end": { - "column": 3, - "line": 49 - }, - "file": "src/containers/settings/EditUserScreen.js", - "id": "settings.user.form.newPassword", - "start": { - "column": 15, - "line": 46 - } - } - ], - "path": "src/containers/settings/EditUserScreen.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!What's new in Franz {version}?", - "end": { - "column": 3, - "line": 14 - }, - "file": "src/features/announcements/Component.js", - "id": "feature.announcements.changelog.headline", - "start": { - "column": 12, - "line": 11 - } - } - ], - "path": "src/features/announcements/Component.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Changes in Franz {version}", - "end": { - "column": 3, - "line": 23 - }, - "file": "src/features/announcements/components/AnnouncementScreen.js", - "id": "feature.announcements.changelog.headline", - "start": { - "column": 12, - "line": 20 - } - } - ], - "path": "src/features/announcements/components/AnnouncementScreen.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Please purchase license to skip waiting", - "end": { - "column": 3, - "line": 18 - }, - "file": "src/features/delayApp/Component.js", - "id": "feature.delayApp.headline", - "start": { - "column": 12, - "line": 15 - } - }, - { - "defaultMessage": "!!!Get a Franz Supporter License", - "end": { - "column": 3, - "line": 22 - }, - "file": "src/features/delayApp/Component.js", - "id": "feature.delayApp.action", - "start": { - "column": 10, - "line": 19 - } - }, - { - "defaultMessage": "!!!Franz will continue in {seconds} seconds.", - "end": { - "column": 3, - "line": 26 - }, - "file": "src/features/delayApp/Component.js", - "id": "feature.delayApp.text", - "start": { - "column": 8, - "line": 23 - } - } - ], - "path": "src/features/delayApp/Component.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Franz is better together!", - "end": { - "column": 3, - "line": 18 - }, - "file": "src/features/shareFranz/Component.js", - "id": "feature.shareFranz.headline", - "start": { - "column": 12, - "line": 15 - } - }, - { - "defaultMessage": "!!!Tell your friends and colleagues how awesome Franz is and help us to spread the word.", - "end": { - "column": 3, - "line": 22 - }, - "file": "src/features/shareFranz/Component.js", - "id": "feature.shareFranz.text", - "start": { - "column": 8, - "line": 19 - } - }, - { - "defaultMessage": "!!!Share as email", - "end": { - "column": 3, - "line": 26 - }, - "file": "src/features/shareFranz/Component.js", - "id": "feature.shareFranz.action.email", - "start": { - "column": 16, - "line": 23 - } - }, - { - "defaultMessage": "!!!Share on Facebook", - "end": { - "column": 3, - "line": 30 - }, - "file": "src/features/shareFranz/Component.js", - "id": "feature.shareFranz.action.facebook", - "start": { - "column": 19, - "line": 27 - } - }, - { - "defaultMessage": "!!!Share on Twitter", - "end": { - "column": 3, - "line": 34 - }, - "file": "src/features/shareFranz/Component.js", - "id": "feature.shareFranz.action.twitter", - "start": { - "column": 18, - "line": 31 - } - }, - { - "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com", - "end": { - "column": 3, - "line": 38 - }, - "file": "src/features/shareFranz/Component.js", - "id": "feature.shareFranz.shareText.email", - "start": { - "column": 18, - "line": 35 - } - }, - { - "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger", - "end": { - "column": 3, - "line": 42 - }, - "file": "src/features/shareFranz/Component.js", - "id": "feature.shareFranz.shareText.twitter", - "start": { - "column": 20, - "line": 39 - } - } - ], - "path": "src/features/shareFranz/Component.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Create workspace", - "end": { - "column": 3, - "line": 16 - }, - "file": "src/features/workspaces/components/CreateWorkspaceForm.js", - "id": "settings.workspace.add.form.submitButton", - "start": { - "column": 16, - "line": 13 - } - }, - { - "defaultMessage": "!!!Name", - "end": { - "column": 3, - "line": 20 - }, - "file": "src/features/workspaces/components/CreateWorkspaceForm.js", - "id": "settings.workspace.add.form.name", - "start": { - "column": 8, - "line": 17 - } - } - ], - "path": "src/features/workspaces/components/CreateWorkspaceForm.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Delete workspace", - "end": { - "column": 3, - "line": 22 - }, - "file": "src/features/workspaces/components/EditWorkspaceForm.js", - "id": "settings.workspace.form.buttonDelete", - "start": { - "column": 16, - "line": 19 - } - }, - { - "defaultMessage": "!!!Save workspace", - "end": { - "column": 3, - "line": 26 - }, - "file": "src/features/workspaces/components/EditWorkspaceForm.js", - "id": "settings.workspace.form.buttonSave", - "start": { - "column": 14, - "line": 23 - } - }, - { - "defaultMessage": "!!!Name", - "end": { - "column": 3, - "line": 30 - }, - "file": "src/features/workspaces/components/EditWorkspaceForm.js", - "id": "settings.workspace.form.name", - "start": { - "column": 8, - "line": 27 - } - }, - { - "defaultMessage": "!!!Your workspaces", - "end": { - "column": 3, - "line": 34 - }, - "file": "src/features/workspaces/components/EditWorkspaceForm.js", - "id": "settings.workspace.form.yourWorkspaces", - "start": { - "column": 18, - "line": 31 - } - }, - { - "defaultMessage": "!!!Services in this Workspace", - "end": { - "column": 3, - "line": 38 - }, - "file": "src/features/workspaces/components/EditWorkspaceForm.js", - "id": "settings.workspace.form.servicesInWorkspaceHeadline", - "start": { - "column": 31, - "line": 35 - } - } - ], - "path": "src/features/workspaces/components/EditWorkspaceForm.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Workspaces", - "end": { - "column": 3, - "line": 19 - }, - "file": "src/features/workspaces/components/WorkspaceDrawer.js", - "id": "workspaceDrawer.headline", - "start": { - "column": 12, - "line": 16 - } - }, - { - "defaultMessage": "!!!All services", - "end": { - "column": 3, - "line": 23 - }, - "file": "src/features/workspaces/components/WorkspaceDrawer.js", - "id": "workspaceDrawer.allServices", - "start": { - "column": 15, - "line": 20 - } - }, - { - "defaultMessage": "!!!Workspaces settings", - "end": { - "column": 3, - "line": 27 - }, - "file": "src/features/workspaces/components/WorkspaceDrawer.js", - "id": "workspaceDrawer.workspacesSettingsTooltip", - "start": { - "column": 29, - "line": 24 - } - }, - { - "defaultMessage": "!!!Info about workspace feature", - "end": { - "column": 3, - "line": 31 - }, - "file": "src/features/workspaces/components/WorkspaceDrawer.js", - "id": "workspaceDrawer.workspaceFeatureInfo", - "start": { - "column": 24, - "line": 28 - } - }, - { - "defaultMessage": "!!!Create your first workspace", - "end": { - "column": 3, - "line": 35 - }, - "file": "src/features/workspaces/components/WorkspaceDrawer.js", - "id": "workspaceDrawer.premiumCtaButtonLabel", - "start": { - "column": 25, - "line": 32 - } - }, - { - "defaultMessage": "!!!Reactivate premium account", - "end": { - "column": 3, - "line": 39 - }, - "file": "src/features/workspaces/components/WorkspaceDrawer.js", - "id": "workspaceDrawer.reactivatePremiumAccountLabel", - "start": { - "column": 28, - "line": 36 - } - }, - { - "defaultMessage": "!!!add new workspace", - "end": { - "column": 3, - "line": 43 - }, - "file": "src/features/workspaces/components/WorkspaceDrawer.js", - "id": "workspaceDrawer.addNewWorkspaceLabel", - "start": { - "column": 24, - "line": 40 - } - }, - { - "defaultMessage": "!!!Premium feature", - "end": { - "column": 3, - "line": 47 - }, - "file": "src/features/workspaces/components/WorkspaceDrawer.js", - "id": "workspaceDrawer.proFeatureBadge", - "start": { - "column": 23, - "line": 44 - } - } - ], - "path": "src/features/workspaces/components/WorkspaceDrawer.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!No services added yet", - "end": { - "column": 3, - "line": 15 - }, - "file": "src/features/workspaces/components/WorkspaceDrawerItem.js", - "id": "workspaceDrawer.item.noServicesAddedYet", - "start": { - "column": 22, - "line": 12 - } - }, - { - "defaultMessage": "!!!edit", - "end": { - "column": 3, - "line": 19 - }, - "file": "src/features/workspaces/components/WorkspaceDrawerItem.js", - "id": "workspaceDrawer.item.contextMenuEdit", - "start": { - "column": 19, - "line": 16 - } - } - ], - "path": "src/features/workspaces/components/WorkspaceDrawerItem.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Your workspaces", - "end": { - "column": 3, - "line": 20 - }, - "file": "src/features/workspaces/components/WorkspacesDashboard.js", - "id": "settings.workspaces.headline", - "start": { - "column": 12, - "line": 17 - } - }, - { - "defaultMessage": "!!!You haven't added any workspaces yet.", - "end": { - "column": 3, - "line": 24 - }, - "file": "src/features/workspaces/components/WorkspacesDashboard.js", - "id": "settings.workspaces.noWorkspacesAdded", - "start": { - "column": 19, - "line": 21 - } - }, - { - "defaultMessage": "!!!Could not load your workspaces", - "end": { - "column": 3, - "line": 28 - }, - "file": "src/features/workspaces/components/WorkspacesDashboard.js", - "id": "settings.workspaces.workspacesRequestFailed", - "start": { - "column": 27, - "line": 25 - } - }, - { - "defaultMessage": "!!!Try again", - "end": { - "column": 3, - "line": 32 - }, - "file": "src/features/workspaces/components/WorkspacesDashboard.js", - "id": "settings.workspaces.tryReloadWorkspaces", - "start": { - "column": 23, - "line": 29 - } - }, - { - "defaultMessage": "!!!Your changes have been saved", - "end": { - "column": 3, - "line": 36 - }, - "file": "src/features/workspaces/components/WorkspacesDashboard.js", - "id": "settings.workspaces.updatedInfo", - "start": { - "column": 15, - "line": 33 - } - }, - { - "defaultMessage": "!!!Workspace has been deleted", - "end": { - "column": 3, - "line": 40 - }, - "file": "src/features/workspaces/components/WorkspacesDashboard.js", - "id": "settings.workspaces.deletedInfo", - "start": { - "column": 15, - "line": 37 - } - }, - { - "defaultMessage": "!!!Info about workspace feature", - "end": { - "column": 3, - "line": 44 - }, - "file": "src/features/workspaces/components/WorkspacesDashboard.js", - "id": "settings.workspaces.workspaceFeatureInfo", - "start": { - "column": 24, - "line": 41 - } - }, - { - "defaultMessage": "!!!Less is More: Introducing Franz Workspaces", - "end": { - "column": 3, - "line": 48 - }, - "file": "src/features/workspaces/components/WorkspacesDashboard.js", - "id": "settings.workspaces.workspaceFeatureHeadline", - "start": { - "column": 28, - "line": 45 - } - } - ], - "path": "src/features/workspaces/components/WorkspacesDashboard.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Switching to", - "end": { - "column": 3, - "line": 15 - }, - "file": "src/features/workspaces/components/WorkspaceSwitchingIndicator.js", - "id": "workspaces.switchingIndicator.switchingTo", - "start": { - "column": 15, - "line": 12 - } - } - ], - "path": "src/features/workspaces/components/WorkspaceSwitchingIndicator.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Field is required", - "end": { - "column": 3, - "line": 7 - }, - "file": "src/helpers/validation-helpers.js", - "id": "validation.required", - "start": { - "column": 12, - "line": 4 - } - }, - { - "defaultMessage": "!!!Email not valid", - "end": { - "column": 3, - "line": 11 - }, - "file": "src/helpers/validation-helpers.js", - "id": "validation.email", - "start": { - "column": 9, - "line": 8 - } - }, - { - "defaultMessage": "!!!Not a valid URL", - "end": { - "column": 3, - "line": 15 - }, - "file": "src/helpers/validation-helpers.js", - "id": "validation.url", - "start": { - "column": 7, - "line": 12 - } - }, - { - "defaultMessage": "!!!Too few characters", - "end": { - "column": 3, - "line": 19 - }, - "file": "src/helpers/validation-helpers.js", - "id": "validation.minLength", - "start": { - "column": 13, - "line": 16 - } - }, - { - "defaultMessage": "!!!At least one is required", - "end": { - "column": 3, - "line": 23 - }, - "file": "src/helpers/validation-helpers.js", - "id": "validation.oneRequired", - "start": { - "column": 15, - "line": 20 - } - } - ], - "path": "src/helpers/validation-helpers.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Can't connect to Franz Online Services", - "end": { - "column": 3, - "line": 7 - }, - "file": "src/i18n/globalMessages.js", - "id": "global.api.unhealthy", - "start": { - "column": 16, - "line": 4 - } - }, - { - "defaultMessage": "!!!You are not connected to the internet.", - "end": { - "column": 3, - "line": 11 - }, - "file": "src/i18n/globalMessages.js", - "id": "global.notConnectedToTheInternet", - "start": { - "column": 29, - "line": 8 - } - }, - { - "defaultMessage": "!!!Spell checking language", - "end": { - "column": 3, - "line": 15 - }, - "file": "src/i18n/globalMessages.js", - "id": "global.spellchecking.language", - "start": { - "column": 24, - "line": 12 - } - }, - { - "defaultMessage": "!!!Use System Default ({default})", - "end": { - "column": 3, - "line": 19 - }, - "file": "src/i18n/globalMessages.js", - "id": "global.spellchecker.useDefault", - "start": { - "column": 29, - "line": 16 - } - }, - { - "defaultMessage": "!!!Detect language automatically", - "end": { - "column": 3, - "line": 23 - }, - "file": "src/i18n/globalMessages.js", - "id": "global.spellchecking.autodetect", - "start": { - "column": 34, - "line": 20 - } - }, - { - "defaultMessage": "!!!Automatic", - "end": { - "column": 3, - "line": 27 - }, - "file": "src/i18n/globalMessages.js", - "id": "global.spellchecking.autodetect.short", - "start": { - "column": 39, - "line": 24 - } - } - ], - "path": "src/i18n/globalMessages.json" - }, - { - "descriptors": [ - { - "defaultMessage": "!!!Edit", - "end": { - "column": 3, - "line": 17 - }, - "file": "src/lib/Menu.js", - "id": "menu.edit", - "start": { - "column": 8, - "line": 14 - } - }, - { - "defaultMessage": "!!!Undo", - "end": { - "column": 3, - "line": 21 - }, - "file": "src/lib/Menu.js", - "id": "menu.edit.undo", - "start": { - "column": 8, - "line": 18 - } - }, - { - "defaultMessage": "!!!Redo", - "end": { - "column": 3, - "line": 25 - }, - "file": "src/lib/Menu.js", - "id": "menu.edit.redo", - "start": { - "column": 8, - "line": 22 - } - }, - { - "defaultMessage": "!!!Cut", - "end": { - "column": 3, - "line": 29 - }, - "file": "src/lib/Menu.js", - "id": "menu.edit.cut", - "start": { - "column": 7, - "line": 26 - } - }, - { - "defaultMessage": "!!!Copy", - "end": { - "column": 3, - "line": 33 - }, - "file": "src/lib/Menu.js", - "id": "menu.edit.copy", - "start": { - "column": 8, - "line": 30 - } - }, - { - "defaultMessage": "!!!Paste", - "end": { - "column": 3, - "line": 37 - }, - "file": "src/lib/Menu.js", - "id": "menu.edit.paste", - "start": { - "column": 9, - "line": 34 - } - }, - { - "defaultMessage": "!!!Paste And Match Style", - "end": { - "column": 3, - "line": 41 - }, - "file": "src/lib/Menu.js", - "id": "menu.edit.pasteAndMatchStyle", - "start": { - "column": 22, - "line": 38 - } - }, - { - "defaultMessage": "!!!Delete", - "end": { - "column": 3, - "line": 45 - }, - "file": "src/lib/Menu.js", - "id": "menu.edit.delete", - "start": { - "column": 10, - "line": 42 - } - }, - { - "defaultMessage": "!!!Select All", - "end": { - "column": 3, - "line": 49 - }, - "file": "src/lib/Menu.js", - "id": "menu.edit.selectAll", - "start": { - "column": 13, - "line": 46 - } - }, - { - "defaultMessage": "!!!Speech", - "end": { - "column": 3, - "line": 53 - }, - "file": "src/lib/Menu.js", - "id": "menu.edit.speech", - "start": { - "column": 10, - "line": 50 - } - }, - { - "defaultMessage": "!!!Start Speaking", - "end": { - "column": 3, - "line": 57 - }, - "file": "src/lib/Menu.js", - "id": "menu.edit.startSpeaking", - "start": { - "column": 17, - "line": 54 - } - }, - { - "defaultMessage": "!!!Stop Speaking", - "end": { - "column": 3, - "line": 61 - }, - "file": "src/lib/Menu.js", - "id": "menu.edit.stopSpeaking", - "start": { - "column": 16, - "line": 58 - } - }, - { - "defaultMessage": "!!!Start Dictation", - "end": { - "column": 3, - "line": 65 - }, - "file": "src/lib/Menu.js", - "id": "menu.edit.startDictation", - "start": { - "column": 18, - "line": 62 - } - }, - { - "defaultMessage": "!!!Emoji & Symbols", - "end": { - "column": 3, - "line": 69 - }, - "file": "src/lib/Menu.js", - "id": "menu.edit.emojiSymbols", - "start": { - "column": 16, - "line": 66 - } - }, - { - "defaultMessage": "!!!Actual Size", - "end": { - "column": 3, - "line": 73 - }, - "file": "src/lib/Menu.js", - "id": "menu.view.resetZoom", - "start": { - "column": 13, - "line": 70 - } - }, - { - "defaultMessage": "!!!Zoom In", - "end": { - "column": 3, - "line": 77 - }, - "file": "src/lib/Menu.js", - "id": "menu.view.zoomIn", - "start": { - "column": 10, - "line": 74 - } - }, - { - "defaultMessage": "!!!Zoom Out", - "end": { - "column": 3, - "line": 81 - }, - "file": "src/lib/Menu.js", - "id": "menu.view.zoomOut", - "start": { - "column": 11, - "line": 78 - } - }, - { - "defaultMessage": "!!!Enter Full Screen", - "end": { - "column": 3, - "line": 85 - }, - "file": "src/lib/Menu.js", - "id": "menu.view.enterFullScreen", - "start": { - "column": 19, - "line": 82 - } - }, - { - "defaultMessage": "!!!Exit Full Screen", - "end": { - "column": 3, - "line": 89 - }, - "file": "src/lib/Menu.js", - "id": "menu.view.exitFullScreen", - "start": { - "column": 18, - "line": 86 - } - }, - { - "defaultMessage": "!!!Toggle Full Screen", - "end": { - "column": 3, - "line": 93 - }, - "file": "src/lib/Menu.js", - "id": "menu.view.toggleFullScreen", - "start": { - "column": 20, - "line": 90 - } - }, - { - "defaultMessage": "!!!Toggle Developer Tools", - "end": { - "column": 3, - "line": 97 - }, - "file": "src/lib/Menu.js", - "id": "menu.view.toggleDevTools", - "start": { - "column": 18, - "line": 94 - } - }, - { - "defaultMessage": "!!!Toggle Service Developer Tools", - "end": { - "column": 3, - "line": 101 - }, - "file": "src/lib/Menu.js", - "id": "menu.view.toggleServiceDevTools", - "start": { - "column": 25, - "line": 98 - } - }, - { - "defaultMessage": "!!!Reload Service", - "end": { - "column": 3, - "line": 105 - }, - "file": "src/lib/Menu.js", - "id": "menu.view.reloadService", - "start": { - "column": 17, - "line": 102 - } - }, - { - "defaultMessage": "!!!Reload Franz", - "end": { - "column": 3, - "line": 109 - }, - "file": "src/lib/Menu.js", - "id": "menu.view.reloadFranz", - "start": { - "column": 15, - "line": 106 - } - }, - { - "defaultMessage": "!!!Minimize", - "end": { - "column": 3, - "line": 113 - }, - "file": "src/lib/Menu.js", - "id": "menu.window.minimize", - "start": { - "column": 12, - "line": 110 - } - }, - { - "defaultMessage": "!!!Close", - "end": { - "column": 3, - "line": 117 - }, - "file": "src/lib/Menu.js", - "id": "menu.window.close", - "start": { - "column": 9, - "line": 114 - } - }, - { - "defaultMessage": "!!!Learn More", - "end": { - "column": 3, - "line": 121 - }, - "file": "src/lib/Menu.js", - "id": "menu.help.learnMore", - "start": { - "column": 13, - "line": 118 - } - }, - { - "defaultMessage": "!!!Changelog", - "end": { - "column": 3, - "line": 125 - }, - "file": "src/lib/Menu.js", - "id": "menu.help.changelog", - "start": { - "column": 13, - "line": 122 - } - }, - { - "defaultMessage": "!!!Support", - "end": { - "column": 3, - "line": 129 - }, - "file": "src/lib/Menu.js", - "id": "menu.help.support", - "start": { - "column": 11, - "line": 126 - } - }, - { - "defaultMessage": "!!!Terms of Service", - "end": { - "column": 3, - "line": 133 - }, - "file": "src/lib/Menu.js", - "id": "menu.help.tos", - "start": { - "column": 7, - "line": 130 - } - }, - { - "defaultMessage": "!!!Privacy Statement", - "end": { - "column": 3, - "line": 137 - }, - "file": "src/lib/Menu.js", - "id": "menu.help.privacy", - "start": { - "column": 11, - "line": 134 - } - }, - { - "defaultMessage": "!!!File", - "end": { - "column": 3, - "line": 141 - }, - "file": "src/lib/Menu.js", - "id": "menu.file", - "start": { - "column": 8, - "line": 138 - } - }, - { - "defaultMessage": "!!!View", - "end": { - "column": 3, - "line": 145 - }, - "file": "src/lib/Menu.js", - "id": "menu.view", - "start": { - "column": 8, - "line": 142 - } - }, - { - "defaultMessage": "!!!Services", - "end": { - "column": 3, - "line": 149 - }, - "file": "src/lib/Menu.js", - "id": "menu.services", - "start": { - "column": 12, - "line": 146 - } - }, - { - "defaultMessage": "!!!Window", - "end": { - "column": 3, - "line": 153 - }, - "file": "src/lib/Menu.js", - "id": "menu.window", - "start": { - "column": 10, - "line": 150 - } - }, - { - "defaultMessage": "!!!Help", - "end": { - "column": 3, - "line": 157 - }, - "file": "src/lib/Menu.js", - "id": "menu.help", - "start": { - "column": 8, - "line": 154 - } - }, - { - "defaultMessage": "!!!About Franz", - "end": { - "column": 3, - "line": 161 - }, - "file": "src/lib/Menu.js", - "id": "menu.app.about", - "start": { - "column": 9, - "line": 158 - } - }, - { - "defaultMessage": "!!!What's new?", - "end": { - "column": 3, - "line": 165 - }, - "file": "src/lib/Menu.js", - "id": "menu.app.announcement", - "start": { - "column": 16, - "line": 162 - } - }, - { - "defaultMessage": "!!!Settings", - "end": { - "column": 3, - "line": 169 - }, - "file": "src/lib/Menu.js", - "id": "menu.app.settings", - "start": { - "column": 12, - "line": 166 - } - }, - { - "defaultMessage": "!!!Hide", - "end": { - "column": 3, - "line": 173 - }, - "file": "src/lib/Menu.js", - "id": "menu.app.hide", - "start": { - "column": 8, - "line": 170 - } - }, - { - "defaultMessage": "!!!Hide Others", - "end": { - "column": 3, - "line": 177 - }, - "file": "src/lib/Menu.js", - "id": "menu.app.hideOthers", - "start": { - "column": 14, - "line": 174 - } - }, - { - "defaultMessage": "!!!Unhide", - "end": { - "column": 3, - "line": 181 - }, - "file": "src/lib/Menu.js", - "id": "menu.app.unhide", - "start": { - "column": 10, - "line": 178 - } - }, - { - "defaultMessage": "!!!Quit", - "end": { - "column": 3, - "line": 185 - }, - "file": "src/lib/Menu.js", - "id": "menu.app.quit", - "start": { - "column": 8, - "line": 182 - } - }, - { - "defaultMessage": "!!!Add New Service...", - "end": { - "column": 3, - "line": 189 - }, - "file": "src/lib/Menu.js", - "id": "menu.services.addNewService", - "start": { - "column": 17, - "line": 186 - } - }, - { - "defaultMessage": "!!!Add New Workspace...", - "end": { - "column": 3, - "line": 193 - }, - "file": "src/lib/Menu.js", - "id": "menu.workspaces.addNewWorkspace", - "start": { - "column": 19, - "line": 190 - } - }, - { - "defaultMessage": "!!!Open workspace drawer", - "end": { - "column": 3, - "line": 197 - }, - "file": "src/lib/Menu.js", - "id": "menu.workspaces.openWorkspaceDrawer", - "start": { - "column": 23, - "line": 194 - } - }, - { - "defaultMessage": "!!!Close workspace drawer", - "end": { - "column": 3, - "line": 201 - }, - "file": "src/lib/Menu.js", - "id": "menu.workspaces.closeWorkspaceDrawer", - "start": { - "column": 24, - "line": 198 - } - }, - { - "defaultMessage": "!!!Activate next service...", - "end": { - "column": 3, - "line": 205 - }, - "file": "src/lib/Menu.js", - "id": "menu.services.setNextServiceActive", - "start": { - "column": 23, - "line": 202 - } - }, - { - "defaultMessage": "!!!Activate previous service...", - "end": { - "column": 3, - "line": 209 - }, - "file": "src/lib/Menu.js", - "id": "menu.services.activatePreviousService", - "start": { - "column": 27, - "line": 206 - } - }, - { - "defaultMessage": "!!!Disable notifications & audio", - "end": { - "column": 3, - "line": 213 - }, - "file": "src/lib/Menu.js", - "id": "sidebar.muteApp", - "start": { - "column": 11, - "line": 210 - } - }, - { - "defaultMessage": "!!!Enable notifications & audio", - "end": { - "column": 3, - "line": 217 - }, - "file": "src/lib/Menu.js", - "id": "sidebar.unmuteApp", - "start": { - "column": 13, - "line": 214 - } - }, - { - "defaultMessage": "!!!Workspaces", - "end": { - "column": 3, - "line": 221 - }, - "file": "src/lib/Menu.js", - "id": "menu.workspaces", - "start": { - "column": 14, - "line": 218 - } - }, - { - "defaultMessage": "!!!Default", - "end": { - "column": 3, - "line": 225 - }, - "file": "src/lib/Menu.js", - "id": "menu.workspaces.defaultWorkspace", - "start": { - "column": 20, - "line": 222 - } - } - ], - "path": "src/lib/Menu.json" - } -] \ No newline at end of file diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 07602e61f..70b869557 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -164,6 +164,7 @@ "settings.app.headlineGeneral": "General", "settings.app.headlineLanguage": "Language", "settings.app.headlineUpdates": "Updates", + "settings.app.languageDisclaimer": "Official translations are English & German. All other languages are community based translations.", "settings.app.restartRequired": "Changes require restart", "settings.app.subheadlineCache": "Cache", "settings.app.translationHelp": "Help us to translate Franz into your language.", @@ -319,4 +320,4 @@ "workspaceDrawer.workspaceFeatureInfo": "

Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

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.

", "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", "workspaces.switchingIndicator.switchingTo": "Switching to" -} \ No newline at end of file +} diff --git a/src/i18n/messages/src/components/auth/Import.json b/src/i18n/messages/src/components/auth/Import.json deleted file mode 100644 index 264fc729b..000000000 --- a/src/i18n/messages/src/components/auth/Import.json +++ /dev/null @@ -1,54 +0,0 @@ -[ - { - "id": "import.headline", - "defaultMessage": "!!!Import your Franz 4 services", - "file": "src/components/auth/Import.js", - "start": { - "line": 13, - "column": 12 - }, - "end": { - "line": 16, - "column": 3 - } - }, - { - "id": "import.notSupportedHeadline", - "defaultMessage": "!!!Services not yet supported in Franz 5", - "file": "src/components/auth/Import.js", - "start": { - "line": 17, - "column": 24 - }, - "end": { - "line": 20, - "column": 3 - } - }, - { - "id": "import.submit.label", - "defaultMessage": "!!!Import {count} services", - "file": "src/components/auth/Import.js", - "start": { - "line": 21, - "column": 21 - }, - "end": { - "line": 24, - "column": 3 - } - }, - { - "id": "import.skip.label", - "defaultMessage": "!!!I want to add services manually", - "file": "src/components/auth/Import.js", - "start": { - "line": 25, - "column": 19 - }, - "end": { - "line": 28, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/auth/Invite.json b/src/i18n/messages/src/components/auth/Invite.json deleted file mode 100644 index 57c9bddcf..000000000 --- a/src/i18n/messages/src/components/auth/Invite.json +++ /dev/null @@ -1,93 +0,0 @@ -[ - { - "id": "settings.invite.headline", - "defaultMessage": "!!!Invite Friends", - "file": "src/components/auth/Invite.js", - "start": { - "line": 16, - "column": 20 - }, - "end": { - "line": 19, - "column": 3 - } - }, - { - "id": "invite.headline.friends", - "defaultMessage": "!!!Invite 3 of your friends or colleagues", - "file": "src/components/auth/Invite.js", - "start": { - "line": 20, - "column": 12 - }, - "end": { - "line": 23, - "column": 3 - } - }, - { - "id": "invite.name.label", - "defaultMessage": "!!!Name", - "file": "src/components/auth/Invite.js", - "start": { - "line": 24, - "column": 13 - }, - "end": { - "line": 27, - "column": 3 - } - }, - { - "id": "invite.email.label", - "defaultMessage": "!!!Email address", - "file": "src/components/auth/Invite.js", - "start": { - "line": 28, - "column": 14 - }, - "end": { - "line": 31, - "column": 3 - } - }, - { - "id": "invite.submit.label", - "defaultMessage": "!!!Send invites", - "file": "src/components/auth/Invite.js", - "start": { - "line": 32, - "column": 21 - }, - "end": { - "line": 35, - "column": 3 - } - }, - { - "id": "invite.skip.label", - "defaultMessage": "!!!I want to do this later", - "file": "src/components/auth/Invite.js", - "start": { - "line": 36, - "column": 19 - }, - "end": { - "line": 39, - "column": 3 - } - }, - { - "id": "invite.successInfo", - "defaultMessage": "!!!Invitations sent successfully", - "file": "src/components/auth/Invite.js", - "start": { - "line": 40, - "column": 21 - }, - "end": { - "line": 43, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/auth/Login.json b/src/i18n/messages/src/components/auth/Login.json deleted file mode 100644 index 177f6000b..000000000 --- a/src/i18n/messages/src/components/auth/Login.json +++ /dev/null @@ -1,119 +0,0 @@ -[ - { - "id": "login.headline", - "defaultMessage": "!!!Sign in", - "file": "src/components/auth/Login.js", - "start": { - "line": 17, - "column": 12 - }, - "end": { - "line": 20, - "column": 3 - } - }, - { - "id": "login.email.label", - "defaultMessage": "!!!Email address", - "file": "src/components/auth/Login.js", - "start": { - "line": 21, - "column": 14 - }, - "end": { - "line": 24, - "column": 3 - } - }, - { - "id": "login.password.label", - "defaultMessage": "!!!Password", - "file": "src/components/auth/Login.js", - "start": { - "line": 25, - "column": 17 - }, - "end": { - "line": 28, - "column": 3 - } - }, - { - "id": "login.submit.label", - "defaultMessage": "!!!Sign in", - "file": "src/components/auth/Login.js", - "start": { - "line": 29, - "column": 21 - }, - "end": { - "line": 32, - "column": 3 - } - }, - { - "id": "login.invalidCredentials", - "defaultMessage": "!!!Email or password not valid", - "file": "src/components/auth/Login.js", - "start": { - "line": 33, - "column": 22 - }, - "end": { - "line": 36, - "column": 3 - } - }, - { - "id": "login.tokenExpired", - "defaultMessage": "!!!Your session expired, please login again.", - "file": "src/components/auth/Login.js", - "start": { - "line": 37, - "column": 16 - }, - "end": { - "line": 40, - "column": 3 - } - }, - { - "id": "login.serverLogout", - "defaultMessage": "!!!Your session expired, please login again.", - "file": "src/components/auth/Login.js", - "start": { - "line": 41, - "column": 16 - }, - "end": { - "line": 44, - "column": 3 - } - }, - { - "id": "login.link.signup", - "defaultMessage": "!!!Create a free account", - "file": "src/components/auth/Login.js", - "start": { - "line": 45, - "column": 14 - }, - "end": { - "line": 48, - "column": 3 - } - }, - { - "id": "login.link.password", - "defaultMessage": "!!!Forgot password", - "file": "src/components/auth/Login.js", - "start": { - "line": 49, - "column": 16 - }, - "end": { - "line": 52, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/auth/Password.json b/src/i18n/messages/src/components/auth/Password.json deleted file mode 100644 index f335b3acb..000000000 --- a/src/i18n/messages/src/components/auth/Password.json +++ /dev/null @@ -1,93 +0,0 @@ -[ - { - "id": "password.headline", - "defaultMessage": "!!!Forgot password", - "file": "src/components/auth/Password.js", - "start": { - "line": 14, - "column": 12 - }, - "end": { - "line": 17, - "column": 3 - } - }, - { - "id": "password.email.label", - "defaultMessage": "!!!Email address", - "file": "src/components/auth/Password.js", - "start": { - "line": 18, - "column": 14 - }, - "end": { - "line": 21, - "column": 3 - } - }, - { - "id": "password.submit.label", - "defaultMessage": "!!!Submit", - "file": "src/components/auth/Password.js", - "start": { - "line": 22, - "column": 21 - }, - "end": { - "line": 25, - "column": 3 - } - }, - { - "id": "password.successInfo", - "defaultMessage": "!!!Your new password was sent to your email address", - "file": "src/components/auth/Password.js", - "start": { - "line": 26, - "column": 15 - }, - "end": { - "line": 29, - "column": 3 - } - }, - { - "id": "password.noUser", - "defaultMessage": "!!!No user affiliated with that email address", - "file": "src/components/auth/Password.js", - "start": { - "line": 30, - "column": 10 - }, - "end": { - "line": 33, - "column": 3 - } - }, - { - "id": "password.link.signup", - "defaultMessage": "!!!Create a free account", - "file": "src/components/auth/Password.js", - "start": { - "line": 34, - "column": 14 - }, - "end": { - "line": 37, - "column": 3 - } - }, - { - "id": "password.link.login", - "defaultMessage": "!!!Sign in to your account", - "file": "src/components/auth/Password.js", - "start": { - "line": 38, - "column": 13 - }, - "end": { - "line": 41, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/auth/Pricing.json b/src/i18n/messages/src/components/auth/Pricing.json deleted file mode 100644 index f711a55b4..000000000 --- a/src/i18n/messages/src/components/auth/Pricing.json +++ /dev/null @@ -1,54 +0,0 @@ -[ - { - "id": "pricing.headline", - "defaultMessage": "!!!Support Franz", - "file": "src/components/auth/Pricing.js", - "start": { - "line": 13, - "column": 12 - }, - "end": { - "line": 16, - "column": 3 - } - }, - { - "id": "pricing.support.label", - "defaultMessage": "!!!Select your support plan", - "file": "src/components/auth/Pricing.js", - "start": { - "line": 17, - "column": 23 - }, - "end": { - "line": 20, - "column": 3 - } - }, - { - "id": "pricing.submit.label", - "defaultMessage": "!!!Support the development of Franz", - "file": "src/components/auth/Pricing.js", - "start": { - "line": 21, - "column": 21 - }, - "end": { - "line": 24, - "column": 3 - } - }, - { - "id": "pricing.link.skipPayment", - "defaultMessage": "!!!I don't want to support the development of Franz.", - "file": "src/components/auth/Pricing.js", - "start": { - "line": 25, - "column": 15 - }, - "end": { - "line": 28, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/auth/Signup.json b/src/i18n/messages/src/components/auth/Signup.json deleted file mode 100644 index a09745048..000000000 --- a/src/i18n/messages/src/components/auth/Signup.json +++ /dev/null @@ -1,158 +0,0 @@ -[ - { - "id": "signup.headline", - "defaultMessage": "!!!Sign up", - "file": "src/components/auth/Signup.js", - "start": { - "line": 18, - "column": 12 - }, - "end": { - "line": 21, - "column": 3 - } - }, - { - "id": "signup.firstname.label", - "defaultMessage": "!!!Firstname", - "file": "src/components/auth/Signup.js", - "start": { - "line": 22, - "column": 18 - }, - "end": { - "line": 25, - "column": 3 - } - }, - { - "id": "signup.lastname.label", - "defaultMessage": "!!!Lastname", - "file": "src/components/auth/Signup.js", - "start": { - "line": 26, - "column": 17 - }, - "end": { - "line": 29, - "column": 3 - } - }, - { - "id": "signup.email.label", - "defaultMessage": "!!!Email address", - "file": "src/components/auth/Signup.js", - "start": { - "line": 30, - "column": 14 - }, - "end": { - "line": 33, - "column": 3 - } - }, - { - "id": "signup.company.label", - "defaultMessage": "!!!Company", - "file": "src/components/auth/Signup.js", - "start": { - "line": 34, - "column": 16 - }, - "end": { - "line": 37, - "column": 3 - } - }, - { - "id": "signup.password.label", - "defaultMessage": "!!!Password", - "file": "src/components/auth/Signup.js", - "start": { - "line": 38, - "column": 17 - }, - "end": { - "line": 41, - "column": 3 - } - }, - { - "id": "signup.legal.info", - "defaultMessage": "!!!By creating a Franz account you accept the", - "file": "src/components/auth/Signup.js", - "start": { - "line": 42, - "column": 13 - }, - "end": { - "line": 45, - "column": 3 - } - }, - { - "id": "signup.legal.terms", - "defaultMessage": "!!!Terms of service", - "file": "src/components/auth/Signup.js", - "start": { - "line": 46, - "column": 9 - }, - "end": { - "line": 49, - "column": 3 - } - }, - { - "id": "signup.legal.privacy", - "defaultMessage": "!!!Privacy Statement", - "file": "src/components/auth/Signup.js", - "start": { - "line": 50, - "column": 11 - }, - "end": { - "line": 53, - "column": 3 - } - }, - { - "id": "signup.submit.label", - "defaultMessage": "!!!Create account", - "file": "src/components/auth/Signup.js", - "start": { - "line": 54, - "column": 21 - }, - "end": { - "line": 57, - "column": 3 - } - }, - { - "id": "signup.link.login", - "defaultMessage": "!!!Already have an account, sign in?", - "file": "src/components/auth/Signup.js", - "start": { - "line": 58, - "column": 13 - }, - "end": { - "line": 61, - "column": 3 - } - }, - { - "id": "signup.emailDuplicate", - "defaultMessage": "!!!A user with that email address already exists", - "file": "src/components/auth/Signup.js", - "start": { - "line": 62, - "column": 18 - }, - "end": { - "line": 65, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/auth/Welcome.json b/src/i18n/messages/src/components/auth/Welcome.json deleted file mode 100644 index b4d2ce689..000000000 --- a/src/i18n/messages/src/components/auth/Welcome.json +++ /dev/null @@ -1,28 +0,0 @@ -[ - { - "id": "welcome.signupButton", - "defaultMessage": "!!!Create a free account", - "file": "src/components/auth/Welcome.js", - "start": { - "line": 9, - "column": 16 - }, - "end": { - "line": 12, - "column": 3 - } - }, - { - "id": "welcome.loginButton", - "defaultMessage": "!!!Login to your account", - "file": "src/components/auth/Welcome.js", - "start": { - "line": 13, - "column": 15 - }, - "end": { - "line": 16, - "column": 3 - } - } -] \ 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 deleted file mode 100644 index 4dd354afc..000000000 --- a/src/i18n/messages/src/components/layout/AppLayout.json +++ /dev/null @@ -1,80 +0,0 @@ -[ - { - "id": "infobar.servicesUpdated", - "defaultMessage": "!!!Your services have been updated.", - "file": "src/components/layout/AppLayout.js", - "start": { - "line": 26, - "column": 19 - }, - "end": { - "line": 29, - "column": 3 - } - }, - { - "id": "infobar.updateAvailable", - "defaultMessage": "!!!A new update for Franz is available.", - "file": "src/components/layout/AppLayout.js", - "start": { - "line": 30, - "column": 19 - }, - "end": { - "line": 33, - "column": 3 - } - }, - { - "id": "infobar.buttonReloadServices", - "defaultMessage": "!!!Reload services", - "file": "src/components/layout/AppLayout.js", - "start": { - "line": 34, - "column": 24 - }, - "end": { - "line": 37, - "column": 3 - } - }, - { - "id": "infobar.buttonChangelog", - "defaultMessage": "!!!Changelog", - "file": "src/components/layout/AppLayout.js", - "start": { - "line": 38, - "column": 13 - }, - "end": { - "line": 41, - "column": 3 - } - }, - { - "id": "infobar.buttonInstallUpdate", - "defaultMessage": "!!!Restart & install update", - "file": "src/components/layout/AppLayout.js", - "start": { - "line": 42, - "column": 23 - }, - "end": { - "line": 45, - "column": 3 - } - }, - { - "id": "infobar.requiredRequestsFailed", - "defaultMessage": "!!!Could not load services and user information", - "file": "src/components/layout/AppLayout.js", - "start": { - "line": 46, - "column": 26 - }, - "end": { - "line": 49, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/layout/Sidebar.json b/src/i18n/messages/src/components/layout/Sidebar.json deleted file mode 100644 index d67adc96e..000000000 --- a/src/i18n/messages/src/components/layout/Sidebar.json +++ /dev/null @@ -1,80 +0,0 @@ -[ - { - "id": "sidebar.settings", - "defaultMessage": "!!!Settings", - "file": "src/components/layout/Sidebar.js", - "start": { - "line": 13, - "column": 12 - }, - "end": { - "line": 16, - "column": 3 - } - }, - { - "id": "sidebar.addNewService", - "defaultMessage": "!!!Add new service", - "file": "src/components/layout/Sidebar.js", - "start": { - "line": 17, - "column": 17 - }, - "end": { - "line": 20, - "column": 3 - } - }, - { - "id": "sidebar.muteApp", - "defaultMessage": "!!!Disable notifications & audio", - "file": "src/components/layout/Sidebar.js", - "start": { - "line": 21, - "column": 8 - }, - "end": { - "line": 24, - "column": 3 - } - }, - { - "id": "sidebar.unmuteApp", - "defaultMessage": "!!!Enable notifications & audio", - "file": "src/components/layout/Sidebar.js", - "start": { - "line": 25, - "column": 10 - }, - "end": { - "line": 28, - "column": 3 - } - }, - { - "id": "sidebar.openWorkspaceDrawer", - "defaultMessage": "!!!Open workspace drawer", - "file": "src/components/layout/Sidebar.js", - "start": { - "line": 29, - "column": 23 - }, - "end": { - "line": 32, - "column": 3 - } - }, - { - "id": "sidebar.closeWorkspaceDrawer", - "defaultMessage": "!!!Close workspace drawer", - "file": "src/components/layout/Sidebar.js", - "start": { - "line": 33, - "column": 24 - }, - "end": { - "line": 36, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/services/content/ErrorHandlers/WebviewErrorHandler.json b/src/i18n/messages/src/components/services/content/ErrorHandlers/WebviewErrorHandler.json deleted file mode 100644 index c8fe802df..000000000 --- a/src/i18n/messages/src/components/services/content/ErrorHandlers/WebviewErrorHandler.json +++ /dev/null @@ -1,67 +0,0 @@ -[ - { - "id": "service.errorHandler.headline", - "defaultMessage": "!!!Oh no!", - "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js", - "start": { - "line": 12, - "column": 12 - }, - "end": { - "line": 15, - "column": 3 - } - }, - { - "id": "service.errorHandler.text", - "defaultMessage": "!!!{name} has failed to load.", - "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js", - "start": { - "line": 16, - "column": 8 - }, - "end": { - "line": 19, - "column": 3 - } - }, - { - "id": "service.errorHandler.action", - "defaultMessage": "!!!Reload {name}", - "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js", - "start": { - "line": 20, - "column": 10 - }, - "end": { - "line": 23, - "column": 3 - } - }, - { - "id": "service.errorHandler.editAction", - "defaultMessage": "!!!Edit {name}", - "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js", - "start": { - "line": 24, - "column": 14 - }, - "end": { - "line": 27, - "column": 3 - } - }, - { - "id": "service.errorHandler.message", - "defaultMessage": "!!!Error:", - "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js", - "start": { - "line": 28, - "column": 16 - }, - "end": { - "line": 31, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/services/content/ServiceDisabled.json b/src/i18n/messages/src/components/services/content/ServiceDisabled.json deleted file mode 100644 index 8bfad28c7..000000000 --- a/src/i18n/messages/src/components/services/content/ServiceDisabled.json +++ /dev/null @@ -1,28 +0,0 @@ -[ - { - "id": "service.disabledHandler.headline", - "defaultMessage": "!!!{name} is disabled", - "file": "src/components/services/content/ServiceDisabled.js", - "start": { - "line": 9, - "column": 12 - }, - "end": { - "line": 12, - "column": 3 - } - }, - { - "id": "service.disabledHandler.action", - "defaultMessage": "!!!Enable {name}", - "file": "src/components/services/content/ServiceDisabled.js", - "start": { - "line": 13, - "column": 10 - }, - "end": { - "line": 16, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/services/content/Services.json b/src/i18n/messages/src/components/services/content/Services.json deleted file mode 100644 index 884ab0c90..000000000 --- a/src/i18n/messages/src/components/services/content/Services.json +++ /dev/null @@ -1,28 +0,0 @@ -[ - { - "id": "services.welcome", - "defaultMessage": "!!!Welcome to Franz", - "file": "src/components/services/content/Services.js", - "start": { - "line": 11, - "column": 11 - }, - "end": { - "line": 14, - "column": 3 - } - }, - { - "id": "services.getStarted", - "defaultMessage": "!!!Get started", - "file": "src/components/services/content/Services.js", - "start": { - "line": 15, - "column": 14 - }, - "end": { - "line": 18, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/services/content/WebviewCrashHandler.json b/src/i18n/messages/src/components/services/content/WebviewCrashHandler.json deleted file mode 100644 index c3d6c41a5..000000000 --- a/src/i18n/messages/src/components/services/content/WebviewCrashHandler.json +++ /dev/null @@ -1,54 +0,0 @@ -[ - { - "id": "service.crashHandler.headline", - "defaultMessage": "!!!Oh no!", - "file": "src/components/services/content/WebviewCrashHandler.js", - "start": { - "line": 10, - "column": 12 - }, - "end": { - "line": 13, - "column": 3 - } - }, - { - "id": "service.crashHandler.text", - "defaultMessage": "!!!{name} has caused an error.", - "file": "src/components/services/content/WebviewCrashHandler.js", - "start": { - "line": 14, - "column": 8 - }, - "end": { - "line": 17, - "column": 3 - } - }, - { - "id": "service.crashHandler.action", - "defaultMessage": "!!!Reload {name}", - "file": "src/components/services/content/WebviewCrashHandler.js", - "start": { - "line": 18, - "column": 10 - }, - "end": { - "line": 21, - "column": 3 - } - }, - { - "id": "service.crashHandler.autoReload", - "defaultMessage": "!!!Trying to automatically restore {name} in {seconds} seconds", - "file": "src/components/services/content/WebviewCrashHandler.js", - "start": { - "line": 22, - "column": 14 - }, - "end": { - "line": 25, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/services/tabs/TabItem.json b/src/i18n/messages/src/components/services/tabs/TabItem.json deleted file mode 100644 index 08a07845c..000000000 --- a/src/i18n/messages/src/components/services/tabs/TabItem.json +++ /dev/null @@ -1,119 +0,0 @@ -[ - { - "id": "tabs.item.reload", - "defaultMessage": "!!!Reload", - "file": "src/components/services/tabs/TabItem.js", - "start": { - "line": 15, - "column": 10 - }, - "end": { - "line": 18, - "column": 3 - } - }, - { - "id": "tabs.item.edit", - "defaultMessage": "!!!Edit", - "file": "src/components/services/tabs/TabItem.js", - "start": { - "line": 19, - "column": 8 - }, - "end": { - "line": 22, - "column": 3 - } - }, - { - "id": "tabs.item.disableNotifications", - "defaultMessage": "!!!Disable notifications", - "file": "src/components/services/tabs/TabItem.js", - "start": { - "line": 23, - "column": 24 - }, - "end": { - "line": 26, - "column": 3 - } - }, - { - "id": "tabs.item.enableNotification", - "defaultMessage": "!!!Enable notifications", - "file": "src/components/services/tabs/TabItem.js", - "start": { - "line": 27, - "column": 23 - }, - "end": { - "line": 30, - "column": 3 - } - }, - { - "id": "tabs.item.disableAudio", - "defaultMessage": "!!!Disable audio", - "file": "src/components/services/tabs/TabItem.js", - "start": { - "line": 31, - "column": 16 - }, - "end": { - "line": 34, - "column": 3 - } - }, - { - "id": "tabs.item.enableAudio", - "defaultMessage": "!!!Enable audio", - "file": "src/components/services/tabs/TabItem.js", - "start": { - "line": 35, - "column": 15 - }, - "end": { - "line": 38, - "column": 3 - } - }, - { - "id": "tabs.item.disableService", - "defaultMessage": "!!!Disable Service", - "file": "src/components/services/tabs/TabItem.js", - "start": { - "line": 39, - "column": 18 - }, - "end": { - "line": 42, - "column": 3 - } - }, - { - "id": "tabs.item.enableService", - "defaultMessage": "!!!Enable Service", - "file": "src/components/services/tabs/TabItem.js", - "start": { - "line": 43, - "column": 17 - }, - "end": { - "line": 46, - "column": 3 - } - }, - { - "id": "tabs.item.deleteService", - "defaultMessage": "!!!Delete Service", - "file": "src/components/services/tabs/TabItem.js", - "start": { - "line": 47, - "column": 17 - }, - "end": { - "line": 50, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/settings/account/AccountDashboard.json b/src/i18n/messages/src/components/settings/account/AccountDashboard.json deleted file mode 100644 index 603950395..000000000 --- a/src/i18n/messages/src/components/settings/account/AccountDashboard.json +++ /dev/null @@ -1,197 +0,0 @@ -[ - { - "id": "settings.account.headline", - "defaultMessage": "!!!Account", - "file": "src/components/settings/account/AccountDashboard.js", - "start": { - "line": 15, - "column": 12 - }, - "end": { - "line": 18, - "column": 3 - } - }, - { - "id": "settings.account.headlineSubscription", - "defaultMessage": "!!!Your Subscription", - "file": "src/components/settings/account/AccountDashboard.js", - "start": { - "line": 19, - "column": 24 - }, - "end": { - "line": 22, - "column": 3 - } - }, - { - "id": "settings.account.headlineUpgrade", - "defaultMessage": "!!!Upgrade your Account", - "file": "src/components/settings/account/AccountDashboard.js", - "start": { - "line": 23, - "column": 19 - }, - "end": { - "line": 26, - "column": 3 - } - }, - { - "id": "settings.account.headlineInvoices", - "defaultMessage": "!!Invoices", - "file": "src/components/settings/account/AccountDashboard.js", - "start": { - "line": 27, - "column": 20 - }, - "end": { - "line": 30, - "column": 3 - } - }, - { - "id": "settings.account.headlineDangerZone", - "defaultMessage": "!!Danger Zone", - "file": "src/components/settings/account/AccountDashboard.js", - "start": { - "line": 31, - "column": 22 - }, - "end": { - "line": 34, - "column": 3 - } - }, - { - "id": "settings.account.manageSubscription.label", - "defaultMessage": "!!!Manage your subscription", - "file": "src/components/settings/account/AccountDashboard.js", - "start": { - "line": 35, - "column": 33 - }, - "end": { - "line": 38, - "column": 3 - } - }, - { - "id": "settings.account.accountType.basic", - "defaultMessage": "!!!Basic Account", - "file": "src/components/settings/account/AccountDashboard.js", - "start": { - "line": 39, - "column": 20 - }, - "end": { - "line": 42, - "column": 3 - } - }, - { - "id": "settings.account.accountType.premium", - "defaultMessage": "!!!Premium Supporter Account", - "file": "src/components/settings/account/AccountDashboard.js", - "start": { - "line": 43, - "column": 22 - }, - "end": { - "line": 46, - "column": 3 - } - }, - { - "id": "settings.account.account.editButton", - "defaultMessage": "!!!Edit Account", - "file": "src/components/settings/account/AccountDashboard.js", - "start": { - "line": 47, - "column": 21 - }, - "end": { - "line": 50, - "column": 3 - } - }, - { - "id": "settings.account.invoiceDownload", - "defaultMessage": "!!!Download", - "file": "src/components/settings/account/AccountDashboard.js", - "start": { - "line": 51, - "column": 19 - }, - "end": { - "line": 54, - "column": 3 - } - }, - { - "id": "settings.account.userInfoRequestFailed", - "defaultMessage": "!!!Could not load user information", - "file": "src/components/settings/account/AccountDashboard.js", - "start": { - "line": 55, - "column": 25 - }, - "end": { - "line": 58, - "column": 3 - } - }, - { - "id": "settings.account.tryReloadUserInfoRequest", - "defaultMessage": "!!!Try again", - "file": "src/components/settings/account/AccountDashboard.js", - "start": { - "line": 59, - "column": 28 - }, - "end": { - "line": 62, - "column": 3 - } - }, - { - "id": "settings.account.deleteAccount", - "defaultMessage": "!!!Delete account", - "file": "src/components/settings/account/AccountDashboard.js", - "start": { - "line": 63, - "column": 17 - }, - "end": { - "line": 66, - "column": 3 - } - }, - { - "id": "settings.account.deleteInfo", - "defaultMessage": "!!!If you don't need your Franz account any longer, you can delete your account and all related data here.", - "file": "src/components/settings/account/AccountDashboard.js", - "start": { - "line": 67, - "column": 14 - }, - "end": { - "line": 70, - "column": 3 - } - }, - { - "id": "settings.account.deleteEmailSent", - "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!", - "file": "src/components/settings/account/AccountDashboard.js", - "start": { - "line": 71, - "column": 19 - }, - "end": { - "line": 74, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json deleted file mode 100644 index 77b0ed8a4..000000000 --- a/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json +++ /dev/null @@ -1,93 +0,0 @@ -[ - { - "id": "settings.navigation.availableServices", - "defaultMessage": "!!!Available services", - "file": "src/components/settings/navigation/SettingsNavigation.js", - "start": { - "line": 12, - "column": 21 - }, - "end": { - "line": 15, - "column": 3 - } - }, - { - "id": "settings.navigation.yourServices", - "defaultMessage": "!!!Your services", - "file": "src/components/settings/navigation/SettingsNavigation.js", - "start": { - "line": 16, - "column": 16 - }, - "end": { - "line": 19, - "column": 3 - } - }, - { - "id": "settings.navigation.yourWorkspaces", - "defaultMessage": "!!!Your workspaces", - "file": "src/components/settings/navigation/SettingsNavigation.js", - "start": { - "line": 20, - "column": 18 - }, - "end": { - "line": 23, - "column": 3 - } - }, - { - "id": "settings.navigation.account", - "defaultMessage": "!!!Account", - "file": "src/components/settings/navigation/SettingsNavigation.js", - "start": { - "line": 24, - "column": 11 - }, - "end": { - "line": 27, - "column": 3 - } - }, - { - "id": "settings.navigation.settings", - "defaultMessage": "!!!Settings", - "file": "src/components/settings/navigation/SettingsNavigation.js", - "start": { - "line": 28, - "column": 12 - }, - "end": { - "line": 31, - "column": 3 - } - }, - { - "id": "settings.navigation.inviteFriends", - "defaultMessage": "!!!Invite Friends", - "file": "src/components/settings/navigation/SettingsNavigation.js", - "start": { - "line": 32, - "column": 17 - }, - "end": { - "line": 35, - "column": 3 - } - }, - { - "id": "settings.navigation.logout", - "defaultMessage": "!!!Logout", - "file": "src/components/settings/navigation/SettingsNavigation.js", - "start": { - "line": 36, - "column": 10 - }, - "end": { - "line": 39, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json b/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json deleted file mode 100644 index 7d9ed3283..000000000 --- a/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json +++ /dev/null @@ -1,106 +0,0 @@ -[ - { - "id": "settings.recipes.headline", - "defaultMessage": "!!!Available Services", - "file": "src/components/settings/recipes/RecipesDashboard.js", - "start": { - "line": 15, - "column": 12 - }, - "end": { - "line": 18, - "column": 3 - } - }, - { - "id": "settings.searchService", - "defaultMessage": "!!!Search service", - "file": "src/components/settings/recipes/RecipesDashboard.js", - "start": { - "line": 19, - "column": 17 - }, - "end": { - "line": 22, - "column": 3 - } - }, - { - "id": "settings.recipes.mostPopular", - "defaultMessage": "!!!Most popular", - "file": "src/components/settings/recipes/RecipesDashboard.js", - "start": { - "line": 23, - "column": 22 - }, - "end": { - "line": 26, - "column": 3 - } - }, - { - "id": "settings.recipes.all", - "defaultMessage": "!!!All services", - "file": "src/components/settings/recipes/RecipesDashboard.js", - "start": { - "line": 27, - "column": 14 - }, - "end": { - "line": 30, - "column": 3 - } - }, - { - "id": "settings.recipes.dev", - "defaultMessage": "!!!Development", - "file": "src/components/settings/recipes/RecipesDashboard.js", - "start": { - "line": 31, - "column": 14 - }, - "end": { - "line": 34, - "column": 3 - } - }, - { - "id": "settings.recipes.nothingFound", - "defaultMessage": "!!!Sorry, but no service matched your search term.", - "file": "src/components/settings/recipes/RecipesDashboard.js", - "start": { - "line": 35, - "column": 16 - }, - "end": { - "line": 38, - "column": 3 - } - }, - { - "id": "settings.recipes.servicesSuccessfulAddedInfo", - "defaultMessage": "!!!Service successfully added", - "file": "src/components/settings/recipes/RecipesDashboard.js", - "start": { - "line": 39, - "column": 31 - }, - "end": { - "line": 42, - "column": 3 - } - }, - { - "id": "settings.recipes.missingService", - "defaultMessage": "!!!Missing a service?", - "file": "src/components/settings/recipes/RecipesDashboard.js", - "start": { - "line": 43, - "column": 18 - }, - "end": { - "line": 46, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/settings/services/EditServiceForm.json b/src/i18n/messages/src/components/settings/services/EditServiceForm.json deleted file mode 100644 index 42b741b7a..000000000 --- a/src/i18n/messages/src/components/settings/services/EditServiceForm.json +++ /dev/null @@ -1,288 +0,0 @@ -[ - { - "id": "settings.service.form.saveButton", - "defaultMessage": "!!!Save service", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 22, - "column": 15 - }, - "end": { - "line": 25, - "column": 3 - } - }, - { - "id": "settings.service.form.deleteButton", - "defaultMessage": "!!!Delete Service", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 26, - "column": 17 - }, - "end": { - "line": 29, - "column": 3 - } - }, - { - "id": "settings.service.form.availableServices", - "defaultMessage": "!!!Available services", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 30, - "column": 21 - }, - "end": { - "line": 33, - "column": 3 - } - }, - { - "id": "settings.service.form.yourServices", - "defaultMessage": "!!!Your services", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 34, - "column": 16 - }, - "end": { - "line": 37, - "column": 3 - } - }, - { - "id": "settings.service.form.addServiceHeadline", - "defaultMessage": "!!!Add {name}", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 38, - "column": 22 - }, - "end": { - "line": 41, - "column": 3 - } - }, - { - "id": "settings.service.form.editServiceHeadline", - "defaultMessage": "!!!Edit {name}", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 42, - "column": 23 - }, - "end": { - "line": 45, - "column": 3 - } - }, - { - "id": "settings.service.form.tabHosted", - "defaultMessage": "!!!Hosted", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 46, - "column": 13 - }, - "end": { - "line": 49, - "column": 3 - } - }, - { - "id": "settings.service.form.tabOnPremise", - "defaultMessage": "!!!Self hosted ⭐️", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 50, - "column": 16 - }, - "end": { - "line": 53, - "column": 3 - } - }, - { - "id": "settings.service.form.useHostedService", - "defaultMessage": "!!!Use the hosted {name} service.", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 54, - "column": 20 - }, - "end": { - "line": 57, - "column": 3 - } - }, - { - "id": "settings.service.form.customUrlValidationError", - "defaultMessage": "!!!Could not validate custom {name} server.", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 58, - "column": 28 - }, - "end": { - "line": 61, - "column": 3 - } - }, - { - "id": "settings.service.form.customUrlPremiumInfo", - "defaultMessage": "!!!To add self hosted services, you need a Franz Premium Supporter Account.", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 62, - "column": 24 - }, - "end": { - "line": 65, - "column": 3 - } - }, - { - "id": "settings.service.form.customUrlUpgradeAccount", - "defaultMessage": "!!!Upgrade your account", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 66, - "column": 27 - }, - "end": { - "line": 69, - "column": 3 - } - }, - { - "id": "settings.service.form.indirectMessageInfo", - "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 70, - "column": 23 - }, - "end": { - "line": 73, - "column": 3 - } - }, - { - "id": "settings.service.form.isMutedInfo", - "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 74, - "column": 15 - }, - "end": { - "line": 77, - "column": 3 - } - }, - { - "id": "settings.service.form.headlineNotifications", - "defaultMessage": "!!!Notifications", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 78, - "column": 25 - }, - "end": { - "line": 81, - "column": 3 - } - }, - { - "id": "settings.service.form.headlineBadges", - "defaultMessage": "!!!Unread message badges", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 82, - "column": 18 - }, - "end": { - "line": 85, - "column": 3 - } - }, - { - "id": "settings.service.form.headlineGeneral", - "defaultMessage": "!!!General", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 86, - "column": 19 - }, - "end": { - "line": 89, - "column": 3 - } - }, - { - "id": "settings.service.form.iconDelete", - "defaultMessage": "!!!Delete", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 90, - "column": 14 - }, - "end": { - "line": 93, - "column": 3 - } - }, - { - "id": "settings.service.form.iconUpload", - "defaultMessage": "!!!Drop your image, or click here", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 94, - "column": 14 - }, - "end": { - "line": 97, - "column": 3 - } - }, - { - "id": "settings.service.form.proxy.headline", - "defaultMessage": "!!!HTTP/HTTPS Proxy Settings", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 98, - "column": 17 - }, - "end": { - "line": 101, - "column": 3 - } - }, - { - "id": "settings.service.form.proxy.restartInfo", - "defaultMessage": "!!!Please restart Franz after changing proxy Settings.", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 102, - "column": 20 - }, - "end": { - "line": 105, - "column": 3 - } - }, - { - "id": "settings.service.form.proxy.info", - "defaultMessage": "!!!Proxy settings will not be synchronized with the Franz servers.", - "file": "src/components/settings/services/EditServiceForm.js", - "start": { - "line": 106, - "column": 13 - }, - "end": { - "line": 109, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/settings/services/ServiceError.json b/src/i18n/messages/src/components/settings/services/ServiceError.json deleted file mode 100644 index 648fc5b3e..000000000 --- a/src/i18n/messages/src/components/settings/services/ServiceError.json +++ /dev/null @@ -1,54 +0,0 @@ -[ - { - "id": "settings.service.error.headline", - "defaultMessage": "!!!Error", - "file": "src/components/settings/services/ServiceError.js", - "start": { - "line": 10, - "column": 12 - }, - "end": { - "line": 13, - "column": 3 - } - }, - { - "id": "settings.service.error.goBack", - "defaultMessage": "!!!Back to services", - "file": "src/components/settings/services/ServiceError.js", - "start": { - "line": 14, - "column": 10 - }, - "end": { - "line": 17, - "column": 3 - } - }, - { - "id": "settings.service.form.availableServices", - "defaultMessage": "!!!Available services", - "file": "src/components/settings/services/ServiceError.js", - "start": { - "line": 18, - "column": 21 - }, - "end": { - "line": 21, - "column": 3 - } - }, - { - "id": "settings.service.error.message", - "defaultMessage": "!!!Could not load service recipe.", - "file": "src/components/settings/services/ServiceError.js", - "start": { - "line": 22, - "column": 16 - }, - "end": { - "line": 25, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/settings/services/ServiceItem.json b/src/i18n/messages/src/components/settings/services/ServiceItem.json deleted file mode 100644 index ffea8b9e1..000000000 --- a/src/i18n/messages/src/components/settings/services/ServiceItem.json +++ /dev/null @@ -1,41 +0,0 @@ -[ - { - "id": "settings.services.tooltip.isDisabled", - "defaultMessage": "!!!Service is disabled", - "file": "src/components/settings/services/ServiceItem.js", - "start": { - "line": 11, - "column": 21 - }, - "end": { - "line": 14, - "column": 3 - } - }, - { - "id": "settings.services.tooltip.notificationsDisabled", - "defaultMessage": "!!!Notifications are disabled", - "file": "src/components/settings/services/ServiceItem.js", - "start": { - "line": 15, - "column": 32 - }, - "end": { - "line": 18, - "column": 3 - } - }, - { - "id": "settings.services.tooltip.isMuted", - "defaultMessage": "!!!All sounds are muted", - "file": "src/components/settings/services/ServiceItem.js", - "start": { - "line": 19, - "column": 18 - }, - "end": { - "line": 22, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/settings/services/ServicesDashboard.json b/src/i18n/messages/src/components/settings/services/ServicesDashboard.json deleted file mode 100644 index 3803c6512..000000000 --- a/src/i18n/messages/src/components/settings/services/ServicesDashboard.json +++ /dev/null @@ -1,119 +0,0 @@ -[ - { - "id": "settings.services.headline", - "defaultMessage": "!!!Your services", - "file": "src/components/settings/services/ServicesDashboard.js", - "start": { - "line": 14, - "column": 12 - }, - "end": { - "line": 17, - "column": 3 - } - }, - { - "id": "settings.searchService", - "defaultMessage": "!!!Search service", - "file": "src/components/settings/services/ServicesDashboard.js", - "start": { - "line": 18, - "column": 17 - }, - "end": { - "line": 21, - "column": 3 - } - }, - { - "id": "settings.services.noServicesAdded", - "defaultMessage": "!!!You haven't added any services yet.", - "file": "src/components/settings/services/ServicesDashboard.js", - "start": { - "line": 22, - "column": 19 - }, - "end": { - "line": 25, - "column": 3 - } - }, - { - "id": "settings.recipes.nothingFound", - "defaultMessage": "!!!Sorry, but no service matched your search term.", - "file": "src/components/settings/services/ServicesDashboard.js", - "start": { - "line": 26, - "column": 18 - }, - "end": { - "line": 29, - "column": 3 - } - }, - { - "id": "settings.services.discoverServices", - "defaultMessage": "!!!Discover services", - "file": "src/components/settings/services/ServicesDashboard.js", - "start": { - "line": 30, - "column": 20 - }, - "end": { - "line": 33, - "column": 3 - } - }, - { - "id": "settings.services.servicesRequestFailed", - "defaultMessage": "!!!Could not load your services", - "file": "src/components/settings/services/ServicesDashboard.js", - "start": { - "line": 34, - "column": 25 - }, - "end": { - "line": 37, - "column": 3 - } - }, - { - "id": "settings.account.tryReloadServices", - "defaultMessage": "!!!Try again", - "file": "src/components/settings/services/ServicesDashboard.js", - "start": { - "line": 38, - "column": 21 - }, - "end": { - "line": 41, - "column": 3 - } - }, - { - "id": "settings.services.updatedInfo", - "defaultMessage": "!!!Your changes have been saved", - "file": "src/components/settings/services/ServicesDashboard.js", - "start": { - "line": 42, - "column": 15 - }, - "end": { - "line": 45, - "column": 3 - } - }, - { - "id": "settings.services.deletedInfo", - "defaultMessage": "!!!Service has been deleted", - "file": "src/components/settings/services/ServicesDashboard.js", - "start": { - "line": 46, - "column": 15 - }, - "end": { - "line": 49, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json b/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json deleted file mode 100644 index c64f477be..000000000 --- a/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json +++ /dev/null @@ -1,223 +0,0 @@ -[ - { - "id": "settings.app.headline", - "defaultMessage": "!!!Settings", - "file": "src/components/settings/settings/EditSettingsForm.js", - "start": { - "line": 16, - "column": 12 - }, - "end": { - "line": 19, - "column": 3 - } - }, - { - "id": "settings.app.headlineGeneral", - "defaultMessage": "!!!General", - "file": "src/components/settings/settings/EditSettingsForm.js", - "start": { - "line": 20, - "column": 19 - }, - "end": { - "line": 23, - "column": 3 - } - }, - { - "id": "settings.app.headlineLanguage", - "defaultMessage": "!!!Language", - "file": "src/components/settings/settings/EditSettingsForm.js", - "start": { - "line": 24, - "column": 20 - }, - "end": { - "line": 27, - "column": 3 - } - }, - { - "id": "settings.app.headlineUpdates", - "defaultMessage": "!!!Updates", - "file": "src/components/settings/settings/EditSettingsForm.js", - "start": { - "line": 28, - "column": 19 - }, - "end": { - "line": 31, - "column": 3 - } - }, - { - "id": "settings.app.headlineAppearance", - "defaultMessage": "!!!Appearance", - "file": "src/components/settings/settings/EditSettingsForm.js", - "start": { - "line": 32, - "column": 22 - }, - "end": { - "line": 35, - "column": 3 - } - }, - { - "id": "settings.app.headlineAdvanced", - "defaultMessage": "!!!Advanced", - "file": "src/components/settings/settings/EditSettingsForm.js", - "start": { - "line": 36, - "column": 20 - }, - "end": { - "line": 39, - "column": 3 - } - }, - { - "id": "settings.app.translationHelp", - "defaultMessage": "!!!Help us to translate Franz into your language.", - "file": "src/components/settings/settings/EditSettingsForm.js", - "start": { - "line": 40, - "column": 19 - }, - "end": { - "line": 43, - "column": 3 - } - }, - { - "id": "settings.app.subheadlineCache", - "defaultMessage": "!!!Cache", - "file": "src/components/settings/settings/EditSettingsForm.js", - "start": { - "line": 44, - "column": 20 - }, - "end": { - "line": 47, - "column": 3 - } - }, - { - "id": "settings.app.cacheInfo", - "defaultMessage": "!!!Franz cache is currently using {size} of disk space.", - "file": "src/components/settings/settings/EditSettingsForm.js", - "start": { - "line": 48, - "column": 13 - }, - "end": { - "line": 51, - "column": 3 - } - }, - { - "id": "settings.app.buttonClearAllCache", - "defaultMessage": "!!!Clear cache", - "file": "src/components/settings/settings/EditSettingsForm.js", - "start": { - "line": 52, - "column": 23 - }, - "end": { - "line": 55, - "column": 3 - } - }, - { - "id": "settings.app.buttonSearchForUpdate", - "defaultMessage": "!!!Check for updates", - "file": "src/components/settings/settings/EditSettingsForm.js", - "start": { - "line": 56, - "column": 25 - }, - "end": { - "line": 59, - "column": 3 - } - }, - { - "id": "settings.app.buttonInstallUpdate", - "defaultMessage": "!!!Restart & install update", - "file": "src/components/settings/settings/EditSettingsForm.js", - "start": { - "line": 60, - "column": 23 - }, - "end": { - "line": 63, - "column": 3 - } - }, - { - "id": "settings.app.updateStatusSearching", - "defaultMessage": "!!!Is searching for update", - "file": "src/components/settings/settings/EditSettingsForm.js", - "start": { - "line": 64, - "column": 25 - }, - "end": { - "line": 67, - "column": 3 - } - }, - { - "id": "settings.app.updateStatusAvailable", - "defaultMessage": "!!!Update available, downloading...", - "file": "src/components/settings/settings/EditSettingsForm.js", - "start": { - "line": 68, - "column": 25 - }, - "end": { - "line": 71, - "column": 3 - } - }, - { - "id": "settings.app.updateStatusUpToDate", - "defaultMessage": "!!!You are using the latest version of Franz", - "file": "src/components/settings/settings/EditSettingsForm.js", - "start": { - "line": 72, - "column": 24 - }, - "end": { - "line": 75, - "column": 3 - } - }, - { - "id": "settings.app.currentVersion", - "defaultMessage": "!!!Current version:", - "file": "src/components/settings/settings/EditSettingsForm.js", - "start": { - "line": 76, - "column": 18 - }, - "end": { - "line": 79, - "column": 3 - } - }, - { - "id": "settings.app.restartRequired", - "defaultMessage": "!!!Changes require restart", - "file": "src/components/settings/settings/EditSettingsForm.js", - "start": { - "line": 80, - "column": 29 - }, - "end": { - "line": 83, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/settings/user/EditUserForm.json b/src/i18n/messages/src/components/settings/user/EditUserForm.json deleted file mode 100644 index 3a59f8681..000000000 --- a/src/i18n/messages/src/components/settings/user/EditUserForm.json +++ /dev/null @@ -1,80 +0,0 @@ -[ - { - "id": "settings.account.headline", - "defaultMessage": "!!!Account", - "file": "src/components/settings/user/EditUserForm.js", - "start": { - "line": 15, - "column": 12 - }, - "end": { - "line": 18, - "column": 3 - } - }, - { - "id": "settings.account.headlineProfile", - "defaultMessage": "!!!Update Profile", - "file": "src/components/settings/user/EditUserForm.js", - "start": { - "line": 19, - "column": 19 - }, - "end": { - "line": 22, - "column": 3 - } - }, - { - "id": "settings.account.headlineAccount", - "defaultMessage": "!!!Account Information", - "file": "src/components/settings/user/EditUserForm.js", - "start": { - "line": 23, - "column": 19 - }, - "end": { - "line": 26, - "column": 3 - } - }, - { - "id": "settings.account.headlinePassword", - "defaultMessage": "!!!Change Password", - "file": "src/components/settings/user/EditUserForm.js", - "start": { - "line": 27, - "column": 20 - }, - "end": { - "line": 30, - "column": 3 - } - }, - { - "id": "settings.account.successInfo", - "defaultMessage": "!!!Your changes have been saved", - "file": "src/components/settings/user/EditUserForm.js", - "start": { - "line": 31, - "column": 15 - }, - "end": { - "line": 34, - "column": 3 - } - }, - { - "id": "settings.account.buttonSave", - "defaultMessage": "!!!Update profile", - "file": "src/components/settings/user/EditUserForm.js", - "start": { - "line": 35, - "column": 14 - }, - "end": { - "line": 38, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/subscription/SubscriptionForm.json b/src/i18n/messages/src/components/subscription/SubscriptionForm.json deleted file mode 100644 index cc7470358..000000000 --- a/src/i18n/messages/src/components/subscription/SubscriptionForm.json +++ /dev/null @@ -1,171 +0,0 @@ -[ - { - "id": "subscription.submit.label", - "defaultMessage": "!!!Support the development of Franz", - "file": "src/components/subscription/SubscriptionForm.js", - "start": { - "line": 14, - "column": 21 - }, - "end": { - "line": 17, - "column": 3 - } - }, - { - "id": "subscription.paymentSessionError", - "defaultMessage": "!!!Could not initialize payment form", - "file": "src/components/subscription/SubscriptionForm.js", - "start": { - "line": 18, - "column": 23 - }, - "end": { - "line": 21, - "column": 3 - } - }, - { - "id": "subscription.type.free", - "defaultMessage": "!!!free", - "file": "src/components/subscription/SubscriptionForm.js", - "start": { - "line": 22, - "column": 12 - }, - "end": { - "line": 25, - "column": 3 - } - }, - { - "id": "subscription.type.month", - "defaultMessage": "!!!month", - "file": "src/components/subscription/SubscriptionForm.js", - "start": { - "line": 26, - "column": 15 - }, - "end": { - "line": 29, - "column": 3 - } - }, - { - "id": "subscription.type.year", - "defaultMessage": "!!!year", - "file": "src/components/subscription/SubscriptionForm.js", - "start": { - "line": 30, - "column": 14 - }, - "end": { - "line": 33, - "column": 3 - } - }, - { - "id": "subscription.includedFeatures", - "defaultMessage": "!!!The Franz Premium Supporter Account includes", - "file": "src/components/subscription/SubscriptionForm.js", - "start": { - "line": 34, - "column": 20 - }, - "end": { - "line": 37, - "column": 3 - } - }, - { - "id": "subscription.features.onpremise.mattermost", - "defaultMessage": "!!!Add on-premise/hosted services like Mattermost", - "file": "src/components/subscription/SubscriptionForm.js", - "start": { - "line": 38, - "column": 13 - }, - "end": { - "line": 41, - "column": 3 - } - }, - { - "id": "subscription.features.noInterruptions", - "defaultMessage": "!!!No app delays & nagging to upgrade license", - "file": "src/components/subscription/SubscriptionForm.js", - "start": { - "line": 42, - "column": 19 - }, - "end": { - "line": 45, - "column": 3 - } - }, - { - "id": "subscription.features.proxy", - "defaultMessage": "!!!Proxy support for services", - "file": "src/components/subscription/SubscriptionForm.js", - "start": { - "line": 46, - "column": 9 - }, - "end": { - "line": 49, - "column": 3 - } - }, - { - "id": "subscription.features.spellchecker", - "defaultMessage": "!!!Support for Spellchecker", - "file": "src/components/subscription/SubscriptionForm.js", - "start": { - "line": 50, - "column": 16 - }, - "end": { - "line": 53, - "column": 3 - } - }, - { - "id": "subscription.features.ads", - "defaultMessage": "!!!No ads, ever!", - "file": "src/components/subscription/SubscriptionForm.js", - "start": { - "line": 54, - "column": 7 - }, - "end": { - "line": 57, - "column": 3 - } - }, - { - "id": "subscription.features.comingSoon", - "defaultMessage": "!!!coming soon", - "file": "src/components/subscription/SubscriptionForm.js", - "start": { - "line": 58, - "column": 14 - }, - "end": { - "line": 61, - "column": 3 - } - }, - { - "id": "subscription.euTaxInfo", - "defaultMessage": "!!!EU residents: local sales tax may apply", - "file": "src/components/subscription/SubscriptionForm.js", - "start": { - "line": 62, - "column": 13 - }, - "end": { - "line": 65, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/subscription/SubscriptionPopup.json b/src/i18n/messages/src/components/subscription/SubscriptionPopup.json deleted file mode 100644 index c06da7531..000000000 --- a/src/i18n/messages/src/components/subscription/SubscriptionPopup.json +++ /dev/null @@ -1,28 +0,0 @@ -[ - { - "id": "subscriptionPopup.buttonCancel", - "defaultMessage": "!!!Cancel", - "file": "src/components/subscription/SubscriptionPopup.js", - "start": { - "line": 11, - "column": 16 - }, - "end": { - "line": 14, - "column": 3 - } - }, - { - "id": "subscriptionPopup.buttonDone", - "defaultMessage": "!!!Done", - "file": "src/components/subscription/SubscriptionPopup.js", - "start": { - "line": 15, - "column": 14 - }, - "end": { - "line": 18, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json b/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json deleted file mode 100644 index 320d3ca3e..000000000 --- a/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json +++ /dev/null @@ -1,15 +0,0 @@ -[ - { - "id": "premiumFeature.button.upgradeAccount", - "defaultMessage": "!!!Upgrade account", - "file": "src/components/ui/PremiumFeatureContainer/index.js", - "start": { - "line": 15, - "column": 10 - }, - "end": { - "line": 18, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/ui/WebviewLoader/index.json b/src/i18n/messages/src/components/ui/WebviewLoader/index.json deleted file mode 100644 index ef3e4b593..000000000 --- a/src/i18n/messages/src/components/ui/WebviewLoader/index.json +++ /dev/null @@ -1,15 +0,0 @@ -[ - { - "id": "service.webviewLoader.loading", - "defaultMessage": "!!!Loading", - "file": "src/components/ui/WebviewLoader/index.js", - "start": { - "line": 11, - "column": 11 - }, - "end": { - "line": 14, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/components/util/ErrorBoundary/index.json b/src/i18n/messages/src/components/util/ErrorBoundary/index.json deleted file mode 100644 index 43c323031..000000000 --- a/src/i18n/messages/src/components/util/ErrorBoundary/index.json +++ /dev/null @@ -1,28 +0,0 @@ -[ - { - "id": "app.errorHandler.headline", - "defaultMessage": "!!!Something went wrong.", - "file": "src/components/util/ErrorBoundary/index.js", - "start": { - "line": 11, - "column": 12 - }, - "end": { - "line": 14, - "column": 3 - } - }, - { - "id": "app.errorHandler.action", - "defaultMessage": "!!!Reload", - "file": "src/components/util/ErrorBoundary/index.js", - "start": { - "line": 15, - "column": 10 - }, - "end": { - "line": 18, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/containers/settings/EditServiceScreen.json b/src/i18n/messages/src/containers/settings/EditServiceScreen.json deleted file mode 100644 index 42ca42125..000000000 --- a/src/i18n/messages/src/containers/settings/EditServiceScreen.json +++ /dev/null @@ -1,197 +0,0 @@ -[ - { - "id": "settings.service.form.name", - "defaultMessage": "!!!Name", - "file": "src/containers/settings/EditServiceScreen.js", - "start": { - "line": 28, - "column": 8 - }, - "end": { - "line": 31, - "column": 3 - } - }, - { - "id": "settings.service.form.enableService", - "defaultMessage": "!!!Enable service", - "file": "src/containers/settings/EditServiceScreen.js", - "start": { - "line": 32, - "column": 17 - }, - "end": { - "line": 35, - "column": 3 - } - }, - { - "id": "settings.service.form.enableNotification", - "defaultMessage": "!!!Enable Notifications", - "file": "src/containers/settings/EditServiceScreen.js", - "start": { - "line": 36, - "column": 22 - }, - "end": { - "line": 39, - "column": 3 - } - }, - { - "id": "settings.service.form.enableBadge", - "defaultMessage": "!!!Show unread message badges", - "file": "src/containers/settings/EditServiceScreen.js", - "start": { - "line": 40, - "column": 15 - }, - "end": { - "line": 43, - "column": 3 - } - }, - { - "id": "settings.service.form.enableAudio", - "defaultMessage": "!!!Enable audio", - "file": "src/containers/settings/EditServiceScreen.js", - "start": { - "line": 44, - "column": 15 - }, - "end": { - "line": 47, - "column": 3 - } - }, - { - "id": "settings.service.form.team", - "defaultMessage": "!!!Team", - "file": "src/containers/settings/EditServiceScreen.js", - "start": { - "line": 48, - "column": 8 - }, - "end": { - "line": 51, - "column": 3 - } - }, - { - "id": "settings.service.form.customUrl", - "defaultMessage": "!!!Custom server", - "file": "src/containers/settings/EditServiceScreen.js", - "start": { - "line": 52, - "column": 13 - }, - "end": { - "line": 55, - "column": 3 - } - }, - { - "id": "settings.service.form.indirectMessages", - "defaultMessage": "!!!Show message badge for all new messages", - "file": "src/containers/settings/EditServiceScreen.js", - "start": { - "line": 56, - "column": 20 - }, - "end": { - "line": 59, - "column": 3 - } - }, - { - "id": "settings.service.form.icon", - "defaultMessage": "!!!Custom icon", - "file": "src/containers/settings/EditServiceScreen.js", - "start": { - "line": 60, - "column": 8 - }, - "end": { - "line": 63, - "column": 3 - } - }, - { - "id": "settings.service.form.enableDarkMode", - "defaultMessage": "!!!Enable Dark Mode", - "file": "src/containers/settings/EditServiceScreen.js", - "start": { - "line": 64, - "column": 18 - }, - "end": { - "line": 67, - "column": 3 - } - }, - { - "id": "settings.service.form.proxy.isEnabled", - "defaultMessage": "!!!Use Proxy", - "file": "src/containers/settings/EditServiceScreen.js", - "start": { - "line": 68, - "column": 15 - }, - "end": { - "line": 71, - "column": 3 - } - }, - { - "id": "settings.service.form.proxy.host", - "defaultMessage": "!!!Proxy Host/IP", - "file": "src/containers/settings/EditServiceScreen.js", - "start": { - "line": 72, - "column": 13 - }, - "end": { - "line": 75, - "column": 3 - } - }, - { - "id": "settings.service.form.proxy.port", - "defaultMessage": "!!!Port", - "file": "src/containers/settings/EditServiceScreen.js", - "start": { - "line": 76, - "column": 13 - }, - "end": { - "line": 79, - "column": 3 - } - }, - { - "id": "settings.service.form.proxy.user", - "defaultMessage": "!!!User", - "file": "src/containers/settings/EditServiceScreen.js", - "start": { - "line": 80, - "column": 13 - }, - "end": { - "line": 83, - "column": 3 - } - }, - { - "id": "settings.service.form.proxy.password", - "defaultMessage": "!!!Password", - "file": "src/containers/settings/EditServiceScreen.js", - "start": { - "line": 84, - "column": 17 - }, - "end": { - "line": 87, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json deleted file mode 100644 index d3b413540..000000000 --- a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json +++ /dev/null @@ -1,158 +0,0 @@ -[ - { - "id": "settings.app.form.autoLaunchOnStart", - "defaultMessage": "!!!Launch Franz on start", - "file": "src/containers/settings/EditSettingsScreen.js", - "start": { - "line": 22, - "column": 21 - }, - "end": { - "line": 25, - "column": 3 - } - }, - { - "id": "settings.app.form.autoLaunchInBackground", - "defaultMessage": "!!!Open in background", - "file": "src/containers/settings/EditSettingsScreen.js", - "start": { - "line": 26, - "column": 26 - }, - "end": { - "line": 29, - "column": 3 - } - }, - { - "id": "settings.app.form.runInBackground", - "defaultMessage": "!!!Keep Franz in background when closing the window", - "file": "src/containers/settings/EditSettingsScreen.js", - "start": { - "line": 30, - "column": 19 - }, - "end": { - "line": 33, - "column": 3 - } - }, - { - "id": "settings.app.form.enableSystemTray", - "defaultMessage": "!!!Show Franz in system tray", - "file": "src/containers/settings/EditSettingsScreen.js", - "start": { - "line": 34, - "column": 20 - }, - "end": { - "line": 37, - "column": 3 - } - }, - { - "id": "settings.app.form.minimizeToSystemTray", - "defaultMessage": "!!!Minimize Franz to system tray", - "file": "src/containers/settings/EditSettingsScreen.js", - "start": { - "line": 38, - "column": 24 - }, - "end": { - "line": 41, - "column": 3 - } - }, - { - "id": "settings.app.form.language", - "defaultMessage": "!!!Language", - "file": "src/containers/settings/EditSettingsScreen.js", - "start": { - "line": 42, - "column": 12 - }, - "end": { - "line": 45, - "column": 3 - } - }, - { - "id": "settings.app.form.darkMode", - "defaultMessage": "!!!Dark Mode", - "file": "src/containers/settings/EditSettingsScreen.js", - "start": { - "line": 46, - "column": 12 - }, - "end": { - "line": 49, - "column": 3 - } - }, - { - "id": "settings.app.form.showDisabledServices", - "defaultMessage": "!!!Display disabled services tabs", - "file": "src/containers/settings/EditSettingsScreen.js", - "start": { - "line": 50, - "column": 24 - }, - "end": { - "line": 53, - "column": 3 - } - }, - { - "id": "settings.app.form.showMessagesBadgesWhenMuted", - "defaultMessage": "!!!Show unread message badge when notifications are disabled", - "file": "src/containers/settings/EditSettingsScreen.js", - "start": { - "line": 54, - "column": 29 - }, - "end": { - "line": 57, - "column": 3 - } - }, - { - "id": "settings.app.form.enableSpellchecking", - "defaultMessage": "!!!Enable spell checking", - "file": "src/containers/settings/EditSettingsScreen.js", - "start": { - "line": 58, - "column": 23 - }, - "end": { - "line": 61, - "column": 3 - } - }, - { - "id": "settings.app.form.enableGPUAcceleration", - "defaultMessage": "!!!Enable GPU Acceleration", - "file": "src/containers/settings/EditSettingsScreen.js", - "start": { - "line": 62, - "column": 25 - }, - "end": { - "line": 65, - "column": 3 - } - }, - { - "id": "settings.app.form.beta", - "defaultMessage": "!!!Include beta versions", - "file": "src/containers/settings/EditSettingsScreen.js", - "start": { - "line": 66, - "column": 8 - }, - "end": { - "line": 69, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/containers/settings/EditUserScreen.json b/src/i18n/messages/src/containers/settings/EditUserScreen.json deleted file mode 100644 index 70ff29945..000000000 --- a/src/i18n/messages/src/containers/settings/EditUserScreen.json +++ /dev/null @@ -1,119 +0,0 @@ -[ - { - "id": "settings.user.form.firstname", - "defaultMessage": "!!!Firstname", - "file": "src/containers/settings/EditUserScreen.js", - "start": { - "line": 14, - "column": 13 - }, - "end": { - "line": 17, - "column": 3 - } - }, - { - "id": "settings.user.form.lastname", - "defaultMessage": "!!!Lastname", - "file": "src/containers/settings/EditUserScreen.js", - "start": { - "line": 18, - "column": 12 - }, - "end": { - "line": 21, - "column": 3 - } - }, - { - "id": "settings.user.form.email", - "defaultMessage": "!!!Email", - "file": "src/containers/settings/EditUserScreen.js", - "start": { - "line": 22, - "column": 9 - }, - "end": { - "line": 25, - "column": 3 - } - }, - { - "id": "settings.user.form.accountType.label", - "defaultMessage": "!!!Account type", - "file": "src/containers/settings/EditUserScreen.js", - "start": { - "line": 26, - "column": 20 - }, - "end": { - "line": 29, - "column": 3 - } - }, - { - "id": "settings.user.form.accountType.individual", - "defaultMessage": "!!!Individual", - "file": "src/containers/settings/EditUserScreen.js", - "start": { - "line": 30, - "column": 25 - }, - "end": { - "line": 33, - "column": 3 - } - }, - { - "id": "settings.user.form.accountType.non-profit", - "defaultMessage": "!!!Non-Profit", - "file": "src/containers/settings/EditUserScreen.js", - "start": { - "line": 34, - "column": 24 - }, - "end": { - "line": 37, - "column": 3 - } - }, - { - "id": "settings.user.form.accountType.company", - "defaultMessage": "!!!Company", - "file": "src/containers/settings/EditUserScreen.js", - "start": { - "line": 38, - "column": 22 - }, - "end": { - "line": 41, - "column": 3 - } - }, - { - "id": "settings.user.form.currentPassword", - "defaultMessage": "!!!Current password", - "file": "src/containers/settings/EditUserScreen.js", - "start": { - "line": 42, - "column": 19 - }, - "end": { - "line": 45, - "column": 3 - } - }, - { - "id": "settings.user.form.newPassword", - "defaultMessage": "!!!New password", - "file": "src/containers/settings/EditUserScreen.js", - "start": { - "line": 46, - "column": 15 - }, - "end": { - "line": 49, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/features/announcements/Component.json b/src/i18n/messages/src/features/announcements/Component.json deleted file mode 100644 index c31c35fc7..000000000 --- a/src/i18n/messages/src/features/announcements/Component.json +++ /dev/null @@ -1,15 +0,0 @@ -[ - { - "id": "feature.announcements.changelog.headline", - "defaultMessage": "!!!What's new in Franz {version}?", - "file": "src/features/announcements/Component.js", - "start": { - "line": 11, - "column": 12 - }, - "end": { - "line": 14, - "column": 3 - } - } -] diff --git a/src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json b/src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json deleted file mode 100644 index eb1b66916..000000000 --- a/src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json +++ /dev/null @@ -1,15 +0,0 @@ -[ - { - "id": "feature.announcements.changelog.headline", - "defaultMessage": "!!!Changes in Franz {version}", - "file": "src/features/announcements/components/AnnouncementScreen.js", - "start": { - "line": 20, - "column": 12 - }, - "end": { - "line": 23, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/features/delayApp/Component.json b/src/i18n/messages/src/features/delayApp/Component.json deleted file mode 100644 index bacd9444a..000000000 --- a/src/i18n/messages/src/features/delayApp/Component.json +++ /dev/null @@ -1,41 +0,0 @@ -[ - { - "id": "feature.delayApp.headline", - "defaultMessage": "!!!Please purchase license to skip waiting", - "file": "src/features/delayApp/Component.js", - "start": { - "line": 15, - "column": 12 - }, - "end": { - "line": 18, - "column": 3 - } - }, - { - "id": "feature.delayApp.action", - "defaultMessage": "!!!Get a Franz Supporter License", - "file": "src/features/delayApp/Component.js", - "start": { - "line": 19, - "column": 10 - }, - "end": { - "line": 22, - "column": 3 - } - }, - { - "id": "feature.delayApp.text", - "defaultMessage": "!!!Franz will continue in {seconds} seconds.", - "file": "src/features/delayApp/Component.js", - "start": { - "line": 23, - "column": 8 - }, - "end": { - "line": 26, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/features/shareFranz/Component.json b/src/i18n/messages/src/features/shareFranz/Component.json deleted file mode 100644 index 34a43d5a0..000000000 --- a/src/i18n/messages/src/features/shareFranz/Component.json +++ /dev/null @@ -1,93 +0,0 @@ -[ - { - "id": "feature.shareFranz.headline", - "defaultMessage": "!!!Franz is better together!", - "file": "src/features/shareFranz/Component.js", - "start": { - "line": 15, - "column": 12 - }, - "end": { - "line": 18, - "column": 3 - } - }, - { - "id": "feature.shareFranz.text", - "defaultMessage": "!!!Tell your friends and colleagues how awesome Franz is and help us to spread the word.", - "file": "src/features/shareFranz/Component.js", - "start": { - "line": 19, - "column": 8 - }, - "end": { - "line": 22, - "column": 3 - } - }, - { - "id": "feature.shareFranz.action.email", - "defaultMessage": "!!!Share as email", - "file": "src/features/shareFranz/Component.js", - "start": { - "line": 23, - "column": 16 - }, - "end": { - "line": 26, - "column": 3 - } - }, - { - "id": "feature.shareFranz.action.facebook", - "defaultMessage": "!!!Share on Facebook", - "file": "src/features/shareFranz/Component.js", - "start": { - "line": 27, - "column": 19 - }, - "end": { - "line": 30, - "column": 3 - } - }, - { - "id": "feature.shareFranz.action.twitter", - "defaultMessage": "!!!Share on Twitter", - "file": "src/features/shareFranz/Component.js", - "start": { - "line": 31, - "column": 18 - }, - "end": { - "line": 34, - "column": 3 - } - }, - { - "id": "feature.shareFranz.shareText.email", - "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com", - "file": "src/features/shareFranz/Component.js", - "start": { - "line": 35, - "column": 18 - }, - "end": { - "line": 38, - "column": 3 - } - }, - { - "id": "feature.shareFranz.shareText.twitter", - "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger", - "file": "src/features/shareFranz/Component.js", - "start": { - "line": 39, - "column": 20 - }, - "end": { - "line": 42, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/features/workspaces/components/CreateWorkspaceForm.json b/src/i18n/messages/src/features/workspaces/components/CreateWorkspaceForm.json deleted file mode 100644 index f62bac42c..000000000 --- a/src/i18n/messages/src/features/workspaces/components/CreateWorkspaceForm.json +++ /dev/null @@ -1,28 +0,0 @@ -[ - { - "id": "settings.workspace.add.form.submitButton", - "defaultMessage": "!!!Create workspace", - "file": "src/features/workspaces/components/CreateWorkspaceForm.js", - "start": { - "line": 13, - "column": 16 - }, - "end": { - "line": 16, - "column": 3 - } - }, - { - "id": "settings.workspace.add.form.name", - "defaultMessage": "!!!Name", - "file": "src/features/workspaces/components/CreateWorkspaceForm.js", - "start": { - "line": 17, - "column": 8 - }, - "end": { - "line": 20, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json b/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json deleted file mode 100644 index 7b0c3e1ce..000000000 --- a/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json +++ /dev/null @@ -1,67 +0,0 @@ -[ - { - "id": "settings.workspace.form.buttonDelete", - "defaultMessage": "!!!Delete workspace", - "file": "src/features/workspaces/components/EditWorkspaceForm.js", - "start": { - "line": 19, - "column": 16 - }, - "end": { - "line": 22, - "column": 3 - } - }, - { - "id": "settings.workspace.form.buttonSave", - "defaultMessage": "!!!Save workspace", - "file": "src/features/workspaces/components/EditWorkspaceForm.js", - "start": { - "line": 23, - "column": 14 - }, - "end": { - "line": 26, - "column": 3 - } - }, - { - "id": "settings.workspace.form.name", - "defaultMessage": "!!!Name", - "file": "src/features/workspaces/components/EditWorkspaceForm.js", - "start": { - "line": 27, - "column": 8 - }, - "end": { - "line": 30, - "column": 3 - } - }, - { - "id": "settings.workspace.form.yourWorkspaces", - "defaultMessage": "!!!Your workspaces", - "file": "src/features/workspaces/components/EditWorkspaceForm.js", - "start": { - "line": 31, - "column": 18 - }, - "end": { - "line": 34, - "column": 3 - } - }, - { - "id": "settings.workspace.form.servicesInWorkspaceHeadline", - "defaultMessage": "!!!Services in this Workspace", - "file": "src/features/workspaces/components/EditWorkspaceForm.js", - "start": { - "line": 35, - "column": 31 - }, - "end": { - "line": 38, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json deleted file mode 100644 index 9f0935620..000000000 --- a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json +++ /dev/null @@ -1,106 +0,0 @@ -[ - { - "id": "workspaceDrawer.headline", - "defaultMessage": "!!!Workspaces", - "file": "src/features/workspaces/components/WorkspaceDrawer.js", - "start": { - "line": 16, - "column": 12 - }, - "end": { - "line": 19, - "column": 3 - } - }, - { - "id": "workspaceDrawer.allServices", - "defaultMessage": "!!!All services", - "file": "src/features/workspaces/components/WorkspaceDrawer.js", - "start": { - "line": 20, - "column": 15 - }, - "end": { - "line": 23, - "column": 3 - } - }, - { - "id": "workspaceDrawer.workspacesSettingsTooltip", - "defaultMessage": "!!!Workspaces settings", - "file": "src/features/workspaces/components/WorkspaceDrawer.js", - "start": { - "line": 24, - "column": 29 - }, - "end": { - "line": 27, - "column": 3 - } - }, - { - "id": "workspaceDrawer.workspaceFeatureInfo", - "defaultMessage": "!!!Info about workspace feature", - "file": "src/features/workspaces/components/WorkspaceDrawer.js", - "start": { - "line": 28, - "column": 24 - }, - "end": { - "line": 31, - "column": 3 - } - }, - { - "id": "workspaceDrawer.premiumCtaButtonLabel", - "defaultMessage": "!!!Create your first workspace", - "file": "src/features/workspaces/components/WorkspaceDrawer.js", - "start": { - "line": 32, - "column": 25 - }, - "end": { - "line": 35, - "column": 3 - } - }, - { - "id": "workspaceDrawer.reactivatePremiumAccountLabel", - "defaultMessage": "!!!Reactivate premium account", - "file": "src/features/workspaces/components/WorkspaceDrawer.js", - "start": { - "line": 36, - "column": 28 - }, - "end": { - "line": 39, - "column": 3 - } - }, - { - "id": "workspaceDrawer.addNewWorkspaceLabel", - "defaultMessage": "!!!add new workspace", - "file": "src/features/workspaces/components/WorkspaceDrawer.js", - "start": { - "line": 40, - "column": 24 - }, - "end": { - "line": 43, - "column": 3 - } - }, - { - "id": "workspaceDrawer.proFeatureBadge", - "defaultMessage": "!!!Premium feature", - "file": "src/features/workspaces/components/WorkspaceDrawer.js", - "start": { - "line": 44, - "column": 23 - }, - "end": { - "line": 47, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawerItem.json b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawerItem.json deleted file mode 100644 index 4ff190606..000000000 --- a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawerItem.json +++ /dev/null @@ -1,28 +0,0 @@ -[ - { - "id": "workspaceDrawer.item.noServicesAddedYet", - "defaultMessage": "!!!No services added yet", - "file": "src/features/workspaces/components/WorkspaceDrawerItem.js", - "start": { - "line": 12, - "column": 22 - }, - "end": { - "line": 15, - "column": 3 - } - }, - { - "id": "workspaceDrawer.item.contextMenuEdit", - "defaultMessage": "!!!edit", - "file": "src/features/workspaces/components/WorkspaceDrawerItem.js", - "start": { - "line": 16, - "column": 19 - }, - "end": { - "line": 19, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspaceSwitchingIndicator.json b/src/i18n/messages/src/features/workspaces/components/WorkspaceSwitchingIndicator.json deleted file mode 100644 index 4f3e6d55c..000000000 --- a/src/i18n/messages/src/features/workspaces/components/WorkspaceSwitchingIndicator.json +++ /dev/null @@ -1,15 +0,0 @@ -[ - { - "id": "workspaces.switchingIndicator.switchingTo", - "defaultMessage": "!!!Switching to", - "file": "src/features/workspaces/components/WorkspaceSwitchingIndicator.js", - "start": { - "line": 12, - "column": 15 - }, - "end": { - "line": 15, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json deleted file mode 100644 index ef8f1bebc..000000000 --- a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json +++ /dev/null @@ -1,106 +0,0 @@ -[ - { - "id": "settings.workspaces.headline", - "defaultMessage": "!!!Your workspaces", - "file": "src/features/workspaces/components/WorkspacesDashboard.js", - "start": { - "line": 17, - "column": 12 - }, - "end": { - "line": 20, - "column": 3 - } - }, - { - "id": "settings.workspaces.noWorkspacesAdded", - "defaultMessage": "!!!You haven't added any workspaces yet.", - "file": "src/features/workspaces/components/WorkspacesDashboard.js", - "start": { - "line": 21, - "column": 19 - }, - "end": { - "line": 24, - "column": 3 - } - }, - { - "id": "settings.workspaces.workspacesRequestFailed", - "defaultMessage": "!!!Could not load your workspaces", - "file": "src/features/workspaces/components/WorkspacesDashboard.js", - "start": { - "line": 25, - "column": 27 - }, - "end": { - "line": 28, - "column": 3 - } - }, - { - "id": "settings.workspaces.tryReloadWorkspaces", - "defaultMessage": "!!!Try again", - "file": "src/features/workspaces/components/WorkspacesDashboard.js", - "start": { - "line": 29, - "column": 23 - }, - "end": { - "line": 32, - "column": 3 - } - }, - { - "id": "settings.workspaces.updatedInfo", - "defaultMessage": "!!!Your changes have been saved", - "file": "src/features/workspaces/components/WorkspacesDashboard.js", - "start": { - "line": 33, - "column": 15 - }, - "end": { - "line": 36, - "column": 3 - } - }, - { - "id": "settings.workspaces.deletedInfo", - "defaultMessage": "!!!Workspace has been deleted", - "file": "src/features/workspaces/components/WorkspacesDashboard.js", - "start": { - "line": 37, - "column": 15 - }, - "end": { - "line": 40, - "column": 3 - } - }, - { - "id": "settings.workspaces.workspaceFeatureInfo", - "defaultMessage": "!!!Info about workspace feature", - "file": "src/features/workspaces/components/WorkspacesDashboard.js", - "start": { - "line": 41, - "column": 24 - }, - "end": { - "line": 44, - "column": 3 - } - }, - { - "id": "settings.workspaces.workspaceFeatureHeadline", - "defaultMessage": "!!!Less is More: Introducing Franz Workspaces", - "file": "src/features/workspaces/components/WorkspacesDashboard.js", - "start": { - "line": 45, - "column": 28 - }, - "end": { - "line": 48, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/helpers/validation-helpers.json b/src/i18n/messages/src/helpers/validation-helpers.json deleted file mode 100644 index 86bfe1500..000000000 --- a/src/i18n/messages/src/helpers/validation-helpers.json +++ /dev/null @@ -1,67 +0,0 @@ -[ - { - "id": "validation.required", - "defaultMessage": "!!!Field is required", - "file": "src/helpers/validation-helpers.js", - "start": { - "line": 4, - "column": 12 - }, - "end": { - "line": 7, - "column": 3 - } - }, - { - "id": "validation.email", - "defaultMessage": "!!!Email not valid", - "file": "src/helpers/validation-helpers.js", - "start": { - "line": 8, - "column": 9 - }, - "end": { - "line": 11, - "column": 3 - } - }, - { - "id": "validation.url", - "defaultMessage": "!!!Not a valid URL", - "file": "src/helpers/validation-helpers.js", - "start": { - "line": 12, - "column": 7 - }, - "end": { - "line": 15, - "column": 3 - } - }, - { - "id": "validation.minLength", - "defaultMessage": "!!!Too few characters", - "file": "src/helpers/validation-helpers.js", - "start": { - "line": 16, - "column": 13 - }, - "end": { - "line": 19, - "column": 3 - } - }, - { - "id": "validation.oneRequired", - "defaultMessage": "!!!At least one is required", - "file": "src/helpers/validation-helpers.js", - "start": { - "line": 20, - "column": 15 - }, - "end": { - "line": 23, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/i18n/globalMessages.json b/src/i18n/messages/src/i18n/globalMessages.json deleted file mode 100644 index 28001614f..000000000 --- a/src/i18n/messages/src/i18n/globalMessages.json +++ /dev/null @@ -1,80 +0,0 @@ -[ - { - "id": "global.api.unhealthy", - "defaultMessage": "!!!Can't connect to Franz Online Services", - "file": "src/i18n/globalMessages.js", - "start": { - "line": 4, - "column": 16 - }, - "end": { - "line": 7, - "column": 3 - } - }, - { - "id": "global.notConnectedToTheInternet", - "defaultMessage": "!!!You are not connected to the internet.", - "file": "src/i18n/globalMessages.js", - "start": { - "line": 8, - "column": 29 - }, - "end": { - "line": 11, - "column": 3 - } - }, - { - "id": "global.spellchecking.language", - "defaultMessage": "!!!Spell checking language", - "file": "src/i18n/globalMessages.js", - "start": { - "line": 12, - "column": 24 - }, - "end": { - "line": 15, - "column": 3 - } - }, - { - "id": "global.spellchecker.useDefault", - "defaultMessage": "!!!Use System Default ({default})", - "file": "src/i18n/globalMessages.js", - "start": { - "line": 16, - "column": 29 - }, - "end": { - "line": 19, - "column": 3 - } - }, - { - "id": "global.spellchecking.autodetect", - "defaultMessage": "!!!Detect language automatically", - "file": "src/i18n/globalMessages.js", - "start": { - "line": 20, - "column": 34 - }, - "end": { - "line": 23, - "column": 3 - } - }, - { - "id": "global.spellchecking.autodetect.short", - "defaultMessage": "!!!Automatic", - "file": "src/i18n/globalMessages.js", - "start": { - "line": 24, - "column": 39 - }, - "end": { - "line": 27, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/i18n/messages/src/lib/Menu.json b/src/i18n/messages/src/lib/Menu.json deleted file mode 100644 index a2ce34cd4..000000000 --- a/src/i18n/messages/src/lib/Menu.json +++ /dev/null @@ -1,691 +0,0 @@ -[ - { - "id": "menu.edit", - "defaultMessage": "!!!Edit", - "file": "src/lib/Menu.js", - "start": { - "line": 14, - "column": 8 - }, - "end": { - "line": 17, - "column": 3 - } - }, - { - "id": "menu.edit.undo", - "defaultMessage": "!!!Undo", - "file": "src/lib/Menu.js", - "start": { - "line": 18, - "column": 8 - }, - "end": { - "line": 21, - "column": 3 - } - }, - { - "id": "menu.edit.redo", - "defaultMessage": "!!!Redo", - "file": "src/lib/Menu.js", - "start": { - "line": 22, - "column": 8 - }, - "end": { - "line": 25, - "column": 3 - } - }, - { - "id": "menu.edit.cut", - "defaultMessage": "!!!Cut", - "file": "src/lib/Menu.js", - "start": { - "line": 26, - "column": 7 - }, - "end": { - "line": 29, - "column": 3 - } - }, - { - "id": "menu.edit.copy", - "defaultMessage": "!!!Copy", - "file": "src/lib/Menu.js", - "start": { - "line": 30, - "column": 8 - }, - "end": { - "line": 33, - "column": 3 - } - }, - { - "id": "menu.edit.paste", - "defaultMessage": "!!!Paste", - "file": "src/lib/Menu.js", - "start": { - "line": 34, - "column": 9 - }, - "end": { - "line": 37, - "column": 3 - } - }, - { - "id": "menu.edit.pasteAndMatchStyle", - "defaultMessage": "!!!Paste And Match Style", - "file": "src/lib/Menu.js", - "start": { - "line": 38, - "column": 22 - }, - "end": { - "line": 41, - "column": 3 - } - }, - { - "id": "menu.edit.delete", - "defaultMessage": "!!!Delete", - "file": "src/lib/Menu.js", - "start": { - "line": 42, - "column": 10 - }, - "end": { - "line": 45, - "column": 3 - } - }, - { - "id": "menu.edit.selectAll", - "defaultMessage": "!!!Select All", - "file": "src/lib/Menu.js", - "start": { - "line": 46, - "column": 13 - }, - "end": { - "line": 49, - "column": 3 - } - }, - { - "id": "menu.edit.speech", - "defaultMessage": "!!!Speech", - "file": "src/lib/Menu.js", - "start": { - "line": 50, - "column": 10 - }, - "end": { - "line": 53, - "column": 3 - } - }, - { - "id": "menu.edit.startSpeaking", - "defaultMessage": "!!!Start Speaking", - "file": "src/lib/Menu.js", - "start": { - "line": 54, - "column": 17 - }, - "end": { - "line": 57, - "column": 3 - } - }, - { - "id": "menu.edit.stopSpeaking", - "defaultMessage": "!!!Stop Speaking", - "file": "src/lib/Menu.js", - "start": { - "line": 58, - "column": 16 - }, - "end": { - "line": 61, - "column": 3 - } - }, - { - "id": "menu.edit.startDictation", - "defaultMessage": "!!!Start Dictation", - "file": "src/lib/Menu.js", - "start": { - "line": 62, - "column": 18 - }, - "end": { - "line": 65, - "column": 3 - } - }, - { - "id": "menu.edit.emojiSymbols", - "defaultMessage": "!!!Emoji & Symbols", - "file": "src/lib/Menu.js", - "start": { - "line": 66, - "column": 16 - }, - "end": { - "line": 69, - "column": 3 - } - }, - { - "id": "menu.view.resetZoom", - "defaultMessage": "!!!Actual Size", - "file": "src/lib/Menu.js", - "start": { - "line": 70, - "column": 13 - }, - "end": { - "line": 73, - "column": 3 - } - }, - { - "id": "menu.view.zoomIn", - "defaultMessage": "!!!Zoom In", - "file": "src/lib/Menu.js", - "start": { - "line": 74, - "column": 10 - }, - "end": { - "line": 77, - "column": 3 - } - }, - { - "id": "menu.view.zoomOut", - "defaultMessage": "!!!Zoom Out", - "file": "src/lib/Menu.js", - "start": { - "line": 78, - "column": 11 - }, - "end": { - "line": 81, - "column": 3 - } - }, - { - "id": "menu.view.enterFullScreen", - "defaultMessage": "!!!Enter Full Screen", - "file": "src/lib/Menu.js", - "start": { - "line": 82, - "column": 19 - }, - "end": { - "line": 85, - "column": 3 - } - }, - { - "id": "menu.view.exitFullScreen", - "defaultMessage": "!!!Exit Full Screen", - "file": "src/lib/Menu.js", - "start": { - "line": 86, - "column": 18 - }, - "end": { - "line": 89, - "column": 3 - } - }, - { - "id": "menu.view.toggleFullScreen", - "defaultMessage": "!!!Toggle Full Screen", - "file": "src/lib/Menu.js", - "start": { - "line": 90, - "column": 20 - }, - "end": { - "line": 93, - "column": 3 - } - }, - { - "id": "menu.view.toggleDevTools", - "defaultMessage": "!!!Toggle Developer Tools", - "file": "src/lib/Menu.js", - "start": { - "line": 94, - "column": 18 - }, - "end": { - "line": 97, - "column": 3 - } - }, - { - "id": "menu.view.toggleServiceDevTools", - "defaultMessage": "!!!Toggle Service Developer Tools", - "file": "src/lib/Menu.js", - "start": { - "line": 98, - "column": 25 - }, - "end": { - "line": 101, - "column": 3 - } - }, - { - "id": "menu.view.reloadService", - "defaultMessage": "!!!Reload Service", - "file": "src/lib/Menu.js", - "start": { - "line": 102, - "column": 17 - }, - "end": { - "line": 105, - "column": 3 - } - }, - { - "id": "menu.view.reloadFranz", - "defaultMessage": "!!!Reload Franz", - "file": "src/lib/Menu.js", - "start": { - "line": 106, - "column": 15 - }, - "end": { - "line": 109, - "column": 3 - } - }, - { - "id": "menu.window.minimize", - "defaultMessage": "!!!Minimize", - "file": "src/lib/Menu.js", - "start": { - "line": 110, - "column": 12 - }, - "end": { - "line": 113, - "column": 3 - } - }, - { - "id": "menu.window.close", - "defaultMessage": "!!!Close", - "file": "src/lib/Menu.js", - "start": { - "line": 114, - "column": 9 - }, - "end": { - "line": 117, - "column": 3 - } - }, - { - "id": "menu.help.learnMore", - "defaultMessage": "!!!Learn More", - "file": "src/lib/Menu.js", - "start": { - "line": 118, - "column": 13 - }, - "end": { - "line": 121, - "column": 3 - } - }, - { - "id": "menu.help.changelog", - "defaultMessage": "!!!Changelog", - "file": "src/lib/Menu.js", - "start": { - "line": 122, - "column": 13 - }, - "end": { - "line": 125, - "column": 3 - } - }, - { - "id": "menu.help.support", - "defaultMessage": "!!!Support", - "file": "src/lib/Menu.js", - "start": { - "line": 126, - "column": 11 - }, - "end": { - "line": 129, - "column": 3 - } - }, - { - "id": "menu.help.tos", - "defaultMessage": "!!!Terms of Service", - "file": "src/lib/Menu.js", - "start": { - "line": 130, - "column": 7 - }, - "end": { - "line": 133, - "column": 3 - } - }, - { - "id": "menu.help.privacy", - "defaultMessage": "!!!Privacy Statement", - "file": "src/lib/Menu.js", - "start": { - "line": 134, - "column": 11 - }, - "end": { - "line": 137, - "column": 3 - } - }, - { - "id": "menu.file", - "defaultMessage": "!!!File", - "file": "src/lib/Menu.js", - "start": { - "line": 138, - "column": 8 - }, - "end": { - "line": 141, - "column": 3 - } - }, - { - "id": "menu.view", - "defaultMessage": "!!!View", - "file": "src/lib/Menu.js", - "start": { - "line": 142, - "column": 8 - }, - "end": { - "line": 145, - "column": 3 - } - }, - { - "id": "menu.services", - "defaultMessage": "!!!Services", - "file": "src/lib/Menu.js", - "start": { - "line": 146, - "column": 12 - }, - "end": { - "line": 149, - "column": 3 - } - }, - { - "id": "menu.window", - "defaultMessage": "!!!Window", - "file": "src/lib/Menu.js", - "start": { - "line": 150, - "column": 10 - }, - "end": { - "line": 153, - "column": 3 - } - }, - { - "id": "menu.help", - "defaultMessage": "!!!Help", - "file": "src/lib/Menu.js", - "start": { - "line": 154, - "column": 8 - }, - "end": { - "line": 157, - "column": 3 - } - }, - { - "id": "menu.app.about", - "defaultMessage": "!!!About Franz", - "file": "src/lib/Menu.js", - "start": { - "line": 158, - "column": 9 - }, - "end": { - "line": 161, - "column": 3 - } - }, - { - "id": "menu.app.announcement", - "defaultMessage": "!!!What's new?", - "file": "src/lib/Menu.js", - "start": { - "line": 162, - "column": 16 - }, - "end": { - "line": 165, - "column": 3 - } - }, - { - "id": "menu.app.settings", - "defaultMessage": "!!!Settings", - "file": "src/lib/Menu.js", - "start": { - "line": 166, - "column": 12 - }, - "end": { - "line": 169, - "column": 3 - } - }, - { - "id": "menu.app.hide", - "defaultMessage": "!!!Hide", - "file": "src/lib/Menu.js", - "start": { - "line": 170, - "column": 8 - }, - "end": { - "line": 173, - "column": 3 - } - }, - { - "id": "menu.app.hideOthers", - "defaultMessage": "!!!Hide Others", - "file": "src/lib/Menu.js", - "start": { - "line": 174, - "column": 14 - }, - "end": { - "line": 177, - "column": 3 - } - }, - { - "id": "menu.app.unhide", - "defaultMessage": "!!!Unhide", - "file": "src/lib/Menu.js", - "start": { - "line": 178, - "column": 10 - }, - "end": { - "line": 181, - "column": 3 - } - }, - { - "id": "menu.app.quit", - "defaultMessage": "!!!Quit", - "file": "src/lib/Menu.js", - "start": { - "line": 182, - "column": 8 - }, - "end": { - "line": 185, - "column": 3 - } - }, - { - "id": "menu.services.addNewService", - "defaultMessage": "!!!Add New Service...", - "file": "src/lib/Menu.js", - "start": { - "line": 186, - "column": 17 - }, - "end": { - "line": 189, - "column": 3 - } - }, - { - "id": "menu.workspaces.addNewWorkspace", - "defaultMessage": "!!!Add New Workspace...", - "file": "src/lib/Menu.js", - "start": { - "line": 190, - "column": 19 - }, - "end": { - "line": 193, - "column": 3 - } - }, - { - "id": "menu.workspaces.openWorkspaceDrawer", - "defaultMessage": "!!!Open workspace drawer", - "file": "src/lib/Menu.js", - "start": { - "line": 194, - "column": 23 - }, - "end": { - "line": 197, - "column": 3 - } - }, - { - "id": "menu.workspaces.closeWorkspaceDrawer", - "defaultMessage": "!!!Close workspace drawer", - "file": "src/lib/Menu.js", - "start": { - "line": 198, - "column": 24 - }, - "end": { - "line": 201, - "column": 3 - } - }, - { - "id": "menu.services.setNextServiceActive", - "defaultMessage": "!!!Activate next service...", - "file": "src/lib/Menu.js", - "start": { - "line": 202, - "column": 23 - }, - "end": { - "line": 205, - "column": 3 - } - }, - { - "id": "menu.services.activatePreviousService", - "defaultMessage": "!!!Activate previous service...", - "file": "src/lib/Menu.js", - "start": { - "line": 206, - "column": 27 - }, - "end": { - "line": 209, - "column": 3 - } - }, - { - "id": "sidebar.muteApp", - "defaultMessage": "!!!Disable notifications & audio", - "file": "src/lib/Menu.js", - "start": { - "line": 210, - "column": 11 - }, - "end": { - "line": 213, - "column": 3 - } - }, - { - "id": "sidebar.unmuteApp", - "defaultMessage": "!!!Enable notifications & audio", - "file": "src/lib/Menu.js", - "start": { - "line": 214, - "column": 13 - }, - "end": { - "line": 217, - "column": 3 - } - }, - { - "id": "menu.workspaces", - "defaultMessage": "!!!Workspaces", - "file": "src/lib/Menu.js", - "start": { - "line": 218, - "column": 14 - }, - "end": { - "line": 221, - "column": 3 - } - }, - { - "id": "menu.workspaces.defaultWorkspace", - "defaultMessage": "!!!Default", - "file": "src/lib/Menu.js", - "start": { - "line": 222, - "column": 20 - }, - "end": { - "line": 225, - "column": 3 - } - } -] \ No newline at end of file diff --git a/src/index.js b/src/index.js index 05c793d98..3fe996aa7 100644 --- a/src/index.js +++ b/src/index.js @@ -305,6 +305,20 @@ const createWindow = () => { }); }; +// Allow passing command line parameters/switches to electron +// https://electronjs.org/docs/api/chrome-command-line-switches +// used for Kerberos support +// Usage e.g. MACOS +// $ Franz.app/Contents/MacOS/Franz --auth-server-whitelist *.mydomain.com --auth-negotiate-delegate-whitelist *.mydomain.com +const argv = require('minimist')(process.argv.slice(1)); + +if (argv['auth-server-whitelist']) { + app.commandLine.appendSwitch('auth-server-whitelist', argv['auth-server-whitelist']); +} +if (argv['auth-negotiate-delegate-whitelist']) { + app.commandLine.appendSwitch('auth-negotiate-delegate-whitelist', argv['auth-negotiate-delegate-whitelist']); +} + // This method will be called when Electron has finished // initialization and is ready to create browser windows. // Some APIs can only be used after this event occurs. diff --git a/src/stores/UserStore.js b/src/stores/UserStore.js index 534690fbb..31555dd5c 100644 --- a/src/stores/UserStore.js +++ b/src/stores/UserStore.js @@ -178,6 +178,7 @@ export default class UserStore extends Store { password, accountType, company, + locale: this.stores.app.locale, }); this.hasCompletedSignup = false; diff --git a/src/stores/lib/Reaction.js b/src/stores/lib/Reaction.js index b123ec01c..f2642908f 100644 --- a/src/stores/lib/Reaction.js +++ b/src/stores/lib/Reaction.js @@ -1,4 +1,3 @@ -// @flow import { autorun } from 'mobx'; export default class Reaction { @@ -15,14 +14,18 @@ export default class Reaction { start() { if (!this.isRunning) { this.dispose = autorun(() => this.reaction()); - this.isRunning = true; + this.isActive = true; } } stop() { if (this.isRunning) { this.dispose(); - this.isRunning = true; + this.isActive = false; } } } + +export const createReactions = reactions => ( + reactions.map(r => new Reaction(r)) +); -- cgit v1.2.3-54-g00ecf From 2cbdda19fd93fdd48caa2faa501356979d9d03ae Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Fri, 12 Apr 2019 15:54:08 +0200 Subject: add i18n files --- src/i18n/locales/defaultMessages.json | 4468 ++++++++++++++++++++ src/i18n/messages/src/components/auth/Import.json | 54 + src/i18n/messages/src/components/auth/Invite.json | 93 + src/i18n/messages/src/components/auth/Login.json | 119 + .../messages/src/components/auth/Password.json | 93 + src/i18n/messages/src/components/auth/Pricing.json | 54 + src/i18n/messages/src/components/auth/Signup.json | 158 + src/i18n/messages/src/components/auth/Welcome.json | 28 + .../messages/src/components/layout/AppLayout.json | 80 + .../messages/src/components/layout/Sidebar.json | 80 + .../content/ErrorHandlers/WebviewErrorHandler.json | 67 + .../services/content/ServiceDisabled.json | 28 + .../src/components/services/content/Services.json | 28 + .../services/content/WebviewCrashHandler.json | 54 + .../src/components/services/tabs/TabItem.json | 119 + .../settings/account/AccountDashboard.json | 197 + .../settings/navigation/SettingsNavigation.json | 93 + .../settings/recipes/RecipesDashboard.json | 106 + .../settings/services/EditServiceForm.json | 288 ++ .../components/settings/services/ServiceError.json | 54 + .../components/settings/services/ServiceItem.json | 41 + .../settings/services/ServicesDashboard.json | 119 + .../settings/settings/EditSettingsForm.json | 236 ++ .../src/components/settings/user/EditUserForm.json | 80 + .../components/subscription/SubscriptionForm.json | 171 + .../components/subscription/SubscriptionPopup.json | 28 + .../ui/PremiumFeatureContainer/index.json | 15 + .../src/components/ui/WebviewLoader/index.json | 15 + .../src/components/util/ErrorBoundary/index.json | 28 + .../src/containers/settings/EditServiceScreen.json | 197 + .../containers/settings/EditSettingsScreen.json | 158 + .../src/containers/settings/EditUserScreen.json | 119 + .../components/AnnouncementScreen.json | 15 + .../messages/src/features/delayApp/Component.json | 41 + .../src/features/shareFranz/Component.json | 93 + .../workspaces/components/CreateWorkspaceForm.json | 28 + .../workspaces/components/EditWorkspaceForm.json | 67 + .../workspaces/components/WorkspaceDrawer.json | 106 + .../workspaces/components/WorkspaceDrawerItem.json | 28 + .../components/WorkspaceSwitchingIndicator.json | 15 + .../workspaces/components/WorkspacesDashboard.json | 106 + .../messages/src/helpers/validation-helpers.json | 67 + src/i18n/messages/src/i18n/globalMessages.json | 80 + src/i18n/messages/src/lib/Menu.json | 691 +++ 44 files changed, 8805 insertions(+) create mode 100644 src/i18n/locales/defaultMessages.json create mode 100644 src/i18n/messages/src/components/auth/Import.json create mode 100644 src/i18n/messages/src/components/auth/Invite.json create mode 100644 src/i18n/messages/src/components/auth/Login.json create mode 100644 src/i18n/messages/src/components/auth/Password.json create mode 100644 src/i18n/messages/src/components/auth/Pricing.json create mode 100644 src/i18n/messages/src/components/auth/Signup.json create mode 100644 src/i18n/messages/src/components/auth/Welcome.json create mode 100644 src/i18n/messages/src/components/layout/AppLayout.json create mode 100644 src/i18n/messages/src/components/layout/Sidebar.json create mode 100644 src/i18n/messages/src/components/services/content/ErrorHandlers/WebviewErrorHandler.json create mode 100644 src/i18n/messages/src/components/services/content/ServiceDisabled.json create mode 100644 src/i18n/messages/src/components/services/content/Services.json create mode 100644 src/i18n/messages/src/components/services/content/WebviewCrashHandler.json create mode 100644 src/i18n/messages/src/components/services/tabs/TabItem.json create mode 100644 src/i18n/messages/src/components/settings/account/AccountDashboard.json create mode 100644 src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json create mode 100644 src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json create mode 100644 src/i18n/messages/src/components/settings/services/EditServiceForm.json create mode 100644 src/i18n/messages/src/components/settings/services/ServiceError.json create mode 100644 src/i18n/messages/src/components/settings/services/ServiceItem.json create mode 100644 src/i18n/messages/src/components/settings/services/ServicesDashboard.json create mode 100644 src/i18n/messages/src/components/settings/settings/EditSettingsForm.json create mode 100644 src/i18n/messages/src/components/settings/user/EditUserForm.json create mode 100644 src/i18n/messages/src/components/subscription/SubscriptionForm.json create mode 100644 src/i18n/messages/src/components/subscription/SubscriptionPopup.json create mode 100644 src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json create mode 100644 src/i18n/messages/src/components/ui/WebviewLoader/index.json create mode 100644 src/i18n/messages/src/components/util/ErrorBoundary/index.json create mode 100644 src/i18n/messages/src/containers/settings/EditServiceScreen.json create mode 100644 src/i18n/messages/src/containers/settings/EditSettingsScreen.json create mode 100644 src/i18n/messages/src/containers/settings/EditUserScreen.json create mode 100644 src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json create mode 100644 src/i18n/messages/src/features/delayApp/Component.json create mode 100644 src/i18n/messages/src/features/shareFranz/Component.json create mode 100644 src/i18n/messages/src/features/workspaces/components/CreateWorkspaceForm.json create mode 100644 src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json create mode 100644 src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json create mode 100644 src/i18n/messages/src/features/workspaces/components/WorkspaceDrawerItem.json create mode 100644 src/i18n/messages/src/features/workspaces/components/WorkspaceSwitchingIndicator.json create mode 100644 src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json create mode 100644 src/i18n/messages/src/helpers/validation-helpers.json create mode 100644 src/i18n/messages/src/i18n/globalMessages.json create mode 100644 src/i18n/messages/src/lib/Menu.json diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json new file mode 100644 index 000000000..3323aa310 --- /dev/null +++ b/src/i18n/locales/defaultMessages.json @@ -0,0 +1,4468 @@ +[ + { + "descriptors": [ + { + "defaultMessage": "!!!Import your Franz 4 services", + "end": { + "column": 3, + "line": 16 + }, + "file": "src/components/auth/Import.js", + "id": "import.headline", + "start": { + "column": 12, + "line": 13 + } + }, + { + "defaultMessage": "!!!Services not yet supported in Franz 5", + "end": { + "column": 3, + "line": 20 + }, + "file": "src/components/auth/Import.js", + "id": "import.notSupportedHeadline", + "start": { + "column": 24, + "line": 17 + } + }, + { + "defaultMessage": "!!!Import {count} services", + "end": { + "column": 3, + "line": 24 + }, + "file": "src/components/auth/Import.js", + "id": "import.submit.label", + "start": { + "column": 21, + "line": 21 + } + }, + { + "defaultMessage": "!!!I want to add services manually", + "end": { + "column": 3, + "line": 28 + }, + "file": "src/components/auth/Import.js", + "id": "import.skip.label", + "start": { + "column": 19, + "line": 25 + } + } + ], + "path": "src/components/auth/Import.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Invite Friends", + "end": { + "column": 3, + "line": 19 + }, + "file": "src/components/auth/Invite.js", + "id": "settings.invite.headline", + "start": { + "column": 20, + "line": 16 + } + }, + { + "defaultMessage": "!!!Invite 3 of your friends or colleagues", + "end": { + "column": 3, + "line": 23 + }, + "file": "src/components/auth/Invite.js", + "id": "invite.headline.friends", + "start": { + "column": 12, + "line": 20 + } + }, + { + "defaultMessage": "!!!Name", + "end": { + "column": 3, + "line": 27 + }, + "file": "src/components/auth/Invite.js", + "id": "invite.name.label", + "start": { + "column": 13, + "line": 24 + } + }, + { + "defaultMessage": "!!!Email address", + "end": { + "column": 3, + "line": 31 + }, + "file": "src/components/auth/Invite.js", + "id": "invite.email.label", + "start": { + "column": 14, + "line": 28 + } + }, + { + "defaultMessage": "!!!Send invites", + "end": { + "column": 3, + "line": 35 + }, + "file": "src/components/auth/Invite.js", + "id": "invite.submit.label", + "start": { + "column": 21, + "line": 32 + } + }, + { + "defaultMessage": "!!!I want to do this later", + "end": { + "column": 3, + "line": 39 + }, + "file": "src/components/auth/Invite.js", + "id": "invite.skip.label", + "start": { + "column": 19, + "line": 36 + } + }, + { + "defaultMessage": "!!!Invitations sent successfully", + "end": { + "column": 3, + "line": 43 + }, + "file": "src/components/auth/Invite.js", + "id": "invite.successInfo", + "start": { + "column": 21, + "line": 40 + } + } + ], + "path": "src/components/auth/Invite.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Sign in", + "end": { + "column": 3, + "line": 20 + }, + "file": "src/components/auth/Login.js", + "id": "login.headline", + "start": { + "column": 12, + "line": 17 + } + }, + { + "defaultMessage": "!!!Email address", + "end": { + "column": 3, + "line": 24 + }, + "file": "src/components/auth/Login.js", + "id": "login.email.label", + "start": { + "column": 14, + "line": 21 + } + }, + { + "defaultMessage": "!!!Password", + "end": { + "column": 3, + "line": 28 + }, + "file": "src/components/auth/Login.js", + "id": "login.password.label", + "start": { + "column": 17, + "line": 25 + } + }, + { + "defaultMessage": "!!!Sign in", + "end": { + "column": 3, + "line": 32 + }, + "file": "src/components/auth/Login.js", + "id": "login.submit.label", + "start": { + "column": 21, + "line": 29 + } + }, + { + "defaultMessage": "!!!Email or password not valid", + "end": { + "column": 3, + "line": 36 + }, + "file": "src/components/auth/Login.js", + "id": "login.invalidCredentials", + "start": { + "column": 22, + "line": 33 + } + }, + { + "defaultMessage": "!!!Your session expired, please login again.", + "end": { + "column": 3, + "line": 40 + }, + "file": "src/components/auth/Login.js", + "id": "login.tokenExpired", + "start": { + "column": 16, + "line": 37 + } + }, + { + "defaultMessage": "!!!Your session expired, please login again.", + "end": { + "column": 3, + "line": 44 + }, + "file": "src/components/auth/Login.js", + "id": "login.serverLogout", + "start": { + "column": 16, + "line": 41 + } + }, + { + "defaultMessage": "!!!Create a free account", + "end": { + "column": 3, + "line": 48 + }, + "file": "src/components/auth/Login.js", + "id": "login.link.signup", + "start": { + "column": 14, + "line": 45 + } + }, + { + "defaultMessage": "!!!Forgot password", + "end": { + "column": 3, + "line": 52 + }, + "file": "src/components/auth/Login.js", + "id": "login.link.password", + "start": { + "column": 16, + "line": 49 + } + } + ], + "path": "src/components/auth/Login.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Forgot password", + "end": { + "column": 3, + "line": 17 + }, + "file": "src/components/auth/Password.js", + "id": "password.headline", + "start": { + "column": 12, + "line": 14 + } + }, + { + "defaultMessage": "!!!Email address", + "end": { + "column": 3, + "line": 21 + }, + "file": "src/components/auth/Password.js", + "id": "password.email.label", + "start": { + "column": 14, + "line": 18 + } + }, + { + "defaultMessage": "!!!Submit", + "end": { + "column": 3, + "line": 25 + }, + "file": "src/components/auth/Password.js", + "id": "password.submit.label", + "start": { + "column": 21, + "line": 22 + } + }, + { + "defaultMessage": "!!!Your new password was sent to your email address", + "end": { + "column": 3, + "line": 29 + }, + "file": "src/components/auth/Password.js", + "id": "password.successInfo", + "start": { + "column": 15, + "line": 26 + } + }, + { + "defaultMessage": "!!!No user affiliated with that email address", + "end": { + "column": 3, + "line": 33 + }, + "file": "src/components/auth/Password.js", + "id": "password.noUser", + "start": { + "column": 10, + "line": 30 + } + }, + { + "defaultMessage": "!!!Create a free account", + "end": { + "column": 3, + "line": 37 + }, + "file": "src/components/auth/Password.js", + "id": "password.link.signup", + "start": { + "column": 14, + "line": 34 + } + }, + { + "defaultMessage": "!!!Sign in to your account", + "end": { + "column": 3, + "line": 41 + }, + "file": "src/components/auth/Password.js", + "id": "password.link.login", + "start": { + "column": 13, + "line": 38 + } + } + ], + "path": "src/components/auth/Password.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Support Franz", + "end": { + "column": 3, + "line": 16 + }, + "file": "src/components/auth/Pricing.js", + "id": "pricing.headline", + "start": { + "column": 12, + "line": 13 + } + }, + { + "defaultMessage": "!!!Select your support plan", + "end": { + "column": 3, + "line": 20 + }, + "file": "src/components/auth/Pricing.js", + "id": "pricing.support.label", + "start": { + "column": 23, + "line": 17 + } + }, + { + "defaultMessage": "!!!Support the development of Franz", + "end": { + "column": 3, + "line": 24 + }, + "file": "src/components/auth/Pricing.js", + "id": "pricing.submit.label", + "start": { + "column": 21, + "line": 21 + } + }, + { + "defaultMessage": "!!!I don't want to support the development of Franz.", + "end": { + "column": 3, + "line": 28 + }, + "file": "src/components/auth/Pricing.js", + "id": "pricing.link.skipPayment", + "start": { + "column": 15, + "line": 25 + } + } + ], + "path": "src/components/auth/Pricing.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Sign up", + "end": { + "column": 3, + "line": 21 + }, + "file": "src/components/auth/Signup.js", + "id": "signup.headline", + "start": { + "column": 12, + "line": 18 + } + }, + { + "defaultMessage": "!!!Firstname", + "end": { + "column": 3, + "line": 25 + }, + "file": "src/components/auth/Signup.js", + "id": "signup.firstname.label", + "start": { + "column": 18, + "line": 22 + } + }, + { + "defaultMessage": "!!!Lastname", + "end": { + "column": 3, + "line": 29 + }, + "file": "src/components/auth/Signup.js", + "id": "signup.lastname.label", + "start": { + "column": 17, + "line": 26 + } + }, + { + "defaultMessage": "!!!Email address", + "end": { + "column": 3, + "line": 33 + }, + "file": "src/components/auth/Signup.js", + "id": "signup.email.label", + "start": { + "column": 14, + "line": 30 + } + }, + { + "defaultMessage": "!!!Company", + "end": { + "column": 3, + "line": 37 + }, + "file": "src/components/auth/Signup.js", + "id": "signup.company.label", + "start": { + "column": 16, + "line": 34 + } + }, + { + "defaultMessage": "!!!Password", + "end": { + "column": 3, + "line": 41 + }, + "file": "src/components/auth/Signup.js", + "id": "signup.password.label", + "start": { + "column": 17, + "line": 38 + } + }, + { + "defaultMessage": "!!!By creating a Franz account you accept the", + "end": { + "column": 3, + "line": 45 + }, + "file": "src/components/auth/Signup.js", + "id": "signup.legal.info", + "start": { + "column": 13, + "line": 42 + } + }, + { + "defaultMessage": "!!!Terms of service", + "end": { + "column": 3, + "line": 49 + }, + "file": "src/components/auth/Signup.js", + "id": "signup.legal.terms", + "start": { + "column": 9, + "line": 46 + } + }, + { + "defaultMessage": "!!!Privacy Statement", + "end": { + "column": 3, + "line": 53 + }, + "file": "src/components/auth/Signup.js", + "id": "signup.legal.privacy", + "start": { + "column": 11, + "line": 50 + } + }, + { + "defaultMessage": "!!!Create account", + "end": { + "column": 3, + "line": 57 + }, + "file": "src/components/auth/Signup.js", + "id": "signup.submit.label", + "start": { + "column": 21, + "line": 54 + } + }, + { + "defaultMessage": "!!!Already have an account, sign in?", + "end": { + "column": 3, + "line": 61 + }, + "file": "src/components/auth/Signup.js", + "id": "signup.link.login", + "start": { + "column": 13, + "line": 58 + } + }, + { + "defaultMessage": "!!!A user with that email address already exists", + "end": { + "column": 3, + "line": 65 + }, + "file": "src/components/auth/Signup.js", + "id": "signup.emailDuplicate", + "start": { + "column": 18, + "line": 62 + } + } + ], + "path": "src/components/auth/Signup.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Create a free account", + "end": { + "column": 3, + "line": 12 + }, + "file": "src/components/auth/Welcome.js", + "id": "welcome.signupButton", + "start": { + "column": 16, + "line": 9 + } + }, + { + "defaultMessage": "!!!Login to your account", + "end": { + "column": 3, + "line": 16 + }, + "file": "src/components/auth/Welcome.js", + "id": "welcome.loginButton", + "start": { + "column": 15, + "line": 13 + } + } + ], + "path": "src/components/auth/Welcome.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Your services have been updated.", + "end": { + "column": 3, + "line": 29 + }, + "file": "src/components/layout/AppLayout.js", + "id": "infobar.servicesUpdated", + "start": { + "column": 19, + "line": 26 + } + }, + { + "defaultMessage": "!!!A new update for Franz is available.", + "end": { + "column": 3, + "line": 33 + }, + "file": "src/components/layout/AppLayout.js", + "id": "infobar.updateAvailable", + "start": { + "column": 19, + "line": 30 + } + }, + { + "defaultMessage": "!!!Reload services", + "end": { + "column": 3, + "line": 37 + }, + "file": "src/components/layout/AppLayout.js", + "id": "infobar.buttonReloadServices", + "start": { + "column": 24, + "line": 34 + } + }, + { + "defaultMessage": "!!!Changelog", + "end": { + "column": 3, + "line": 41 + }, + "file": "src/components/layout/AppLayout.js", + "id": "infobar.buttonChangelog", + "start": { + "column": 13, + "line": 38 + } + }, + { + "defaultMessage": "!!!Restart & install update", + "end": { + "column": 3, + "line": 45 + }, + "file": "src/components/layout/AppLayout.js", + "id": "infobar.buttonInstallUpdate", + "start": { + "column": 23, + "line": 42 + } + }, + { + "defaultMessage": "!!!Could not load services and user information", + "end": { + "column": 3, + "line": 49 + }, + "file": "src/components/layout/AppLayout.js", + "id": "infobar.requiredRequestsFailed", + "start": { + "column": 26, + "line": 46 + } + } + ], + "path": "src/components/layout/AppLayout.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Settings", + "end": { + "column": 3, + "line": 16 + }, + "file": "src/components/layout/Sidebar.js", + "id": "sidebar.settings", + "start": { + "column": 12, + "line": 13 + } + }, + { + "defaultMessage": "!!!Add new service", + "end": { + "column": 3, + "line": 20 + }, + "file": "src/components/layout/Sidebar.js", + "id": "sidebar.addNewService", + "start": { + "column": 17, + "line": 17 + } + }, + { + "defaultMessage": "!!!Disable notifications & audio", + "end": { + "column": 3, + "line": 24 + }, + "file": "src/components/layout/Sidebar.js", + "id": "sidebar.muteApp", + "start": { + "column": 8, + "line": 21 + } + }, + { + "defaultMessage": "!!!Enable notifications & audio", + "end": { + "column": 3, + "line": 28 + }, + "file": "src/components/layout/Sidebar.js", + "id": "sidebar.unmuteApp", + "start": { + "column": 10, + "line": 25 + } + }, + { + "defaultMessage": "!!!Open workspace drawer", + "end": { + "column": 3, + "line": 32 + }, + "file": "src/components/layout/Sidebar.js", + "id": "sidebar.openWorkspaceDrawer", + "start": { + "column": 23, + "line": 29 + } + }, + { + "defaultMessage": "!!!Close workspace drawer", + "end": { + "column": 3, + "line": 36 + }, + "file": "src/components/layout/Sidebar.js", + "id": "sidebar.closeWorkspaceDrawer", + "start": { + "column": 24, + "line": 33 + } + } + ], + "path": "src/components/layout/Sidebar.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Oh no!", + "end": { + "column": 3, + "line": 15 + }, + "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js", + "id": "service.errorHandler.headline", + "start": { + "column": 12, + "line": 12 + } + }, + { + "defaultMessage": "!!!{name} has failed to load.", + "end": { + "column": 3, + "line": 19 + }, + "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js", + "id": "service.errorHandler.text", + "start": { + "column": 8, + "line": 16 + } + }, + { + "defaultMessage": "!!!Reload {name}", + "end": { + "column": 3, + "line": 23 + }, + "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js", + "id": "service.errorHandler.action", + "start": { + "column": 10, + "line": 20 + } + }, + { + "defaultMessage": "!!!Edit {name}", + "end": { + "column": 3, + "line": 27 + }, + "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js", + "id": "service.errorHandler.editAction", + "start": { + "column": 14, + "line": 24 + } + }, + { + "defaultMessage": "!!!Error:", + "end": { + "column": 3, + "line": 31 + }, + "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js", + "id": "service.errorHandler.message", + "start": { + "column": 16, + "line": 28 + } + } + ], + "path": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!{name} is disabled", + "end": { + "column": 3, + "line": 12 + }, + "file": "src/components/services/content/ServiceDisabled.js", + "id": "service.disabledHandler.headline", + "start": { + "column": 12, + "line": 9 + } + }, + { + "defaultMessage": "!!!Enable {name}", + "end": { + "column": 3, + "line": 16 + }, + "file": "src/components/services/content/ServiceDisabled.js", + "id": "service.disabledHandler.action", + "start": { + "column": 10, + "line": 13 + } + } + ], + "path": "src/components/services/content/ServiceDisabled.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Welcome to Franz", + "end": { + "column": 3, + "line": 14 + }, + "file": "src/components/services/content/Services.js", + "id": "services.welcome", + "start": { + "column": 11, + "line": 11 + } + }, + { + "defaultMessage": "!!!Get started", + "end": { + "column": 3, + "line": 18 + }, + "file": "src/components/services/content/Services.js", + "id": "services.getStarted", + "start": { + "column": 14, + "line": 15 + } + } + ], + "path": "src/components/services/content/Services.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Oh no!", + "end": { + "column": 3, + "line": 13 + }, + "file": "src/components/services/content/WebviewCrashHandler.js", + "id": "service.crashHandler.headline", + "start": { + "column": 12, + "line": 10 + } + }, + { + "defaultMessage": "!!!{name} has caused an error.", + "end": { + "column": 3, + "line": 17 + }, + "file": "src/components/services/content/WebviewCrashHandler.js", + "id": "service.crashHandler.text", + "start": { + "column": 8, + "line": 14 + } + }, + { + "defaultMessage": "!!!Reload {name}", + "end": { + "column": 3, + "line": 21 + }, + "file": "src/components/services/content/WebviewCrashHandler.js", + "id": "service.crashHandler.action", + "start": { + "column": 10, + "line": 18 + } + }, + { + "defaultMessage": "!!!Trying to automatically restore {name} in {seconds} seconds", + "end": { + "column": 3, + "line": 25 + }, + "file": "src/components/services/content/WebviewCrashHandler.js", + "id": "service.crashHandler.autoReload", + "start": { + "column": 14, + "line": 22 + } + } + ], + "path": "src/components/services/content/WebviewCrashHandler.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Reload", + "end": { + "column": 3, + "line": 18 + }, + "file": "src/components/services/tabs/TabItem.js", + "id": "tabs.item.reload", + "start": { + "column": 10, + "line": 15 + } + }, + { + "defaultMessage": "!!!Edit", + "end": { + "column": 3, + "line": 22 + }, + "file": "src/components/services/tabs/TabItem.js", + "id": "tabs.item.edit", + "start": { + "column": 8, + "line": 19 + } + }, + { + "defaultMessage": "!!!Disable notifications", + "end": { + "column": 3, + "line": 26 + }, + "file": "src/components/services/tabs/TabItem.js", + "id": "tabs.item.disableNotifications", + "start": { + "column": 24, + "line": 23 + } + }, + { + "defaultMessage": "!!!Enable notifications", + "end": { + "column": 3, + "line": 30 + }, + "file": "src/components/services/tabs/TabItem.js", + "id": "tabs.item.enableNotification", + "start": { + "column": 23, + "line": 27 + } + }, + { + "defaultMessage": "!!!Disable audio", + "end": { + "column": 3, + "line": 34 + }, + "file": "src/components/services/tabs/TabItem.js", + "id": "tabs.item.disableAudio", + "start": { + "column": 16, + "line": 31 + } + }, + { + "defaultMessage": "!!!Enable audio", + "end": { + "column": 3, + "line": 38 + }, + "file": "src/components/services/tabs/TabItem.js", + "id": "tabs.item.enableAudio", + "start": { + "column": 15, + "line": 35 + } + }, + { + "defaultMessage": "!!!Disable Service", + "end": { + "column": 3, + "line": 42 + }, + "file": "src/components/services/tabs/TabItem.js", + "id": "tabs.item.disableService", + "start": { + "column": 18, + "line": 39 + } + }, + { + "defaultMessage": "!!!Enable Service", + "end": { + "column": 3, + "line": 46 + }, + "file": "src/components/services/tabs/TabItem.js", + "id": "tabs.item.enableService", + "start": { + "column": 17, + "line": 43 + } + }, + { + "defaultMessage": "!!!Delete Service", + "end": { + "column": 3, + "line": 50 + }, + "file": "src/components/services/tabs/TabItem.js", + "id": "tabs.item.deleteService", + "start": { + "column": 17, + "line": 47 + } + } + ], + "path": "src/components/services/tabs/TabItem.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Account", + "end": { + "column": 3, + "line": 18 + }, + "file": "src/components/settings/account/AccountDashboard.js", + "id": "settings.account.headline", + "start": { + "column": 12, + "line": 15 + } + }, + { + "defaultMessage": "!!!Your Subscription", + "end": { + "column": 3, + "line": 22 + }, + "file": "src/components/settings/account/AccountDashboard.js", + "id": "settings.account.headlineSubscription", + "start": { + "column": 24, + "line": 19 + } + }, + { + "defaultMessage": "!!!Upgrade your Account", + "end": { + "column": 3, + "line": 26 + }, + "file": "src/components/settings/account/AccountDashboard.js", + "id": "settings.account.headlineUpgrade", + "start": { + "column": 19, + "line": 23 + } + }, + { + "defaultMessage": "!!Invoices", + "end": { + "column": 3, + "line": 30 + }, + "file": "src/components/settings/account/AccountDashboard.js", + "id": "settings.account.headlineInvoices", + "start": { + "column": 20, + "line": 27 + } + }, + { + "defaultMessage": "!!Danger Zone", + "end": { + "column": 3, + "line": 34 + }, + "file": "src/components/settings/account/AccountDashboard.js", + "id": "settings.account.headlineDangerZone", + "start": { + "column": 22, + "line": 31 + } + }, + { + "defaultMessage": "!!!Manage your subscription", + "end": { + "column": 3, + "line": 38 + }, + "file": "src/components/settings/account/AccountDashboard.js", + "id": "settings.account.manageSubscription.label", + "start": { + "column": 33, + "line": 35 + } + }, + { + "defaultMessage": "!!!Basic Account", + "end": { + "column": 3, + "line": 42 + }, + "file": "src/components/settings/account/AccountDashboard.js", + "id": "settings.account.accountType.basic", + "start": { + "column": 20, + "line": 39 + } + }, + { + "defaultMessage": "!!!Premium Supporter Account", + "end": { + "column": 3, + "line": 46 + }, + "file": "src/components/settings/account/AccountDashboard.js", + "id": "settings.account.accountType.premium", + "start": { + "column": 22, + "line": 43 + } + }, + { + "defaultMessage": "!!!Edit Account", + "end": { + "column": 3, + "line": 50 + }, + "file": "src/components/settings/account/AccountDashboard.js", + "id": "settings.account.account.editButton", + "start": { + "column": 21, + "line": 47 + } + }, + { + "defaultMessage": "!!!Download", + "end": { + "column": 3, + "line": 54 + }, + "file": "src/components/settings/account/AccountDashboard.js", + "id": "settings.account.invoiceDownload", + "start": { + "column": 19, + "line": 51 + } + }, + { + "defaultMessage": "!!!Could not load user information", + "end": { + "column": 3, + "line": 58 + }, + "file": "src/components/settings/account/AccountDashboard.js", + "id": "settings.account.userInfoRequestFailed", + "start": { + "column": 25, + "line": 55 + } + }, + { + "defaultMessage": "!!!Try again", + "end": { + "column": 3, + "line": 62 + }, + "file": "src/components/settings/account/AccountDashboard.js", + "id": "settings.account.tryReloadUserInfoRequest", + "start": { + "column": 28, + "line": 59 + } + }, + { + "defaultMessage": "!!!Delete account", + "end": { + "column": 3, + "line": 66 + }, + "file": "src/components/settings/account/AccountDashboard.js", + "id": "settings.account.deleteAccount", + "start": { + "column": 17, + "line": 63 + } + }, + { + "defaultMessage": "!!!If you don't need your Franz account any longer, you can delete your account and all related data here.", + "end": { + "column": 3, + "line": 70 + }, + "file": "src/components/settings/account/AccountDashboard.js", + "id": "settings.account.deleteInfo", + "start": { + "column": 14, + "line": 67 + } + }, + { + "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!", + "end": { + "column": 3, + "line": 74 + }, + "file": "src/components/settings/account/AccountDashboard.js", + "id": "settings.account.deleteEmailSent", + "start": { + "column": 19, + "line": 71 + } + } + ], + "path": "src/components/settings/account/AccountDashboard.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Available services", + "end": { + "column": 3, + "line": 15 + }, + "file": "src/components/settings/navigation/SettingsNavigation.js", + "id": "settings.navigation.availableServices", + "start": { + "column": 21, + "line": 12 + } + }, + { + "defaultMessage": "!!!Your services", + "end": { + "column": 3, + "line": 19 + }, + "file": "src/components/settings/navigation/SettingsNavigation.js", + "id": "settings.navigation.yourServices", + "start": { + "column": 16, + "line": 16 + } + }, + { + "defaultMessage": "!!!Your workspaces", + "end": { + "column": 3, + "line": 23 + }, + "file": "src/components/settings/navigation/SettingsNavigation.js", + "id": "settings.navigation.yourWorkspaces", + "start": { + "column": 18, + "line": 20 + } + }, + { + "defaultMessage": "!!!Account", + "end": { + "column": 3, + "line": 27 + }, + "file": "src/components/settings/navigation/SettingsNavigation.js", + "id": "settings.navigation.account", + "start": { + "column": 11, + "line": 24 + } + }, + { + "defaultMessage": "!!!Settings", + "end": { + "column": 3, + "line": 31 + }, + "file": "src/components/settings/navigation/SettingsNavigation.js", + "id": "settings.navigation.settings", + "start": { + "column": 12, + "line": 28 + } + }, + { + "defaultMessage": "!!!Invite Friends", + "end": { + "column": 3, + "line": 35 + }, + "file": "src/components/settings/navigation/SettingsNavigation.js", + "id": "settings.navigation.inviteFriends", + "start": { + "column": 17, + "line": 32 + } + }, + { + "defaultMessage": "!!!Logout", + "end": { + "column": 3, + "line": 39 + }, + "file": "src/components/settings/navigation/SettingsNavigation.js", + "id": "settings.navigation.logout", + "start": { + "column": 10, + "line": 36 + } + } + ], + "path": "src/components/settings/navigation/SettingsNavigation.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Available Services", + "end": { + "column": 3, + "line": 18 + }, + "file": "src/components/settings/recipes/RecipesDashboard.js", + "id": "settings.recipes.headline", + "start": { + "column": 12, + "line": 15 + } + }, + { + "defaultMessage": "!!!Search service", + "end": { + "column": 3, + "line": 22 + }, + "file": "src/components/settings/recipes/RecipesDashboard.js", + "id": "settings.searchService", + "start": { + "column": 17, + "line": 19 + } + }, + { + "defaultMessage": "!!!Most popular", + "end": { + "column": 3, + "line": 26 + }, + "file": "src/components/settings/recipes/RecipesDashboard.js", + "id": "settings.recipes.mostPopular", + "start": { + "column": 22, + "line": 23 + } + }, + { + "defaultMessage": "!!!All services", + "end": { + "column": 3, + "line": 30 + }, + "file": "src/components/settings/recipes/RecipesDashboard.js", + "id": "settings.recipes.all", + "start": { + "column": 14, + "line": 27 + } + }, + { + "defaultMessage": "!!!Development", + "end": { + "column": 3, + "line": 34 + }, + "file": "src/components/settings/recipes/RecipesDashboard.js", + "id": "settings.recipes.dev", + "start": { + "column": 14, + "line": 31 + } + }, + { + "defaultMessage": "!!!Sorry, but no service matched your search term.", + "end": { + "column": 3, + "line": 38 + }, + "file": "src/components/settings/recipes/RecipesDashboard.js", + "id": "settings.recipes.nothingFound", + "start": { + "column": 16, + "line": 35 + } + }, + { + "defaultMessage": "!!!Service successfully added", + "end": { + "column": 3, + "line": 42 + }, + "file": "src/components/settings/recipes/RecipesDashboard.js", + "id": "settings.recipes.servicesSuccessfulAddedInfo", + "start": { + "column": 31, + "line": 39 + } + }, + { + "defaultMessage": "!!!Missing a service?", + "end": { + "column": 3, + "line": 46 + }, + "file": "src/components/settings/recipes/RecipesDashboard.js", + "id": "settings.recipes.missingService", + "start": { + "column": 18, + "line": 43 + } + } + ], + "path": "src/components/settings/recipes/RecipesDashboard.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Save service", + "end": { + "column": 3, + "line": 25 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.saveButton", + "start": { + "column": 15, + "line": 22 + } + }, + { + "defaultMessage": "!!!Delete Service", + "end": { + "column": 3, + "line": 29 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.deleteButton", + "start": { + "column": 17, + "line": 26 + } + }, + { + "defaultMessage": "!!!Available services", + "end": { + "column": 3, + "line": 33 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.availableServices", + "start": { + "column": 21, + "line": 30 + } + }, + { + "defaultMessage": "!!!Your services", + "end": { + "column": 3, + "line": 37 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.yourServices", + "start": { + "column": 16, + "line": 34 + } + }, + { + "defaultMessage": "!!!Add {name}", + "end": { + "column": 3, + "line": 41 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.addServiceHeadline", + "start": { + "column": 22, + "line": 38 + } + }, + { + "defaultMessage": "!!!Edit {name}", + "end": { + "column": 3, + "line": 45 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.editServiceHeadline", + "start": { + "column": 23, + "line": 42 + } + }, + { + "defaultMessage": "!!!Hosted", + "end": { + "column": 3, + "line": 49 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.tabHosted", + "start": { + "column": 13, + "line": 46 + } + }, + { + "defaultMessage": "!!!Self hosted ⭐️", + "end": { + "column": 3, + "line": 53 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.tabOnPremise", + "start": { + "column": 16, + "line": 50 + } + }, + { + "defaultMessage": "!!!Use the hosted {name} service.", + "end": { + "column": 3, + "line": 57 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.useHostedService", + "start": { + "column": 20, + "line": 54 + } + }, + { + "defaultMessage": "!!!Could not validate custom {name} server.", + "end": { + "column": 3, + "line": 61 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.customUrlValidationError", + "start": { + "column": 28, + "line": 58 + } + }, + { + "defaultMessage": "!!!To add self hosted services, you need a Franz Premium Supporter Account.", + "end": { + "column": 3, + "line": 65 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.customUrlPremiumInfo", + "start": { + "column": 24, + "line": 62 + } + }, + { + "defaultMessage": "!!!Upgrade your account", + "end": { + "column": 3, + "line": 69 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.customUrlUpgradeAccount", + "start": { + "column": 27, + "line": 66 + } + }, + { + "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...", + "end": { + "column": 3, + "line": 73 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.indirectMessageInfo", + "start": { + "column": 23, + "line": 70 + } + }, + { + "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted", + "end": { + "column": 3, + "line": 77 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.isMutedInfo", + "start": { + "column": 15, + "line": 74 + } + }, + { + "defaultMessage": "!!!Notifications", + "end": { + "column": 3, + "line": 81 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.headlineNotifications", + "start": { + "column": 25, + "line": 78 + } + }, + { + "defaultMessage": "!!!Unread message badges", + "end": { + "column": 3, + "line": 85 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.headlineBadges", + "start": { + "column": 18, + "line": 82 + } + }, + { + "defaultMessage": "!!!General", + "end": { + "column": 3, + "line": 89 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.headlineGeneral", + "start": { + "column": 19, + "line": 86 + } + }, + { + "defaultMessage": "!!!Delete", + "end": { + "column": 3, + "line": 93 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.iconDelete", + "start": { + "column": 14, + "line": 90 + } + }, + { + "defaultMessage": "!!!Drop your image, or click here", + "end": { + "column": 3, + "line": 97 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.iconUpload", + "start": { + "column": 14, + "line": 94 + } + }, + { + "defaultMessage": "!!!HTTP/HTTPS Proxy Settings", + "end": { + "column": 3, + "line": 101 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.proxy.headline", + "start": { + "column": 17, + "line": 98 + } + }, + { + "defaultMessage": "!!!Please restart Franz after changing proxy Settings.", + "end": { + "column": 3, + "line": 105 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.proxy.restartInfo", + "start": { + "column": 20, + "line": 102 + } + }, + { + "defaultMessage": "!!!Proxy settings will not be synchronized with the Franz servers.", + "end": { + "column": 3, + "line": 109 + }, + "file": "src/components/settings/services/EditServiceForm.js", + "id": "settings.service.form.proxy.info", + "start": { + "column": 13, + "line": 106 + } + } + ], + "path": "src/components/settings/services/EditServiceForm.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Error", + "end": { + "column": 3, + "line": 13 + }, + "file": "src/components/settings/services/ServiceError.js", + "id": "settings.service.error.headline", + "start": { + "column": 12, + "line": 10 + } + }, + { + "defaultMessage": "!!!Back to services", + "end": { + "column": 3, + "line": 17 + }, + "file": "src/components/settings/services/ServiceError.js", + "id": "settings.service.error.goBack", + "start": { + "column": 10, + "line": 14 + } + }, + { + "defaultMessage": "!!!Available services", + "end": { + "column": 3, + "line": 21 + }, + "file": "src/components/settings/services/ServiceError.js", + "id": "settings.service.form.availableServices", + "start": { + "column": 21, + "line": 18 + } + }, + { + "defaultMessage": "!!!Could not load service recipe.", + "end": { + "column": 3, + "line": 25 + }, + "file": "src/components/settings/services/ServiceError.js", + "id": "settings.service.error.message", + "start": { + "column": 16, + "line": 22 + } + } + ], + "path": "src/components/settings/services/ServiceError.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Service is disabled", + "end": { + "column": 3, + "line": 14 + }, + "file": "src/components/settings/services/ServiceItem.js", + "id": "settings.services.tooltip.isDisabled", + "start": { + "column": 21, + "line": 11 + } + }, + { + "defaultMessage": "!!!Notifications are disabled", + "end": { + "column": 3, + "line": 18 + }, + "file": "src/components/settings/services/ServiceItem.js", + "id": "settings.services.tooltip.notificationsDisabled", + "start": { + "column": 32, + "line": 15 + } + }, + { + "defaultMessage": "!!!All sounds are muted", + "end": { + "column": 3, + "line": 22 + }, + "file": "src/components/settings/services/ServiceItem.js", + "id": "settings.services.tooltip.isMuted", + "start": { + "column": 18, + "line": 19 + } + } + ], + "path": "src/components/settings/services/ServiceItem.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Your services", + "end": { + "column": 3, + "line": 17 + }, + "file": "src/components/settings/services/ServicesDashboard.js", + "id": "settings.services.headline", + "start": { + "column": 12, + "line": 14 + } + }, + { + "defaultMessage": "!!!Search service", + "end": { + "column": 3, + "line": 21 + }, + "file": "src/components/settings/services/ServicesDashboard.js", + "id": "settings.searchService", + "start": { + "column": 17, + "line": 18 + } + }, + { + "defaultMessage": "!!!You haven't added any services yet.", + "end": { + "column": 3, + "line": 25 + }, + "file": "src/components/settings/services/ServicesDashboard.js", + "id": "settings.services.noServicesAdded", + "start": { + "column": 19, + "line": 22 + } + }, + { + "defaultMessage": "!!!Sorry, but no service matched your search term.", + "end": { + "column": 3, + "line": 29 + }, + "file": "src/components/settings/services/ServicesDashboard.js", + "id": "settings.recipes.nothingFound", + "start": { + "column": 18, + "line": 26 + } + }, + { + "defaultMessage": "!!!Discover services", + "end": { + "column": 3, + "line": 33 + }, + "file": "src/components/settings/services/ServicesDashboard.js", + "id": "settings.services.discoverServices", + "start": { + "column": 20, + "line": 30 + } + }, + { + "defaultMessage": "!!!Could not load your services", + "end": { + "column": 3, + "line": 37 + }, + "file": "src/components/settings/services/ServicesDashboard.js", + "id": "settings.services.servicesRequestFailed", + "start": { + "column": 25, + "line": 34 + } + }, + { + "defaultMessage": "!!!Try again", + "end": { + "column": 3, + "line": 41 + }, + "file": "src/components/settings/services/ServicesDashboard.js", + "id": "settings.account.tryReloadServices", + "start": { + "column": 21, + "line": 38 + } + }, + { + "defaultMessage": "!!!Your changes have been saved", + "end": { + "column": 3, + "line": 45 + }, + "file": "src/components/settings/services/ServicesDashboard.js", + "id": "settings.services.updatedInfo", + "start": { + "column": 15, + "line": 42 + } + }, + { + "defaultMessage": "!!!Service has been deleted", + "end": { + "column": 3, + "line": 49 + }, + "file": "src/components/settings/services/ServicesDashboard.js", + "id": "settings.services.deletedInfo", + "start": { + "column": 15, + "line": 46 + } + } + ], + "path": "src/components/settings/services/ServicesDashboard.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Settings", + "end": { + "column": 3, + "line": 19 + }, + "file": "src/components/settings/settings/EditSettingsForm.js", + "id": "settings.app.headline", + "start": { + "column": 12, + "line": 16 + } + }, + { + "defaultMessage": "!!!General", + "end": { + "column": 3, + "line": 23 + }, + "file": "src/components/settings/settings/EditSettingsForm.js", + "id": "settings.app.headlineGeneral", + "start": { + "column": 19, + "line": 20 + } + }, + { + "defaultMessage": "!!!Language", + "end": { + "column": 3, + "line": 27 + }, + "file": "src/components/settings/settings/EditSettingsForm.js", + "id": "settings.app.headlineLanguage", + "start": { + "column": 20, + "line": 24 + } + }, + { + "defaultMessage": "!!!Updates", + "end": { + "column": 3, + "line": 31 + }, + "file": "src/components/settings/settings/EditSettingsForm.js", + "id": "settings.app.headlineUpdates", + "start": { + "column": 19, + "line": 28 + } + }, + { + "defaultMessage": "!!!Appearance", + "end": { + "column": 3, + "line": 35 + }, + "file": "src/components/settings/settings/EditSettingsForm.js", + "id": "settings.app.headlineAppearance", + "start": { + "column": 22, + "line": 32 + } + }, + { + "defaultMessage": "!!!Advanced", + "end": { + "column": 3, + "line": 39 + }, + "file": "src/components/settings/settings/EditSettingsForm.js", + "id": "settings.app.headlineAdvanced", + "start": { + "column": 20, + "line": 36 + } + }, + { + "defaultMessage": "!!!Help us to translate Franz into your language.", + "end": { + "column": 3, + "line": 43 + }, + "file": "src/components/settings/settings/EditSettingsForm.js", + "id": "settings.app.translationHelp", + "start": { + "column": 19, + "line": 40 + } + }, + { + "defaultMessage": "!!!Cache", + "end": { + "column": 3, + "line": 47 + }, + "file": "src/components/settings/settings/EditSettingsForm.js", + "id": "settings.app.subheadlineCache", + "start": { + "column": 20, + "line": 44 + } + }, + { + "defaultMessage": "!!!Franz cache is currently using {size} of disk space.", + "end": { + "column": 3, + "line": 51 + }, + "file": "src/components/settings/settings/EditSettingsForm.js", + "id": "settings.app.cacheInfo", + "start": { + "column": 13, + "line": 48 + } + }, + { + "defaultMessage": "!!!Clear cache", + "end": { + "column": 3, + "line": 55 + }, + "file": "src/components/settings/settings/EditSettingsForm.js", + "id": "settings.app.buttonClearAllCache", + "start": { + "column": 23, + "line": 52 + } + }, + { + "defaultMessage": "!!!Check for updates", + "end": { + "column": 3, + "line": 59 + }, + "file": "src/components/settings/settings/EditSettingsForm.js", + "id": "settings.app.buttonSearchForUpdate", + "start": { + "column": 25, + "line": 56 + } + }, + { + "defaultMessage": "!!!Restart & install update", + "end": { + "column": 3, + "line": 63 + }, + "file": "src/components/settings/settings/EditSettingsForm.js", + "id": "settings.app.buttonInstallUpdate", + "start": { + "column": 23, + "line": 60 + } + }, + { + "defaultMessage": "!!!Is searching for update", + "end": { + "column": 3, + "line": 67 + }, + "file": "src/components/settings/settings/EditSettingsForm.js", + "id": "settings.app.updateStatusSearching", + "start": { + "column": 25, + "line": 64 + } + }, + { + "defaultMessage": "!!!Update available, downloading...", + "end": { + "column": 3, + "line": 71 + }, + "file": "src/components/settings/settings/EditSettingsForm.js", + "id": "settings.app.updateStatusAvailable", + "start": { + "column": 25, + "line": 68 + } + }, + { + "defaultMessage": "!!!You are using the latest version of Franz", + "end": { + "column": 3, + "line": 75 + }, + "file": "src/components/settings/settings/EditSettingsForm.js", + "id": "settings.app.updateStatusUpToDate", + "start": { + "column": 24, + "line": 72 + } + }, + { + "defaultMessage": "!!!Current version:", + "end": { + "column": 3, + "line": 79 + }, + "file": "src/components/settings/settings/EditSettingsForm.js", + "id": "settings.app.currentVersion", + "start": { + "column": 18, + "line": 76 + } + }, + { + "defaultMessage": "!!!Changes require restart", + "end": { + "column": 3, + "line": 83 + }, + "file": "src/components/settings/settings/EditSettingsForm.js", + "id": "settings.app.restartRequired", + "start": { + "column": 29, + "line": 80 + } + }, + { + "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.", + "end": { + "column": 3, + "line": 87 + }, + "file": "src/components/settings/settings/EditSettingsForm.js", + "id": "settings.app.languageDisclaimer", + "start": { + "column": 22, + "line": 84 + } + } + ], + "path": "src/components/settings/settings/EditSettingsForm.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Account", + "end": { + "column": 3, + "line": 18 + }, + "file": "src/components/settings/user/EditUserForm.js", + "id": "settings.account.headline", + "start": { + "column": 12, + "line": 15 + } + }, + { + "defaultMessage": "!!!Update Profile", + "end": { + "column": 3, + "line": 22 + }, + "file": "src/components/settings/user/EditUserForm.js", + "id": "settings.account.headlineProfile", + "start": { + "column": 19, + "line": 19 + } + }, + { + "defaultMessage": "!!!Account Information", + "end": { + "column": 3, + "line": 26 + }, + "file": "src/components/settings/user/EditUserForm.js", + "id": "settings.account.headlineAccount", + "start": { + "column": 19, + "line": 23 + } + }, + { + "defaultMessage": "!!!Change Password", + "end": { + "column": 3, + "line": 30 + }, + "file": "src/components/settings/user/EditUserForm.js", + "id": "settings.account.headlinePassword", + "start": { + "column": 20, + "line": 27 + } + }, + { + "defaultMessage": "!!!Your changes have been saved", + "end": { + "column": 3, + "line": 34 + }, + "file": "src/components/settings/user/EditUserForm.js", + "id": "settings.account.successInfo", + "start": { + "column": 15, + "line": 31 + } + }, + { + "defaultMessage": "!!!Update profile", + "end": { + "column": 3, + "line": 38 + }, + "file": "src/components/settings/user/EditUserForm.js", + "id": "settings.account.buttonSave", + "start": { + "column": 14, + "line": 35 + } + } + ], + "path": "src/components/settings/user/EditUserForm.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Support the development of Franz", + "end": { + "column": 3, + "line": 17 + }, + "file": "src/components/subscription/SubscriptionForm.js", + "id": "subscription.submit.label", + "start": { + "column": 21, + "line": 14 + } + }, + { + "defaultMessage": "!!!Could not initialize payment form", + "end": { + "column": 3, + "line": 21 + }, + "file": "src/components/subscription/SubscriptionForm.js", + "id": "subscription.paymentSessionError", + "start": { + "column": 23, + "line": 18 + } + }, + { + "defaultMessage": "!!!free", + "end": { + "column": 3, + "line": 25 + }, + "file": "src/components/subscription/SubscriptionForm.js", + "id": "subscription.type.free", + "start": { + "column": 12, + "line": 22 + } + }, + { + "defaultMessage": "!!!month", + "end": { + "column": 3, + "line": 29 + }, + "file": "src/components/subscription/SubscriptionForm.js", + "id": "subscription.type.month", + "start": { + "column": 15, + "line": 26 + } + }, + { + "defaultMessage": "!!!year", + "end": { + "column": 3, + "line": 33 + }, + "file": "src/components/subscription/SubscriptionForm.js", + "id": "subscription.type.year", + "start": { + "column": 14, + "line": 30 + } + }, + { + "defaultMessage": "!!!The Franz Premium Supporter Account includes", + "end": { + "column": 3, + "line": 37 + }, + "file": "src/components/subscription/SubscriptionForm.js", + "id": "subscription.includedFeatures", + "start": { + "column": 20, + "line": 34 + } + }, + { + "defaultMessage": "!!!Add on-premise/hosted services like Mattermost", + "end": { + "column": 3, + "line": 41 + }, + "file": "src/components/subscription/SubscriptionForm.js", + "id": "subscription.features.onpremise.mattermost", + "start": { + "column": 13, + "line": 38 + } + }, + { + "defaultMessage": "!!!No app delays & nagging to upgrade license", + "end": { + "column": 3, + "line": 45 + }, + "file": "src/components/subscription/SubscriptionForm.js", + "id": "subscription.features.noInterruptions", + "start": { + "column": 19, + "line": 42 + } + }, + { + "defaultMessage": "!!!Proxy support for services", + "end": { + "column": 3, + "line": 49 + }, + "file": "src/components/subscription/SubscriptionForm.js", + "id": "subscription.features.proxy", + "start": { + "column": 9, + "line": 46 + } + }, + { + "defaultMessage": "!!!Support for Spellchecker", + "end": { + "column": 3, + "line": 53 + }, + "file": "src/components/subscription/SubscriptionForm.js", + "id": "subscription.features.spellchecker", + "start": { + "column": 16, + "line": 50 + } + }, + { + "defaultMessage": "!!!No ads, ever!", + "end": { + "column": 3, + "line": 57 + }, + "file": "src/components/subscription/SubscriptionForm.js", + "id": "subscription.features.ads", + "start": { + "column": 7, + "line": 54 + } + }, + { + "defaultMessage": "!!!coming soon", + "end": { + "column": 3, + "line": 61 + }, + "file": "src/components/subscription/SubscriptionForm.js", + "id": "subscription.features.comingSoon", + "start": { + "column": 14, + "line": 58 + } + }, + { + "defaultMessage": "!!!EU residents: local sales tax may apply", + "end": { + "column": 3, + "line": 65 + }, + "file": "src/components/subscription/SubscriptionForm.js", + "id": "subscription.euTaxInfo", + "start": { + "column": 13, + "line": 62 + } + } + ], + "path": "src/components/subscription/SubscriptionForm.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Cancel", + "end": { + "column": 3, + "line": 14 + }, + "file": "src/components/subscription/SubscriptionPopup.js", + "id": "subscriptionPopup.buttonCancel", + "start": { + "column": 16, + "line": 11 + } + }, + { + "defaultMessage": "!!!Done", + "end": { + "column": 3, + "line": 18 + }, + "file": "src/components/subscription/SubscriptionPopup.js", + "id": "subscriptionPopup.buttonDone", + "start": { + "column": 14, + "line": 15 + } + } + ], + "path": "src/components/subscription/SubscriptionPopup.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Upgrade account", + "end": { + "column": 3, + "line": 18 + }, + "file": "src/components/ui/PremiumFeatureContainer/index.js", + "id": "premiumFeature.button.upgradeAccount", + "start": { + "column": 10, + "line": 15 + } + } + ], + "path": "src/components/ui/PremiumFeatureContainer/index.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Loading", + "end": { + "column": 3, + "line": 14 + }, + "file": "src/components/ui/WebviewLoader/index.js", + "id": "service.webviewLoader.loading", + "start": { + "column": 11, + "line": 11 + } + } + ], + "path": "src/components/ui/WebviewLoader/index.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Something went wrong.", + "end": { + "column": 3, + "line": 14 + }, + "file": "src/components/util/ErrorBoundary/index.js", + "id": "app.errorHandler.headline", + "start": { + "column": 12, + "line": 11 + } + }, + { + "defaultMessage": "!!!Reload", + "end": { + "column": 3, + "line": 18 + }, + "file": "src/components/util/ErrorBoundary/index.js", + "id": "app.errorHandler.action", + "start": { + "column": 10, + "line": 15 + } + } + ], + "path": "src/components/util/ErrorBoundary/index.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Name", + "end": { + "column": 3, + "line": 31 + }, + "file": "src/containers/settings/EditServiceScreen.js", + "id": "settings.service.form.name", + "start": { + "column": 8, + "line": 28 + } + }, + { + "defaultMessage": "!!!Enable service", + "end": { + "column": 3, + "line": 35 + }, + "file": "src/containers/settings/EditServiceScreen.js", + "id": "settings.service.form.enableService", + "start": { + "column": 17, + "line": 32 + } + }, + { + "defaultMessage": "!!!Enable Notifications", + "end": { + "column": 3, + "line": 39 + }, + "file": "src/containers/settings/EditServiceScreen.js", + "id": "settings.service.form.enableNotification", + "start": { + "column": 22, + "line": 36 + } + }, + { + "defaultMessage": "!!!Show unread message badges", + "end": { + "column": 3, + "line": 43 + }, + "file": "src/containers/settings/EditServiceScreen.js", + "id": "settings.service.form.enableBadge", + "start": { + "column": 15, + "line": 40 + } + }, + { + "defaultMessage": "!!!Enable audio", + "end": { + "column": 3, + "line": 47 + }, + "file": "src/containers/settings/EditServiceScreen.js", + "id": "settings.service.form.enableAudio", + "start": { + "column": 15, + "line": 44 + } + }, + { + "defaultMessage": "!!!Team", + "end": { + "column": 3, + "line": 51 + }, + "file": "src/containers/settings/EditServiceScreen.js", + "id": "settings.service.form.team", + "start": { + "column": 8, + "line": 48 + } + }, + { + "defaultMessage": "!!!Custom server", + "end": { + "column": 3, + "line": 55 + }, + "file": "src/containers/settings/EditServiceScreen.js", + "id": "settings.service.form.customUrl", + "start": { + "column": 13, + "line": 52 + } + }, + { + "defaultMessage": "!!!Show message badge for all new messages", + "end": { + "column": 3, + "line": 59 + }, + "file": "src/containers/settings/EditServiceScreen.js", + "id": "settings.service.form.indirectMessages", + "start": { + "column": 20, + "line": 56 + } + }, + { + "defaultMessage": "!!!Custom icon", + "end": { + "column": 3, + "line": 63 + }, + "file": "src/containers/settings/EditServiceScreen.js", + "id": "settings.service.form.icon", + "start": { + "column": 8, + "line": 60 + } + }, + { + "defaultMessage": "!!!Enable Dark Mode", + "end": { + "column": 3, + "line": 67 + }, + "file": "src/containers/settings/EditServiceScreen.js", + "id": "settings.service.form.enableDarkMode", + "start": { + "column": 18, + "line": 64 + } + }, + { + "defaultMessage": "!!!Use Proxy", + "end": { + "column": 3, + "line": 71 + }, + "file": "src/containers/settings/EditServiceScreen.js", + "id": "settings.service.form.proxy.isEnabled", + "start": { + "column": 15, + "line": 68 + } + }, + { + "defaultMessage": "!!!Proxy Host/IP", + "end": { + "column": 3, + "line": 75 + }, + "file": "src/containers/settings/EditServiceScreen.js", + "id": "settings.service.form.proxy.host", + "start": { + "column": 13, + "line": 72 + } + }, + { + "defaultMessage": "!!!Port", + "end": { + "column": 3, + "line": 79 + }, + "file": "src/containers/settings/EditServiceScreen.js", + "id": "settings.service.form.proxy.port", + "start": { + "column": 13, + "line": 76 + } + }, + { + "defaultMessage": "!!!User", + "end": { + "column": 3, + "line": 83 + }, + "file": "src/containers/settings/EditServiceScreen.js", + "id": "settings.service.form.proxy.user", + "start": { + "column": 13, + "line": 80 + } + }, + { + "defaultMessage": "!!!Password", + "end": { + "column": 3, + "line": 87 + }, + "file": "src/containers/settings/EditServiceScreen.js", + "id": "settings.service.form.proxy.password", + "start": { + "column": 17, + "line": 84 + } + } + ], + "path": "src/containers/settings/EditServiceScreen.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Launch Franz on start", + "end": { + "column": 3, + "line": 25 + }, + "file": "src/containers/settings/EditSettingsScreen.js", + "id": "settings.app.form.autoLaunchOnStart", + "start": { + "column": 21, + "line": 22 + } + }, + { + "defaultMessage": "!!!Open in background", + "end": { + "column": 3, + "line": 29 + }, + "file": "src/containers/settings/EditSettingsScreen.js", + "id": "settings.app.form.autoLaunchInBackground", + "start": { + "column": 26, + "line": 26 + } + }, + { + "defaultMessage": "!!!Keep Franz in background when closing the window", + "end": { + "column": 3, + "line": 33 + }, + "file": "src/containers/settings/EditSettingsScreen.js", + "id": "settings.app.form.runInBackground", + "start": { + "column": 19, + "line": 30 + } + }, + { + "defaultMessage": "!!!Show Franz in system tray", + "end": { + "column": 3, + "line": 37 + }, + "file": "src/containers/settings/EditSettingsScreen.js", + "id": "settings.app.form.enableSystemTray", + "start": { + "column": 20, + "line": 34 + } + }, + { + "defaultMessage": "!!!Minimize Franz to system tray", + "end": { + "column": 3, + "line": 41 + }, + "file": "src/containers/settings/EditSettingsScreen.js", + "id": "settings.app.form.minimizeToSystemTray", + "start": { + "column": 24, + "line": 38 + } + }, + { + "defaultMessage": "!!!Language", + "end": { + "column": 3, + "line": 45 + }, + "file": "src/containers/settings/EditSettingsScreen.js", + "id": "settings.app.form.language", + "start": { + "column": 12, + "line": 42 + } + }, + { + "defaultMessage": "!!!Dark Mode", + "end": { + "column": 3, + "line": 49 + }, + "file": "src/containers/settings/EditSettingsScreen.js", + "id": "settings.app.form.darkMode", + "start": { + "column": 12, + "line": 46 + } + }, + { + "defaultMessage": "!!!Display disabled services tabs", + "end": { + "column": 3, + "line": 53 + }, + "file": "src/containers/settings/EditSettingsScreen.js", + "id": "settings.app.form.showDisabledServices", + "start": { + "column": 24, + "line": 50 + } + }, + { + "defaultMessage": "!!!Show unread message badge when notifications are disabled", + "end": { + "column": 3, + "line": 57 + }, + "file": "src/containers/settings/EditSettingsScreen.js", + "id": "settings.app.form.showMessagesBadgesWhenMuted", + "start": { + "column": 29, + "line": 54 + } + }, + { + "defaultMessage": "!!!Enable spell checking", + "end": { + "column": 3, + "line": 61 + }, + "file": "src/containers/settings/EditSettingsScreen.js", + "id": "settings.app.form.enableSpellchecking", + "start": { + "column": 23, + "line": 58 + } + }, + { + "defaultMessage": "!!!Enable GPU Acceleration", + "end": { + "column": 3, + "line": 65 + }, + "file": "src/containers/settings/EditSettingsScreen.js", + "id": "settings.app.form.enableGPUAcceleration", + "start": { + "column": 25, + "line": 62 + } + }, + { + "defaultMessage": "!!!Include beta versions", + "end": { + "column": 3, + "line": 69 + }, + "file": "src/containers/settings/EditSettingsScreen.js", + "id": "settings.app.form.beta", + "start": { + "column": 8, + "line": 66 + } + } + ], + "path": "src/containers/settings/EditSettingsScreen.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Firstname", + "end": { + "column": 3, + "line": 17 + }, + "file": "src/containers/settings/EditUserScreen.js", + "id": "settings.user.form.firstname", + "start": { + "column": 13, + "line": 14 + } + }, + { + "defaultMessage": "!!!Lastname", + "end": { + "column": 3, + "line": 21 + }, + "file": "src/containers/settings/EditUserScreen.js", + "id": "settings.user.form.lastname", + "start": { + "column": 12, + "line": 18 + } + }, + { + "defaultMessage": "!!!Email", + "end": { + "column": 3, + "line": 25 + }, + "file": "src/containers/settings/EditUserScreen.js", + "id": "settings.user.form.email", + "start": { + "column": 9, + "line": 22 + } + }, + { + "defaultMessage": "!!!Account type", + "end": { + "column": 3, + "line": 29 + }, + "file": "src/containers/settings/EditUserScreen.js", + "id": "settings.user.form.accountType.label", + "start": { + "column": 20, + "line": 26 + } + }, + { + "defaultMessage": "!!!Individual", + "end": { + "column": 3, + "line": 33 + }, + "file": "src/containers/settings/EditUserScreen.js", + "id": "settings.user.form.accountType.individual", + "start": { + "column": 25, + "line": 30 + } + }, + { + "defaultMessage": "!!!Non-Profit", + "end": { + "column": 3, + "line": 37 + }, + "file": "src/containers/settings/EditUserScreen.js", + "id": "settings.user.form.accountType.non-profit", + "start": { + "column": 24, + "line": 34 + } + }, + { + "defaultMessage": "!!!Company", + "end": { + "column": 3, + "line": 41 + }, + "file": "src/containers/settings/EditUserScreen.js", + "id": "settings.user.form.accountType.company", + "start": { + "column": 22, + "line": 38 + } + }, + { + "defaultMessage": "!!!Current password", + "end": { + "column": 3, + "line": 45 + }, + "file": "src/containers/settings/EditUserScreen.js", + "id": "settings.user.form.currentPassword", + "start": { + "column": 19, + "line": 42 + } + }, + { + "defaultMessage": "!!!New password", + "end": { + "column": 3, + "line": 49 + }, + "file": "src/containers/settings/EditUserScreen.js", + "id": "settings.user.form.newPassword", + "start": { + "column": 15, + "line": 46 + } + } + ], + "path": "src/containers/settings/EditUserScreen.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Changes in Franz {version}", + "end": { + "column": 3, + "line": 23 + }, + "file": "src/features/announcements/components/AnnouncementScreen.js", + "id": "feature.announcements.changelog.headline", + "start": { + "column": 12, + "line": 20 + } + } + ], + "path": "src/features/announcements/components/AnnouncementScreen.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Please purchase license to skip waiting", + "end": { + "column": 3, + "line": 18 + }, + "file": "src/features/delayApp/Component.js", + "id": "feature.delayApp.headline", + "start": { + "column": 12, + "line": 15 + } + }, + { + "defaultMessage": "!!!Get a Franz Supporter License", + "end": { + "column": 3, + "line": 22 + }, + "file": "src/features/delayApp/Component.js", + "id": "feature.delayApp.action", + "start": { + "column": 10, + "line": 19 + } + }, + { + "defaultMessage": "!!!Franz will continue in {seconds} seconds.", + "end": { + "column": 3, + "line": 26 + }, + "file": "src/features/delayApp/Component.js", + "id": "feature.delayApp.text", + "start": { + "column": 8, + "line": 23 + } + } + ], + "path": "src/features/delayApp/Component.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Franz is better together!", + "end": { + "column": 3, + "line": 18 + }, + "file": "src/features/shareFranz/Component.js", + "id": "feature.shareFranz.headline", + "start": { + "column": 12, + "line": 15 + } + }, + { + "defaultMessage": "!!!Tell your friends and colleagues how awesome Franz is and help us to spread the word.", + "end": { + "column": 3, + "line": 22 + }, + "file": "src/features/shareFranz/Component.js", + "id": "feature.shareFranz.text", + "start": { + "column": 8, + "line": 19 + } + }, + { + "defaultMessage": "!!!Share as email", + "end": { + "column": 3, + "line": 26 + }, + "file": "src/features/shareFranz/Component.js", + "id": "feature.shareFranz.action.email", + "start": { + "column": 16, + "line": 23 + } + }, + { + "defaultMessage": "!!!Share on Facebook", + "end": { + "column": 3, + "line": 30 + }, + "file": "src/features/shareFranz/Component.js", + "id": "feature.shareFranz.action.facebook", + "start": { + "column": 19, + "line": 27 + } + }, + { + "defaultMessage": "!!!Share on Twitter", + "end": { + "column": 3, + "line": 34 + }, + "file": "src/features/shareFranz/Component.js", + "id": "feature.shareFranz.action.twitter", + "start": { + "column": 18, + "line": 31 + } + }, + { + "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com", + "end": { + "column": 3, + "line": 38 + }, + "file": "src/features/shareFranz/Component.js", + "id": "feature.shareFranz.shareText.email", + "start": { + "column": 18, + "line": 35 + } + }, + { + "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger", + "end": { + "column": 3, + "line": 42 + }, + "file": "src/features/shareFranz/Component.js", + "id": "feature.shareFranz.shareText.twitter", + "start": { + "column": 20, + "line": 39 + } + } + ], + "path": "src/features/shareFranz/Component.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Create workspace", + "end": { + "column": 3, + "line": 16 + }, + "file": "src/features/workspaces/components/CreateWorkspaceForm.js", + "id": "settings.workspace.add.form.submitButton", + "start": { + "column": 16, + "line": 13 + } + }, + { + "defaultMessage": "!!!Name", + "end": { + "column": 3, + "line": 20 + }, + "file": "src/features/workspaces/components/CreateWorkspaceForm.js", + "id": "settings.workspace.add.form.name", + "start": { + "column": 8, + "line": 17 + } + } + ], + "path": "src/features/workspaces/components/CreateWorkspaceForm.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Delete workspace", + "end": { + "column": 3, + "line": 22 + }, + "file": "src/features/workspaces/components/EditWorkspaceForm.js", + "id": "settings.workspace.form.buttonDelete", + "start": { + "column": 16, + "line": 19 + } + }, + { + "defaultMessage": "!!!Save workspace", + "end": { + "column": 3, + "line": 26 + }, + "file": "src/features/workspaces/components/EditWorkspaceForm.js", + "id": "settings.workspace.form.buttonSave", + "start": { + "column": 14, + "line": 23 + } + }, + { + "defaultMessage": "!!!Name", + "end": { + "column": 3, + "line": 30 + }, + "file": "src/features/workspaces/components/EditWorkspaceForm.js", + "id": "settings.workspace.form.name", + "start": { + "column": 8, + "line": 27 + } + }, + { + "defaultMessage": "!!!Your workspaces", + "end": { + "column": 3, + "line": 34 + }, + "file": "src/features/workspaces/components/EditWorkspaceForm.js", + "id": "settings.workspace.form.yourWorkspaces", + "start": { + "column": 18, + "line": 31 + } + }, + { + "defaultMessage": "!!!Services in this Workspace", + "end": { + "column": 3, + "line": 38 + }, + "file": "src/features/workspaces/components/EditWorkspaceForm.js", + "id": "settings.workspace.form.servicesInWorkspaceHeadline", + "start": { + "column": 31, + "line": 35 + } + } + ], + "path": "src/features/workspaces/components/EditWorkspaceForm.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Workspaces", + "end": { + "column": 3, + "line": 19 + }, + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "id": "workspaceDrawer.headline", + "start": { + "column": 12, + "line": 16 + } + }, + { + "defaultMessage": "!!!All services", + "end": { + "column": 3, + "line": 23 + }, + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "id": "workspaceDrawer.allServices", + "start": { + "column": 15, + "line": 20 + } + }, + { + "defaultMessage": "!!!Workspaces settings", + "end": { + "column": 3, + "line": 27 + }, + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "id": "workspaceDrawer.workspacesSettingsTooltip", + "start": { + "column": 29, + "line": 24 + } + }, + { + "defaultMessage": "!!!Info about workspace feature", + "end": { + "column": 3, + "line": 31 + }, + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "id": "workspaceDrawer.workspaceFeatureInfo", + "start": { + "column": 24, + "line": 28 + } + }, + { + "defaultMessage": "!!!Create your first workspace", + "end": { + "column": 3, + "line": 35 + }, + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "id": "workspaceDrawer.premiumCtaButtonLabel", + "start": { + "column": 25, + "line": 32 + } + }, + { + "defaultMessage": "!!!Reactivate premium account", + "end": { + "column": 3, + "line": 39 + }, + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "id": "workspaceDrawer.reactivatePremiumAccountLabel", + "start": { + "column": 28, + "line": 36 + } + }, + { + "defaultMessage": "!!!add new workspace", + "end": { + "column": 3, + "line": 43 + }, + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "id": "workspaceDrawer.addNewWorkspaceLabel", + "start": { + "column": 24, + "line": 40 + } + }, + { + "defaultMessage": "!!!Premium feature", + "end": { + "column": 3, + "line": 47 + }, + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "id": "workspaceDrawer.proFeatureBadge", + "start": { + "column": 23, + "line": 44 + } + } + ], + "path": "src/features/workspaces/components/WorkspaceDrawer.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!No services added yet", + "end": { + "column": 3, + "line": 15 + }, + "file": "src/features/workspaces/components/WorkspaceDrawerItem.js", + "id": "workspaceDrawer.item.noServicesAddedYet", + "start": { + "column": 22, + "line": 12 + } + }, + { + "defaultMessage": "!!!edit", + "end": { + "column": 3, + "line": 19 + }, + "file": "src/features/workspaces/components/WorkspaceDrawerItem.js", + "id": "workspaceDrawer.item.contextMenuEdit", + "start": { + "column": 19, + "line": 16 + } + } + ], + "path": "src/features/workspaces/components/WorkspaceDrawerItem.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Your workspaces", + "end": { + "column": 3, + "line": 20 + }, + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "id": "settings.workspaces.headline", + "start": { + "column": 12, + "line": 17 + } + }, + { + "defaultMessage": "!!!You haven't added any workspaces yet.", + "end": { + "column": 3, + "line": 24 + }, + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "id": "settings.workspaces.noWorkspacesAdded", + "start": { + "column": 19, + "line": 21 + } + }, + { + "defaultMessage": "!!!Could not load your workspaces", + "end": { + "column": 3, + "line": 28 + }, + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "id": "settings.workspaces.workspacesRequestFailed", + "start": { + "column": 27, + "line": 25 + } + }, + { + "defaultMessage": "!!!Try again", + "end": { + "column": 3, + "line": 32 + }, + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "id": "settings.workspaces.tryReloadWorkspaces", + "start": { + "column": 23, + "line": 29 + } + }, + { + "defaultMessage": "!!!Your changes have been saved", + "end": { + "column": 3, + "line": 36 + }, + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "id": "settings.workspaces.updatedInfo", + "start": { + "column": 15, + "line": 33 + } + }, + { + "defaultMessage": "!!!Workspace has been deleted", + "end": { + "column": 3, + "line": 40 + }, + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "id": "settings.workspaces.deletedInfo", + "start": { + "column": 15, + "line": 37 + } + }, + { + "defaultMessage": "!!!Info about workspace feature", + "end": { + "column": 3, + "line": 44 + }, + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "id": "settings.workspaces.workspaceFeatureInfo", + "start": { + "column": 24, + "line": 41 + } + }, + { + "defaultMessage": "!!!Less is More: Introducing Franz Workspaces", + "end": { + "column": 3, + "line": 48 + }, + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "id": "settings.workspaces.workspaceFeatureHeadline", + "start": { + "column": 28, + "line": 45 + } + } + ], + "path": "src/features/workspaces/components/WorkspacesDashboard.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Switching to", + "end": { + "column": 3, + "line": 15 + }, + "file": "src/features/workspaces/components/WorkspaceSwitchingIndicator.js", + "id": "workspaces.switchingIndicator.switchingTo", + "start": { + "column": 15, + "line": 12 + } + } + ], + "path": "src/features/workspaces/components/WorkspaceSwitchingIndicator.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Field is required", + "end": { + "column": 3, + "line": 7 + }, + "file": "src/helpers/validation-helpers.js", + "id": "validation.required", + "start": { + "column": 12, + "line": 4 + } + }, + { + "defaultMessage": "!!!Email not valid", + "end": { + "column": 3, + "line": 11 + }, + "file": "src/helpers/validation-helpers.js", + "id": "validation.email", + "start": { + "column": 9, + "line": 8 + } + }, + { + "defaultMessage": "!!!Not a valid URL", + "end": { + "column": 3, + "line": 15 + }, + "file": "src/helpers/validation-helpers.js", + "id": "validation.url", + "start": { + "column": 7, + "line": 12 + } + }, + { + "defaultMessage": "!!!Too few characters", + "end": { + "column": 3, + "line": 19 + }, + "file": "src/helpers/validation-helpers.js", + "id": "validation.minLength", + "start": { + "column": 13, + "line": 16 + } + }, + { + "defaultMessage": "!!!At least one is required", + "end": { + "column": 3, + "line": 23 + }, + "file": "src/helpers/validation-helpers.js", + "id": "validation.oneRequired", + "start": { + "column": 15, + "line": 20 + } + } + ], + "path": "src/helpers/validation-helpers.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Can't connect to Franz Online Services", + "end": { + "column": 3, + "line": 7 + }, + "file": "src/i18n/globalMessages.js", + "id": "global.api.unhealthy", + "start": { + "column": 16, + "line": 4 + } + }, + { + "defaultMessage": "!!!You are not connected to the internet.", + "end": { + "column": 3, + "line": 11 + }, + "file": "src/i18n/globalMessages.js", + "id": "global.notConnectedToTheInternet", + "start": { + "column": 29, + "line": 8 + } + }, + { + "defaultMessage": "!!!Spell checking language", + "end": { + "column": 3, + "line": 15 + }, + "file": "src/i18n/globalMessages.js", + "id": "global.spellchecking.language", + "start": { + "column": 24, + "line": 12 + } + }, + { + "defaultMessage": "!!!Use System Default ({default})", + "end": { + "column": 3, + "line": 19 + }, + "file": "src/i18n/globalMessages.js", + "id": "global.spellchecker.useDefault", + "start": { + "column": 29, + "line": 16 + } + }, + { + "defaultMessage": "!!!Detect language automatically", + "end": { + "column": 3, + "line": 23 + }, + "file": "src/i18n/globalMessages.js", + "id": "global.spellchecking.autodetect", + "start": { + "column": 34, + "line": 20 + } + }, + { + "defaultMessage": "!!!Automatic", + "end": { + "column": 3, + "line": 27 + }, + "file": "src/i18n/globalMessages.js", + "id": "global.spellchecking.autodetect.short", + "start": { + "column": 39, + "line": 24 + } + } + ], + "path": "src/i18n/globalMessages.json" + }, + { + "descriptors": [ + { + "defaultMessage": "!!!Edit", + "end": { + "column": 3, + "line": 17 + }, + "file": "src/lib/Menu.js", + "id": "menu.edit", + "start": { + "column": 8, + "line": 14 + } + }, + { + "defaultMessage": "!!!Undo", + "end": { + "column": 3, + "line": 21 + }, + "file": "src/lib/Menu.js", + "id": "menu.edit.undo", + "start": { + "column": 8, + "line": 18 + } + }, + { + "defaultMessage": "!!!Redo", + "end": { + "column": 3, + "line": 25 + }, + "file": "src/lib/Menu.js", + "id": "menu.edit.redo", + "start": { + "column": 8, + "line": 22 + } + }, + { + "defaultMessage": "!!!Cut", + "end": { + "column": 3, + "line": 29 + }, + "file": "src/lib/Menu.js", + "id": "menu.edit.cut", + "start": { + "column": 7, + "line": 26 + } + }, + { + "defaultMessage": "!!!Copy", + "end": { + "column": 3, + "line": 33 + }, + "file": "src/lib/Menu.js", + "id": "menu.edit.copy", + "start": { + "column": 8, + "line": 30 + } + }, + { + "defaultMessage": "!!!Paste", + "end": { + "column": 3, + "line": 37 + }, + "file": "src/lib/Menu.js", + "id": "menu.edit.paste", + "start": { + "column": 9, + "line": 34 + } + }, + { + "defaultMessage": "!!!Paste And Match Style", + "end": { + "column": 3, + "line": 41 + }, + "file": "src/lib/Menu.js", + "id": "menu.edit.pasteAndMatchStyle", + "start": { + "column": 22, + "line": 38 + } + }, + { + "defaultMessage": "!!!Delete", + "end": { + "column": 3, + "line": 45 + }, + "file": "src/lib/Menu.js", + "id": "menu.edit.delete", + "start": { + "column": 10, + "line": 42 + } + }, + { + "defaultMessage": "!!!Select All", + "end": { + "column": 3, + "line": 49 + }, + "file": "src/lib/Menu.js", + "id": "menu.edit.selectAll", + "start": { + "column": 13, + "line": 46 + } + }, + { + "defaultMessage": "!!!Speech", + "end": { + "column": 3, + "line": 53 + }, + "file": "src/lib/Menu.js", + "id": "menu.edit.speech", + "start": { + "column": 10, + "line": 50 + } + }, + { + "defaultMessage": "!!!Start Speaking", + "end": { + "column": 3, + "line": 57 + }, + "file": "src/lib/Menu.js", + "id": "menu.edit.startSpeaking", + "start": { + "column": 17, + "line": 54 + } + }, + { + "defaultMessage": "!!!Stop Speaking", + "end": { + "column": 3, + "line": 61 + }, + "file": "src/lib/Menu.js", + "id": "menu.edit.stopSpeaking", + "start": { + "column": 16, + "line": 58 + } + }, + { + "defaultMessage": "!!!Start Dictation", + "end": { + "column": 3, + "line": 65 + }, + "file": "src/lib/Menu.js", + "id": "menu.edit.startDictation", + "start": { + "column": 18, + "line": 62 + } + }, + { + "defaultMessage": "!!!Emoji & Symbols", + "end": { + "column": 3, + "line": 69 + }, + "file": "src/lib/Menu.js", + "id": "menu.edit.emojiSymbols", + "start": { + "column": 16, + "line": 66 + } + }, + { + "defaultMessage": "!!!Actual Size", + "end": { + "column": 3, + "line": 73 + }, + "file": "src/lib/Menu.js", + "id": "menu.view.resetZoom", + "start": { + "column": 13, + "line": 70 + } + }, + { + "defaultMessage": "!!!Zoom In", + "end": { + "column": 3, + "line": 77 + }, + "file": "src/lib/Menu.js", + "id": "menu.view.zoomIn", + "start": { + "column": 10, + "line": 74 + } + }, + { + "defaultMessage": "!!!Zoom Out", + "end": { + "column": 3, + "line": 81 + }, + "file": "src/lib/Menu.js", + "id": "menu.view.zoomOut", + "start": { + "column": 11, + "line": 78 + } + }, + { + "defaultMessage": "!!!Enter Full Screen", + "end": { + "column": 3, + "line": 85 + }, + "file": "src/lib/Menu.js", + "id": "menu.view.enterFullScreen", + "start": { + "column": 19, + "line": 82 + } + }, + { + "defaultMessage": "!!!Exit Full Screen", + "end": { + "column": 3, + "line": 89 + }, + "file": "src/lib/Menu.js", + "id": "menu.view.exitFullScreen", + "start": { + "column": 18, + "line": 86 + } + }, + { + "defaultMessage": "!!!Toggle Full Screen", + "end": { + "column": 3, + "line": 93 + }, + "file": "src/lib/Menu.js", + "id": "menu.view.toggleFullScreen", + "start": { + "column": 20, + "line": 90 + } + }, + { + "defaultMessage": "!!!Toggle Developer Tools", + "end": { + "column": 3, + "line": 97 + }, + "file": "src/lib/Menu.js", + "id": "menu.view.toggleDevTools", + "start": { + "column": 18, + "line": 94 + } + }, + { + "defaultMessage": "!!!Toggle Service Developer Tools", + "end": { + "column": 3, + "line": 101 + }, + "file": "src/lib/Menu.js", + "id": "menu.view.toggleServiceDevTools", + "start": { + "column": 25, + "line": 98 + } + }, + { + "defaultMessage": "!!!Reload Service", + "end": { + "column": 3, + "line": 105 + }, + "file": "src/lib/Menu.js", + "id": "menu.view.reloadService", + "start": { + "column": 17, + "line": 102 + } + }, + { + "defaultMessage": "!!!Reload Franz", + "end": { + "column": 3, + "line": 109 + }, + "file": "src/lib/Menu.js", + "id": "menu.view.reloadFranz", + "start": { + "column": 15, + "line": 106 + } + }, + { + "defaultMessage": "!!!Minimize", + "end": { + "column": 3, + "line": 113 + }, + "file": "src/lib/Menu.js", + "id": "menu.window.minimize", + "start": { + "column": 12, + "line": 110 + } + }, + { + "defaultMessage": "!!!Close", + "end": { + "column": 3, + "line": 117 + }, + "file": "src/lib/Menu.js", + "id": "menu.window.close", + "start": { + "column": 9, + "line": 114 + } + }, + { + "defaultMessage": "!!!Learn More", + "end": { + "column": 3, + "line": 121 + }, + "file": "src/lib/Menu.js", + "id": "menu.help.learnMore", + "start": { + "column": 13, + "line": 118 + } + }, + { + "defaultMessage": "!!!Changelog", + "end": { + "column": 3, + "line": 125 + }, + "file": "src/lib/Menu.js", + "id": "menu.help.changelog", + "start": { + "column": 13, + "line": 122 + } + }, + { + "defaultMessage": "!!!Support", + "end": { + "column": 3, + "line": 129 + }, + "file": "src/lib/Menu.js", + "id": "menu.help.support", + "start": { + "column": 11, + "line": 126 + } + }, + { + "defaultMessage": "!!!Terms of Service", + "end": { + "column": 3, + "line": 133 + }, + "file": "src/lib/Menu.js", + "id": "menu.help.tos", + "start": { + "column": 7, + "line": 130 + } + }, + { + "defaultMessage": "!!!Privacy Statement", + "end": { + "column": 3, + "line": 137 + }, + "file": "src/lib/Menu.js", + "id": "menu.help.privacy", + "start": { + "column": 11, + "line": 134 + } + }, + { + "defaultMessage": "!!!File", + "end": { + "column": 3, + "line": 141 + }, + "file": "src/lib/Menu.js", + "id": "menu.file", + "start": { + "column": 8, + "line": 138 + } + }, + { + "defaultMessage": "!!!View", + "end": { + "column": 3, + "line": 145 + }, + "file": "src/lib/Menu.js", + "id": "menu.view", + "start": { + "column": 8, + "line": 142 + } + }, + { + "defaultMessage": "!!!Services", + "end": { + "column": 3, + "line": 149 + }, + "file": "src/lib/Menu.js", + "id": "menu.services", + "start": { + "column": 12, + "line": 146 + } + }, + { + "defaultMessage": "!!!Window", + "end": { + "column": 3, + "line": 153 + }, + "file": "src/lib/Menu.js", + "id": "menu.window", + "start": { + "column": 10, + "line": 150 + } + }, + { + "defaultMessage": "!!!Help", + "end": { + "column": 3, + "line": 157 + }, + "file": "src/lib/Menu.js", + "id": "menu.help", + "start": { + "column": 8, + "line": 154 + } + }, + { + "defaultMessage": "!!!About Franz", + "end": { + "column": 3, + "line": 161 + }, + "file": "src/lib/Menu.js", + "id": "menu.app.about", + "start": { + "column": 9, + "line": 158 + } + }, + { + "defaultMessage": "!!!What's new?", + "end": { + "column": 3, + "line": 165 + }, + "file": "src/lib/Menu.js", + "id": "menu.app.announcement", + "start": { + "column": 16, + "line": 162 + } + }, + { + "defaultMessage": "!!!Settings", + "end": { + "column": 3, + "line": 169 + }, + "file": "src/lib/Menu.js", + "id": "menu.app.settings", + "start": { + "column": 12, + "line": 166 + } + }, + { + "defaultMessage": "!!!Hide", + "end": { + "column": 3, + "line": 173 + }, + "file": "src/lib/Menu.js", + "id": "menu.app.hide", + "start": { + "column": 8, + "line": 170 + } + }, + { + "defaultMessage": "!!!Hide Others", + "end": { + "column": 3, + "line": 177 + }, + "file": "src/lib/Menu.js", + "id": "menu.app.hideOthers", + "start": { + "column": 14, + "line": 174 + } + }, + { + "defaultMessage": "!!!Unhide", + "end": { + "column": 3, + "line": 181 + }, + "file": "src/lib/Menu.js", + "id": "menu.app.unhide", + "start": { + "column": 10, + "line": 178 + } + }, + { + "defaultMessage": "!!!Quit", + "end": { + "column": 3, + "line": 185 + }, + "file": "src/lib/Menu.js", + "id": "menu.app.quit", + "start": { + "column": 8, + "line": 182 + } + }, + { + "defaultMessage": "!!!Add New Service...", + "end": { + "column": 3, + "line": 189 + }, + "file": "src/lib/Menu.js", + "id": "menu.services.addNewService", + "start": { + "column": 17, + "line": 186 + } + }, + { + "defaultMessage": "!!!Add New Workspace...", + "end": { + "column": 3, + "line": 193 + }, + "file": "src/lib/Menu.js", + "id": "menu.workspaces.addNewWorkspace", + "start": { + "column": 19, + "line": 190 + } + }, + { + "defaultMessage": "!!!Open workspace drawer", + "end": { + "column": 3, + "line": 197 + }, + "file": "src/lib/Menu.js", + "id": "menu.workspaces.openWorkspaceDrawer", + "start": { + "column": 23, + "line": 194 + } + }, + { + "defaultMessage": "!!!Close workspace drawer", + "end": { + "column": 3, + "line": 201 + }, + "file": "src/lib/Menu.js", + "id": "menu.workspaces.closeWorkspaceDrawer", + "start": { + "column": 24, + "line": 198 + } + }, + { + "defaultMessage": "!!!Activate next service...", + "end": { + "column": 3, + "line": 205 + }, + "file": "src/lib/Menu.js", + "id": "menu.services.setNextServiceActive", + "start": { + "column": 23, + "line": 202 + } + }, + { + "defaultMessage": "!!!Activate previous service...", + "end": { + "column": 3, + "line": 209 + }, + "file": "src/lib/Menu.js", + "id": "menu.services.activatePreviousService", + "start": { + "column": 27, + "line": 206 + } + }, + { + "defaultMessage": "!!!Disable notifications & audio", + "end": { + "column": 3, + "line": 213 + }, + "file": "src/lib/Menu.js", + "id": "sidebar.muteApp", + "start": { + "column": 11, + "line": 210 + } + }, + { + "defaultMessage": "!!!Enable notifications & audio", + "end": { + "column": 3, + "line": 217 + }, + "file": "src/lib/Menu.js", + "id": "sidebar.unmuteApp", + "start": { + "column": 13, + "line": 214 + } + }, + { + "defaultMessage": "!!!Workspaces", + "end": { + "column": 3, + "line": 221 + }, + "file": "src/lib/Menu.js", + "id": "menu.workspaces", + "start": { + "column": 14, + "line": 218 + } + }, + { + "defaultMessage": "!!!Default", + "end": { + "column": 3, + "line": 225 + }, + "file": "src/lib/Menu.js", + "id": "menu.workspaces.defaultWorkspace", + "start": { + "column": 20, + "line": 222 + } + } + ], + "path": "src/lib/Menu.json" + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/auth/Import.json b/src/i18n/messages/src/components/auth/Import.json new file mode 100644 index 000000000..264fc729b --- /dev/null +++ b/src/i18n/messages/src/components/auth/Import.json @@ -0,0 +1,54 @@ +[ + { + "id": "import.headline", + "defaultMessage": "!!!Import your Franz 4 services", + "file": "src/components/auth/Import.js", + "start": { + "line": 13, + "column": 12 + }, + "end": { + "line": 16, + "column": 3 + } + }, + { + "id": "import.notSupportedHeadline", + "defaultMessage": "!!!Services not yet supported in Franz 5", + "file": "src/components/auth/Import.js", + "start": { + "line": 17, + "column": 24 + }, + "end": { + "line": 20, + "column": 3 + } + }, + { + "id": "import.submit.label", + "defaultMessage": "!!!Import {count} services", + "file": "src/components/auth/Import.js", + "start": { + "line": 21, + "column": 21 + }, + "end": { + "line": 24, + "column": 3 + } + }, + { + "id": "import.skip.label", + "defaultMessage": "!!!I want to add services manually", + "file": "src/components/auth/Import.js", + "start": { + "line": 25, + "column": 19 + }, + "end": { + "line": 28, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/auth/Invite.json b/src/i18n/messages/src/components/auth/Invite.json new file mode 100644 index 000000000..57c9bddcf --- /dev/null +++ b/src/i18n/messages/src/components/auth/Invite.json @@ -0,0 +1,93 @@ +[ + { + "id": "settings.invite.headline", + "defaultMessage": "!!!Invite Friends", + "file": "src/components/auth/Invite.js", + "start": { + "line": 16, + "column": 20 + }, + "end": { + "line": 19, + "column": 3 + } + }, + { + "id": "invite.headline.friends", + "defaultMessage": "!!!Invite 3 of your friends or colleagues", + "file": "src/components/auth/Invite.js", + "start": { + "line": 20, + "column": 12 + }, + "end": { + "line": 23, + "column": 3 + } + }, + { + "id": "invite.name.label", + "defaultMessage": "!!!Name", + "file": "src/components/auth/Invite.js", + "start": { + "line": 24, + "column": 13 + }, + "end": { + "line": 27, + "column": 3 + } + }, + { + "id": "invite.email.label", + "defaultMessage": "!!!Email address", + "file": "src/components/auth/Invite.js", + "start": { + "line": 28, + "column": 14 + }, + "end": { + "line": 31, + "column": 3 + } + }, + { + "id": "invite.submit.label", + "defaultMessage": "!!!Send invites", + "file": "src/components/auth/Invite.js", + "start": { + "line": 32, + "column": 21 + }, + "end": { + "line": 35, + "column": 3 + } + }, + { + "id": "invite.skip.label", + "defaultMessage": "!!!I want to do this later", + "file": "src/components/auth/Invite.js", + "start": { + "line": 36, + "column": 19 + }, + "end": { + "line": 39, + "column": 3 + } + }, + { + "id": "invite.successInfo", + "defaultMessage": "!!!Invitations sent successfully", + "file": "src/components/auth/Invite.js", + "start": { + "line": 40, + "column": 21 + }, + "end": { + "line": 43, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/auth/Login.json b/src/i18n/messages/src/components/auth/Login.json new file mode 100644 index 000000000..177f6000b --- /dev/null +++ b/src/i18n/messages/src/components/auth/Login.json @@ -0,0 +1,119 @@ +[ + { + "id": "login.headline", + "defaultMessage": "!!!Sign in", + "file": "src/components/auth/Login.js", + "start": { + "line": 17, + "column": 12 + }, + "end": { + "line": 20, + "column": 3 + } + }, + { + "id": "login.email.label", + "defaultMessage": "!!!Email address", + "file": "src/components/auth/Login.js", + "start": { + "line": 21, + "column": 14 + }, + "end": { + "line": 24, + "column": 3 + } + }, + { + "id": "login.password.label", + "defaultMessage": "!!!Password", + "file": "src/components/auth/Login.js", + "start": { + "line": 25, + "column": 17 + }, + "end": { + "line": 28, + "column": 3 + } + }, + { + "id": "login.submit.label", + "defaultMessage": "!!!Sign in", + "file": "src/components/auth/Login.js", + "start": { + "line": 29, + "column": 21 + }, + "end": { + "line": 32, + "column": 3 + } + }, + { + "id": "login.invalidCredentials", + "defaultMessage": "!!!Email or password not valid", + "file": "src/components/auth/Login.js", + "start": { + "line": 33, + "column": 22 + }, + "end": { + "line": 36, + "column": 3 + } + }, + { + "id": "login.tokenExpired", + "defaultMessage": "!!!Your session expired, please login again.", + "file": "src/components/auth/Login.js", + "start": { + "line": 37, + "column": 16 + }, + "end": { + "line": 40, + "column": 3 + } + }, + { + "id": "login.serverLogout", + "defaultMessage": "!!!Your session expired, please login again.", + "file": "src/components/auth/Login.js", + "start": { + "line": 41, + "column": 16 + }, + "end": { + "line": 44, + "column": 3 + } + }, + { + "id": "login.link.signup", + "defaultMessage": "!!!Create a free account", + "file": "src/components/auth/Login.js", + "start": { + "line": 45, + "column": 14 + }, + "end": { + "line": 48, + "column": 3 + } + }, + { + "id": "login.link.password", + "defaultMessage": "!!!Forgot password", + "file": "src/components/auth/Login.js", + "start": { + "line": 49, + "column": 16 + }, + "end": { + "line": 52, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/auth/Password.json b/src/i18n/messages/src/components/auth/Password.json new file mode 100644 index 000000000..f335b3acb --- /dev/null +++ b/src/i18n/messages/src/components/auth/Password.json @@ -0,0 +1,93 @@ +[ + { + "id": "password.headline", + "defaultMessage": "!!!Forgot password", + "file": "src/components/auth/Password.js", + "start": { + "line": 14, + "column": 12 + }, + "end": { + "line": 17, + "column": 3 + } + }, + { + "id": "password.email.label", + "defaultMessage": "!!!Email address", + "file": "src/components/auth/Password.js", + "start": { + "line": 18, + "column": 14 + }, + "end": { + "line": 21, + "column": 3 + } + }, + { + "id": "password.submit.label", + "defaultMessage": "!!!Submit", + "file": "src/components/auth/Password.js", + "start": { + "line": 22, + "column": 21 + }, + "end": { + "line": 25, + "column": 3 + } + }, + { + "id": "password.successInfo", + "defaultMessage": "!!!Your new password was sent to your email address", + "file": "src/components/auth/Password.js", + "start": { + "line": 26, + "column": 15 + }, + "end": { + "line": 29, + "column": 3 + } + }, + { + "id": "password.noUser", + "defaultMessage": "!!!No user affiliated with that email address", + "file": "src/components/auth/Password.js", + "start": { + "line": 30, + "column": 10 + }, + "end": { + "line": 33, + "column": 3 + } + }, + { + "id": "password.link.signup", + "defaultMessage": "!!!Create a free account", + "file": "src/components/auth/Password.js", + "start": { + "line": 34, + "column": 14 + }, + "end": { + "line": 37, + "column": 3 + } + }, + { + "id": "password.link.login", + "defaultMessage": "!!!Sign in to your account", + "file": "src/components/auth/Password.js", + "start": { + "line": 38, + "column": 13 + }, + "end": { + "line": 41, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/auth/Pricing.json b/src/i18n/messages/src/components/auth/Pricing.json new file mode 100644 index 000000000..f711a55b4 --- /dev/null +++ b/src/i18n/messages/src/components/auth/Pricing.json @@ -0,0 +1,54 @@ +[ + { + "id": "pricing.headline", + "defaultMessage": "!!!Support Franz", + "file": "src/components/auth/Pricing.js", + "start": { + "line": 13, + "column": 12 + }, + "end": { + "line": 16, + "column": 3 + } + }, + { + "id": "pricing.support.label", + "defaultMessage": "!!!Select your support plan", + "file": "src/components/auth/Pricing.js", + "start": { + "line": 17, + "column": 23 + }, + "end": { + "line": 20, + "column": 3 + } + }, + { + "id": "pricing.submit.label", + "defaultMessage": "!!!Support the development of Franz", + "file": "src/components/auth/Pricing.js", + "start": { + "line": 21, + "column": 21 + }, + "end": { + "line": 24, + "column": 3 + } + }, + { + "id": "pricing.link.skipPayment", + "defaultMessage": "!!!I don't want to support the development of Franz.", + "file": "src/components/auth/Pricing.js", + "start": { + "line": 25, + "column": 15 + }, + "end": { + "line": 28, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/auth/Signup.json b/src/i18n/messages/src/components/auth/Signup.json new file mode 100644 index 000000000..a09745048 --- /dev/null +++ b/src/i18n/messages/src/components/auth/Signup.json @@ -0,0 +1,158 @@ +[ + { + "id": "signup.headline", + "defaultMessage": "!!!Sign up", + "file": "src/components/auth/Signup.js", + "start": { + "line": 18, + "column": 12 + }, + "end": { + "line": 21, + "column": 3 + } + }, + { + "id": "signup.firstname.label", + "defaultMessage": "!!!Firstname", + "file": "src/components/auth/Signup.js", + "start": { + "line": 22, + "column": 18 + }, + "end": { + "line": 25, + "column": 3 + } + }, + { + "id": "signup.lastname.label", + "defaultMessage": "!!!Lastname", + "file": "src/components/auth/Signup.js", + "start": { + "line": 26, + "column": 17 + }, + "end": { + "line": 29, + "column": 3 + } + }, + { + "id": "signup.email.label", + "defaultMessage": "!!!Email address", + "file": "src/components/auth/Signup.js", + "start": { + "line": 30, + "column": 14 + }, + "end": { + "line": 33, + "column": 3 + } + }, + { + "id": "signup.company.label", + "defaultMessage": "!!!Company", + "file": "src/components/auth/Signup.js", + "start": { + "line": 34, + "column": 16 + }, + "end": { + "line": 37, + "column": 3 + } + }, + { + "id": "signup.password.label", + "defaultMessage": "!!!Password", + "file": "src/components/auth/Signup.js", + "start": { + "line": 38, + "column": 17 + }, + "end": { + "line": 41, + "column": 3 + } + }, + { + "id": "signup.legal.info", + "defaultMessage": "!!!By creating a Franz account you accept the", + "file": "src/components/auth/Signup.js", + "start": { + "line": 42, + "column": 13 + }, + "end": { + "line": 45, + "column": 3 + } + }, + { + "id": "signup.legal.terms", + "defaultMessage": "!!!Terms of service", + "file": "src/components/auth/Signup.js", + "start": { + "line": 46, + "column": 9 + }, + "end": { + "line": 49, + "column": 3 + } + }, + { + "id": "signup.legal.privacy", + "defaultMessage": "!!!Privacy Statement", + "file": "src/components/auth/Signup.js", + "start": { + "line": 50, + "column": 11 + }, + "end": { + "line": 53, + "column": 3 + } + }, + { + "id": "signup.submit.label", + "defaultMessage": "!!!Create account", + "file": "src/components/auth/Signup.js", + "start": { + "line": 54, + "column": 21 + }, + "end": { + "line": 57, + "column": 3 + } + }, + { + "id": "signup.link.login", + "defaultMessage": "!!!Already have an account, sign in?", + "file": "src/components/auth/Signup.js", + "start": { + "line": 58, + "column": 13 + }, + "end": { + "line": 61, + "column": 3 + } + }, + { + "id": "signup.emailDuplicate", + "defaultMessage": "!!!A user with that email address already exists", + "file": "src/components/auth/Signup.js", + "start": { + "line": 62, + "column": 18 + }, + "end": { + "line": 65, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/auth/Welcome.json b/src/i18n/messages/src/components/auth/Welcome.json new file mode 100644 index 000000000..b4d2ce689 --- /dev/null +++ b/src/i18n/messages/src/components/auth/Welcome.json @@ -0,0 +1,28 @@ +[ + { + "id": "welcome.signupButton", + "defaultMessage": "!!!Create a free account", + "file": "src/components/auth/Welcome.js", + "start": { + "line": 9, + "column": 16 + }, + "end": { + "line": 12, + "column": 3 + } + }, + { + "id": "welcome.loginButton", + "defaultMessage": "!!!Login to your account", + "file": "src/components/auth/Welcome.js", + "start": { + "line": 13, + "column": 15 + }, + "end": { + "line": 16, + "column": 3 + } + } +] \ 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 new file mode 100644 index 000000000..4dd354afc --- /dev/null +++ b/src/i18n/messages/src/components/layout/AppLayout.json @@ -0,0 +1,80 @@ +[ + { + "id": "infobar.servicesUpdated", + "defaultMessage": "!!!Your services have been updated.", + "file": "src/components/layout/AppLayout.js", + "start": { + "line": 26, + "column": 19 + }, + "end": { + "line": 29, + "column": 3 + } + }, + { + "id": "infobar.updateAvailable", + "defaultMessage": "!!!A new update for Franz is available.", + "file": "src/components/layout/AppLayout.js", + "start": { + "line": 30, + "column": 19 + }, + "end": { + "line": 33, + "column": 3 + } + }, + { + "id": "infobar.buttonReloadServices", + "defaultMessage": "!!!Reload services", + "file": "src/components/layout/AppLayout.js", + "start": { + "line": 34, + "column": 24 + }, + "end": { + "line": 37, + "column": 3 + } + }, + { + "id": "infobar.buttonChangelog", + "defaultMessage": "!!!Changelog", + "file": "src/components/layout/AppLayout.js", + "start": { + "line": 38, + "column": 13 + }, + "end": { + "line": 41, + "column": 3 + } + }, + { + "id": "infobar.buttonInstallUpdate", + "defaultMessage": "!!!Restart & install update", + "file": "src/components/layout/AppLayout.js", + "start": { + "line": 42, + "column": 23 + }, + "end": { + "line": 45, + "column": 3 + } + }, + { + "id": "infobar.requiredRequestsFailed", + "defaultMessage": "!!!Could not load services and user information", + "file": "src/components/layout/AppLayout.js", + "start": { + "line": 46, + "column": 26 + }, + "end": { + "line": 49, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/layout/Sidebar.json b/src/i18n/messages/src/components/layout/Sidebar.json new file mode 100644 index 000000000..d67adc96e --- /dev/null +++ b/src/i18n/messages/src/components/layout/Sidebar.json @@ -0,0 +1,80 @@ +[ + { + "id": "sidebar.settings", + "defaultMessage": "!!!Settings", + "file": "src/components/layout/Sidebar.js", + "start": { + "line": 13, + "column": 12 + }, + "end": { + "line": 16, + "column": 3 + } + }, + { + "id": "sidebar.addNewService", + "defaultMessage": "!!!Add new service", + "file": "src/components/layout/Sidebar.js", + "start": { + "line": 17, + "column": 17 + }, + "end": { + "line": 20, + "column": 3 + } + }, + { + "id": "sidebar.muteApp", + "defaultMessage": "!!!Disable notifications & audio", + "file": "src/components/layout/Sidebar.js", + "start": { + "line": 21, + "column": 8 + }, + "end": { + "line": 24, + "column": 3 + } + }, + { + "id": "sidebar.unmuteApp", + "defaultMessage": "!!!Enable notifications & audio", + "file": "src/components/layout/Sidebar.js", + "start": { + "line": 25, + "column": 10 + }, + "end": { + "line": 28, + "column": 3 + } + }, + { + "id": "sidebar.openWorkspaceDrawer", + "defaultMessage": "!!!Open workspace drawer", + "file": "src/components/layout/Sidebar.js", + "start": { + "line": 29, + "column": 23 + }, + "end": { + "line": 32, + "column": 3 + } + }, + { + "id": "sidebar.closeWorkspaceDrawer", + "defaultMessage": "!!!Close workspace drawer", + "file": "src/components/layout/Sidebar.js", + "start": { + "line": 33, + "column": 24 + }, + "end": { + "line": 36, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/services/content/ErrorHandlers/WebviewErrorHandler.json b/src/i18n/messages/src/components/services/content/ErrorHandlers/WebviewErrorHandler.json new file mode 100644 index 000000000..c8fe802df --- /dev/null +++ b/src/i18n/messages/src/components/services/content/ErrorHandlers/WebviewErrorHandler.json @@ -0,0 +1,67 @@ +[ + { + "id": "service.errorHandler.headline", + "defaultMessage": "!!!Oh no!", + "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js", + "start": { + "line": 12, + "column": 12 + }, + "end": { + "line": 15, + "column": 3 + } + }, + { + "id": "service.errorHandler.text", + "defaultMessage": "!!!{name} has failed to load.", + "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js", + "start": { + "line": 16, + "column": 8 + }, + "end": { + "line": 19, + "column": 3 + } + }, + { + "id": "service.errorHandler.action", + "defaultMessage": "!!!Reload {name}", + "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js", + "start": { + "line": 20, + "column": 10 + }, + "end": { + "line": 23, + "column": 3 + } + }, + { + "id": "service.errorHandler.editAction", + "defaultMessage": "!!!Edit {name}", + "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js", + "start": { + "line": 24, + "column": 14 + }, + "end": { + "line": 27, + "column": 3 + } + }, + { + "id": "service.errorHandler.message", + "defaultMessage": "!!!Error:", + "file": "src/components/services/content/ErrorHandlers/WebviewErrorHandler.js", + "start": { + "line": 28, + "column": 16 + }, + "end": { + "line": 31, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/services/content/ServiceDisabled.json b/src/i18n/messages/src/components/services/content/ServiceDisabled.json new file mode 100644 index 000000000..8bfad28c7 --- /dev/null +++ b/src/i18n/messages/src/components/services/content/ServiceDisabled.json @@ -0,0 +1,28 @@ +[ + { + "id": "service.disabledHandler.headline", + "defaultMessage": "!!!{name} is disabled", + "file": "src/components/services/content/ServiceDisabled.js", + "start": { + "line": 9, + "column": 12 + }, + "end": { + "line": 12, + "column": 3 + } + }, + { + "id": "service.disabledHandler.action", + "defaultMessage": "!!!Enable {name}", + "file": "src/components/services/content/ServiceDisabled.js", + "start": { + "line": 13, + "column": 10 + }, + "end": { + "line": 16, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/services/content/Services.json b/src/i18n/messages/src/components/services/content/Services.json new file mode 100644 index 000000000..884ab0c90 --- /dev/null +++ b/src/i18n/messages/src/components/services/content/Services.json @@ -0,0 +1,28 @@ +[ + { + "id": "services.welcome", + "defaultMessage": "!!!Welcome to Franz", + "file": "src/components/services/content/Services.js", + "start": { + "line": 11, + "column": 11 + }, + "end": { + "line": 14, + "column": 3 + } + }, + { + "id": "services.getStarted", + "defaultMessage": "!!!Get started", + "file": "src/components/services/content/Services.js", + "start": { + "line": 15, + "column": 14 + }, + "end": { + "line": 18, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/services/content/WebviewCrashHandler.json b/src/i18n/messages/src/components/services/content/WebviewCrashHandler.json new file mode 100644 index 000000000..c3d6c41a5 --- /dev/null +++ b/src/i18n/messages/src/components/services/content/WebviewCrashHandler.json @@ -0,0 +1,54 @@ +[ + { + "id": "service.crashHandler.headline", + "defaultMessage": "!!!Oh no!", + "file": "src/components/services/content/WebviewCrashHandler.js", + "start": { + "line": 10, + "column": 12 + }, + "end": { + "line": 13, + "column": 3 + } + }, + { + "id": "service.crashHandler.text", + "defaultMessage": "!!!{name} has caused an error.", + "file": "src/components/services/content/WebviewCrashHandler.js", + "start": { + "line": 14, + "column": 8 + }, + "end": { + "line": 17, + "column": 3 + } + }, + { + "id": "service.crashHandler.action", + "defaultMessage": "!!!Reload {name}", + "file": "src/components/services/content/WebviewCrashHandler.js", + "start": { + "line": 18, + "column": 10 + }, + "end": { + "line": 21, + "column": 3 + } + }, + { + "id": "service.crashHandler.autoReload", + "defaultMessage": "!!!Trying to automatically restore {name} in {seconds} seconds", + "file": "src/components/services/content/WebviewCrashHandler.js", + "start": { + "line": 22, + "column": 14 + }, + "end": { + "line": 25, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/services/tabs/TabItem.json b/src/i18n/messages/src/components/services/tabs/TabItem.json new file mode 100644 index 000000000..08a07845c --- /dev/null +++ b/src/i18n/messages/src/components/services/tabs/TabItem.json @@ -0,0 +1,119 @@ +[ + { + "id": "tabs.item.reload", + "defaultMessage": "!!!Reload", + "file": "src/components/services/tabs/TabItem.js", + "start": { + "line": 15, + "column": 10 + }, + "end": { + "line": 18, + "column": 3 + } + }, + { + "id": "tabs.item.edit", + "defaultMessage": "!!!Edit", + "file": "src/components/services/tabs/TabItem.js", + "start": { + "line": 19, + "column": 8 + }, + "end": { + "line": 22, + "column": 3 + } + }, + { + "id": "tabs.item.disableNotifications", + "defaultMessage": "!!!Disable notifications", + "file": "src/components/services/tabs/TabItem.js", + "start": { + "line": 23, + "column": 24 + }, + "end": { + "line": 26, + "column": 3 + } + }, + { + "id": "tabs.item.enableNotification", + "defaultMessage": "!!!Enable notifications", + "file": "src/components/services/tabs/TabItem.js", + "start": { + "line": 27, + "column": 23 + }, + "end": { + "line": 30, + "column": 3 + } + }, + { + "id": "tabs.item.disableAudio", + "defaultMessage": "!!!Disable audio", + "file": "src/components/services/tabs/TabItem.js", + "start": { + "line": 31, + "column": 16 + }, + "end": { + "line": 34, + "column": 3 + } + }, + { + "id": "tabs.item.enableAudio", + "defaultMessage": "!!!Enable audio", + "file": "src/components/services/tabs/TabItem.js", + "start": { + "line": 35, + "column": 15 + }, + "end": { + "line": 38, + "column": 3 + } + }, + { + "id": "tabs.item.disableService", + "defaultMessage": "!!!Disable Service", + "file": "src/components/services/tabs/TabItem.js", + "start": { + "line": 39, + "column": 18 + }, + "end": { + "line": 42, + "column": 3 + } + }, + { + "id": "tabs.item.enableService", + "defaultMessage": "!!!Enable Service", + "file": "src/components/services/tabs/TabItem.js", + "start": { + "line": 43, + "column": 17 + }, + "end": { + "line": 46, + "column": 3 + } + }, + { + "id": "tabs.item.deleteService", + "defaultMessage": "!!!Delete Service", + "file": "src/components/services/tabs/TabItem.js", + "start": { + "line": 47, + "column": 17 + }, + "end": { + "line": 50, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/settings/account/AccountDashboard.json b/src/i18n/messages/src/components/settings/account/AccountDashboard.json new file mode 100644 index 000000000..603950395 --- /dev/null +++ b/src/i18n/messages/src/components/settings/account/AccountDashboard.json @@ -0,0 +1,197 @@ +[ + { + "id": "settings.account.headline", + "defaultMessage": "!!!Account", + "file": "src/components/settings/account/AccountDashboard.js", + "start": { + "line": 15, + "column": 12 + }, + "end": { + "line": 18, + "column": 3 + } + }, + { + "id": "settings.account.headlineSubscription", + "defaultMessage": "!!!Your Subscription", + "file": "src/components/settings/account/AccountDashboard.js", + "start": { + "line": 19, + "column": 24 + }, + "end": { + "line": 22, + "column": 3 + } + }, + { + "id": "settings.account.headlineUpgrade", + "defaultMessage": "!!!Upgrade your Account", + "file": "src/components/settings/account/AccountDashboard.js", + "start": { + "line": 23, + "column": 19 + }, + "end": { + "line": 26, + "column": 3 + } + }, + { + "id": "settings.account.headlineInvoices", + "defaultMessage": "!!Invoices", + "file": "src/components/settings/account/AccountDashboard.js", + "start": { + "line": 27, + "column": 20 + }, + "end": { + "line": 30, + "column": 3 + } + }, + { + "id": "settings.account.headlineDangerZone", + "defaultMessage": "!!Danger Zone", + "file": "src/components/settings/account/AccountDashboard.js", + "start": { + "line": 31, + "column": 22 + }, + "end": { + "line": 34, + "column": 3 + } + }, + { + "id": "settings.account.manageSubscription.label", + "defaultMessage": "!!!Manage your subscription", + "file": "src/components/settings/account/AccountDashboard.js", + "start": { + "line": 35, + "column": 33 + }, + "end": { + "line": 38, + "column": 3 + } + }, + { + "id": "settings.account.accountType.basic", + "defaultMessage": "!!!Basic Account", + "file": "src/components/settings/account/AccountDashboard.js", + "start": { + "line": 39, + "column": 20 + }, + "end": { + "line": 42, + "column": 3 + } + }, + { + "id": "settings.account.accountType.premium", + "defaultMessage": "!!!Premium Supporter Account", + "file": "src/components/settings/account/AccountDashboard.js", + "start": { + "line": 43, + "column": 22 + }, + "end": { + "line": 46, + "column": 3 + } + }, + { + "id": "settings.account.account.editButton", + "defaultMessage": "!!!Edit Account", + "file": "src/components/settings/account/AccountDashboard.js", + "start": { + "line": 47, + "column": 21 + }, + "end": { + "line": 50, + "column": 3 + } + }, + { + "id": "settings.account.invoiceDownload", + "defaultMessage": "!!!Download", + "file": "src/components/settings/account/AccountDashboard.js", + "start": { + "line": 51, + "column": 19 + }, + "end": { + "line": 54, + "column": 3 + } + }, + { + "id": "settings.account.userInfoRequestFailed", + "defaultMessage": "!!!Could not load user information", + "file": "src/components/settings/account/AccountDashboard.js", + "start": { + "line": 55, + "column": 25 + }, + "end": { + "line": 58, + "column": 3 + } + }, + { + "id": "settings.account.tryReloadUserInfoRequest", + "defaultMessage": "!!!Try again", + "file": "src/components/settings/account/AccountDashboard.js", + "start": { + "line": 59, + "column": 28 + }, + "end": { + "line": 62, + "column": 3 + } + }, + { + "id": "settings.account.deleteAccount", + "defaultMessage": "!!!Delete account", + "file": "src/components/settings/account/AccountDashboard.js", + "start": { + "line": 63, + "column": 17 + }, + "end": { + "line": 66, + "column": 3 + } + }, + { + "id": "settings.account.deleteInfo", + "defaultMessage": "!!!If you don't need your Franz account any longer, you can delete your account and all related data here.", + "file": "src/components/settings/account/AccountDashboard.js", + "start": { + "line": 67, + "column": 14 + }, + "end": { + "line": 70, + "column": 3 + } + }, + { + "id": "settings.account.deleteEmailSent", + "defaultMessage": "!!!You have received an email with a link to confirm your account deletion. Your account and data cannot be restored!", + "file": "src/components/settings/account/AccountDashboard.js", + "start": { + "line": 71, + "column": 19 + }, + "end": { + "line": 74, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json new file mode 100644 index 000000000..77b0ed8a4 --- /dev/null +++ b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json @@ -0,0 +1,93 @@ +[ + { + "id": "settings.navigation.availableServices", + "defaultMessage": "!!!Available services", + "file": "src/components/settings/navigation/SettingsNavigation.js", + "start": { + "line": 12, + "column": 21 + }, + "end": { + "line": 15, + "column": 3 + } + }, + { + "id": "settings.navigation.yourServices", + "defaultMessage": "!!!Your services", + "file": "src/components/settings/navigation/SettingsNavigation.js", + "start": { + "line": 16, + "column": 16 + }, + "end": { + "line": 19, + "column": 3 + } + }, + { + "id": "settings.navigation.yourWorkspaces", + "defaultMessage": "!!!Your workspaces", + "file": "src/components/settings/navigation/SettingsNavigation.js", + "start": { + "line": 20, + "column": 18 + }, + "end": { + "line": 23, + "column": 3 + } + }, + { + "id": "settings.navigation.account", + "defaultMessage": "!!!Account", + "file": "src/components/settings/navigation/SettingsNavigation.js", + "start": { + "line": 24, + "column": 11 + }, + "end": { + "line": 27, + "column": 3 + } + }, + { + "id": "settings.navigation.settings", + "defaultMessage": "!!!Settings", + "file": "src/components/settings/navigation/SettingsNavigation.js", + "start": { + "line": 28, + "column": 12 + }, + "end": { + "line": 31, + "column": 3 + } + }, + { + "id": "settings.navigation.inviteFriends", + "defaultMessage": "!!!Invite Friends", + "file": "src/components/settings/navigation/SettingsNavigation.js", + "start": { + "line": 32, + "column": 17 + }, + "end": { + "line": 35, + "column": 3 + } + }, + { + "id": "settings.navigation.logout", + "defaultMessage": "!!!Logout", + "file": "src/components/settings/navigation/SettingsNavigation.js", + "start": { + "line": 36, + "column": 10 + }, + "end": { + "line": 39, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json b/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json new file mode 100644 index 000000000..7d9ed3283 --- /dev/null +++ b/src/i18n/messages/src/components/settings/recipes/RecipesDashboard.json @@ -0,0 +1,106 @@ +[ + { + "id": "settings.recipes.headline", + "defaultMessage": "!!!Available Services", + "file": "src/components/settings/recipes/RecipesDashboard.js", + "start": { + "line": 15, + "column": 12 + }, + "end": { + "line": 18, + "column": 3 + } + }, + { + "id": "settings.searchService", + "defaultMessage": "!!!Search service", + "file": "src/components/settings/recipes/RecipesDashboard.js", + "start": { + "line": 19, + "column": 17 + }, + "end": { + "line": 22, + "column": 3 + } + }, + { + "id": "settings.recipes.mostPopular", + "defaultMessage": "!!!Most popular", + "file": "src/components/settings/recipes/RecipesDashboard.js", + "start": { + "line": 23, + "column": 22 + }, + "end": { + "line": 26, + "column": 3 + } + }, + { + "id": "settings.recipes.all", + "defaultMessage": "!!!All services", + "file": "src/components/settings/recipes/RecipesDashboard.js", + "start": { + "line": 27, + "column": 14 + }, + "end": { + "line": 30, + "column": 3 + } + }, + { + "id": "settings.recipes.dev", + "defaultMessage": "!!!Development", + "file": "src/components/settings/recipes/RecipesDashboard.js", + "start": { + "line": 31, + "column": 14 + }, + "end": { + "line": 34, + "column": 3 + } + }, + { + "id": "settings.recipes.nothingFound", + "defaultMessage": "!!!Sorry, but no service matched your search term.", + "file": "src/components/settings/recipes/RecipesDashboard.js", + "start": { + "line": 35, + "column": 16 + }, + "end": { + "line": 38, + "column": 3 + } + }, + { + "id": "settings.recipes.servicesSuccessfulAddedInfo", + "defaultMessage": "!!!Service successfully added", + "file": "src/components/settings/recipes/RecipesDashboard.js", + "start": { + "line": 39, + "column": 31 + }, + "end": { + "line": 42, + "column": 3 + } + }, + { + "id": "settings.recipes.missingService", + "defaultMessage": "!!!Missing a service?", + "file": "src/components/settings/recipes/RecipesDashboard.js", + "start": { + "line": 43, + "column": 18 + }, + "end": { + "line": 46, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/settings/services/EditServiceForm.json b/src/i18n/messages/src/components/settings/services/EditServiceForm.json new file mode 100644 index 000000000..42b741b7a --- /dev/null +++ b/src/i18n/messages/src/components/settings/services/EditServiceForm.json @@ -0,0 +1,288 @@ +[ + { + "id": "settings.service.form.saveButton", + "defaultMessage": "!!!Save service", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 22, + "column": 15 + }, + "end": { + "line": 25, + "column": 3 + } + }, + { + "id": "settings.service.form.deleteButton", + "defaultMessage": "!!!Delete Service", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 26, + "column": 17 + }, + "end": { + "line": 29, + "column": 3 + } + }, + { + "id": "settings.service.form.availableServices", + "defaultMessage": "!!!Available services", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 30, + "column": 21 + }, + "end": { + "line": 33, + "column": 3 + } + }, + { + "id": "settings.service.form.yourServices", + "defaultMessage": "!!!Your services", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 34, + "column": 16 + }, + "end": { + "line": 37, + "column": 3 + } + }, + { + "id": "settings.service.form.addServiceHeadline", + "defaultMessage": "!!!Add {name}", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 38, + "column": 22 + }, + "end": { + "line": 41, + "column": 3 + } + }, + { + "id": "settings.service.form.editServiceHeadline", + "defaultMessage": "!!!Edit {name}", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 42, + "column": 23 + }, + "end": { + "line": 45, + "column": 3 + } + }, + { + "id": "settings.service.form.tabHosted", + "defaultMessage": "!!!Hosted", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 46, + "column": 13 + }, + "end": { + "line": 49, + "column": 3 + } + }, + { + "id": "settings.service.form.tabOnPremise", + "defaultMessage": "!!!Self hosted ⭐️", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 50, + "column": 16 + }, + "end": { + "line": 53, + "column": 3 + } + }, + { + "id": "settings.service.form.useHostedService", + "defaultMessage": "!!!Use the hosted {name} service.", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 54, + "column": 20 + }, + "end": { + "line": 57, + "column": 3 + } + }, + { + "id": "settings.service.form.customUrlValidationError", + "defaultMessage": "!!!Could not validate custom {name} server.", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 58, + "column": 28 + }, + "end": { + "line": 61, + "column": 3 + } + }, + { + "id": "settings.service.form.customUrlPremiumInfo", + "defaultMessage": "!!!To add self hosted services, you need a Franz Premium Supporter Account.", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 62, + "column": 24 + }, + "end": { + "line": 65, + "column": 3 + } + }, + { + "id": "settings.service.form.customUrlUpgradeAccount", + "defaultMessage": "!!!Upgrade your account", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 66, + "column": 27 + }, + "end": { + "line": 69, + "column": 3 + } + }, + { + "id": "settings.service.form.indirectMessageInfo", + "defaultMessage": "!!!You will be notified about all new messages in a channel, not just @username, @channel, @here, ...", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 70, + "column": 23 + }, + "end": { + "line": 73, + "column": 3 + } + }, + { + "id": "settings.service.form.isMutedInfo", + "defaultMessage": "!!!When disabled, all notification sounds and audio playback are muted", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 74, + "column": 15 + }, + "end": { + "line": 77, + "column": 3 + } + }, + { + "id": "settings.service.form.headlineNotifications", + "defaultMessage": "!!!Notifications", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 78, + "column": 25 + }, + "end": { + "line": 81, + "column": 3 + } + }, + { + "id": "settings.service.form.headlineBadges", + "defaultMessage": "!!!Unread message badges", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 82, + "column": 18 + }, + "end": { + "line": 85, + "column": 3 + } + }, + { + "id": "settings.service.form.headlineGeneral", + "defaultMessage": "!!!General", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 86, + "column": 19 + }, + "end": { + "line": 89, + "column": 3 + } + }, + { + "id": "settings.service.form.iconDelete", + "defaultMessage": "!!!Delete", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 90, + "column": 14 + }, + "end": { + "line": 93, + "column": 3 + } + }, + { + "id": "settings.service.form.iconUpload", + "defaultMessage": "!!!Drop your image, or click here", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 94, + "column": 14 + }, + "end": { + "line": 97, + "column": 3 + } + }, + { + "id": "settings.service.form.proxy.headline", + "defaultMessage": "!!!HTTP/HTTPS Proxy Settings", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 98, + "column": 17 + }, + "end": { + "line": 101, + "column": 3 + } + }, + { + "id": "settings.service.form.proxy.restartInfo", + "defaultMessage": "!!!Please restart Franz after changing proxy Settings.", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 102, + "column": 20 + }, + "end": { + "line": 105, + "column": 3 + } + }, + { + "id": "settings.service.form.proxy.info", + "defaultMessage": "!!!Proxy settings will not be synchronized with the Franz servers.", + "file": "src/components/settings/services/EditServiceForm.js", + "start": { + "line": 106, + "column": 13 + }, + "end": { + "line": 109, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/settings/services/ServiceError.json b/src/i18n/messages/src/components/settings/services/ServiceError.json new file mode 100644 index 000000000..648fc5b3e --- /dev/null +++ b/src/i18n/messages/src/components/settings/services/ServiceError.json @@ -0,0 +1,54 @@ +[ + { + "id": "settings.service.error.headline", + "defaultMessage": "!!!Error", + "file": "src/components/settings/services/ServiceError.js", + "start": { + "line": 10, + "column": 12 + }, + "end": { + "line": 13, + "column": 3 + } + }, + { + "id": "settings.service.error.goBack", + "defaultMessage": "!!!Back to services", + "file": "src/components/settings/services/ServiceError.js", + "start": { + "line": 14, + "column": 10 + }, + "end": { + "line": 17, + "column": 3 + } + }, + { + "id": "settings.service.form.availableServices", + "defaultMessage": "!!!Available services", + "file": "src/components/settings/services/ServiceError.js", + "start": { + "line": 18, + "column": 21 + }, + "end": { + "line": 21, + "column": 3 + } + }, + { + "id": "settings.service.error.message", + "defaultMessage": "!!!Could not load service recipe.", + "file": "src/components/settings/services/ServiceError.js", + "start": { + "line": 22, + "column": 16 + }, + "end": { + "line": 25, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/settings/services/ServiceItem.json b/src/i18n/messages/src/components/settings/services/ServiceItem.json new file mode 100644 index 000000000..ffea8b9e1 --- /dev/null +++ b/src/i18n/messages/src/components/settings/services/ServiceItem.json @@ -0,0 +1,41 @@ +[ + { + "id": "settings.services.tooltip.isDisabled", + "defaultMessage": "!!!Service is disabled", + "file": "src/components/settings/services/ServiceItem.js", + "start": { + "line": 11, + "column": 21 + }, + "end": { + "line": 14, + "column": 3 + } + }, + { + "id": "settings.services.tooltip.notificationsDisabled", + "defaultMessage": "!!!Notifications are disabled", + "file": "src/components/settings/services/ServiceItem.js", + "start": { + "line": 15, + "column": 32 + }, + "end": { + "line": 18, + "column": 3 + } + }, + { + "id": "settings.services.tooltip.isMuted", + "defaultMessage": "!!!All sounds are muted", + "file": "src/components/settings/services/ServiceItem.js", + "start": { + "line": 19, + "column": 18 + }, + "end": { + "line": 22, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/settings/services/ServicesDashboard.json b/src/i18n/messages/src/components/settings/services/ServicesDashboard.json new file mode 100644 index 000000000..3803c6512 --- /dev/null +++ b/src/i18n/messages/src/components/settings/services/ServicesDashboard.json @@ -0,0 +1,119 @@ +[ + { + "id": "settings.services.headline", + "defaultMessage": "!!!Your services", + "file": "src/components/settings/services/ServicesDashboard.js", + "start": { + "line": 14, + "column": 12 + }, + "end": { + "line": 17, + "column": 3 + } + }, + { + "id": "settings.searchService", + "defaultMessage": "!!!Search service", + "file": "src/components/settings/services/ServicesDashboard.js", + "start": { + "line": 18, + "column": 17 + }, + "end": { + "line": 21, + "column": 3 + } + }, + { + "id": "settings.services.noServicesAdded", + "defaultMessage": "!!!You haven't added any services yet.", + "file": "src/components/settings/services/ServicesDashboard.js", + "start": { + "line": 22, + "column": 19 + }, + "end": { + "line": 25, + "column": 3 + } + }, + { + "id": "settings.recipes.nothingFound", + "defaultMessage": "!!!Sorry, but no service matched your search term.", + "file": "src/components/settings/services/ServicesDashboard.js", + "start": { + "line": 26, + "column": 18 + }, + "end": { + "line": 29, + "column": 3 + } + }, + { + "id": "settings.services.discoverServices", + "defaultMessage": "!!!Discover services", + "file": "src/components/settings/services/ServicesDashboard.js", + "start": { + "line": 30, + "column": 20 + }, + "end": { + "line": 33, + "column": 3 + } + }, + { + "id": "settings.services.servicesRequestFailed", + "defaultMessage": "!!!Could not load your services", + "file": "src/components/settings/services/ServicesDashboard.js", + "start": { + "line": 34, + "column": 25 + }, + "end": { + "line": 37, + "column": 3 + } + }, + { + "id": "settings.account.tryReloadServices", + "defaultMessage": "!!!Try again", + "file": "src/components/settings/services/ServicesDashboard.js", + "start": { + "line": 38, + "column": 21 + }, + "end": { + "line": 41, + "column": 3 + } + }, + { + "id": "settings.services.updatedInfo", + "defaultMessage": "!!!Your changes have been saved", + "file": "src/components/settings/services/ServicesDashboard.js", + "start": { + "line": 42, + "column": 15 + }, + "end": { + "line": 45, + "column": 3 + } + }, + { + "id": "settings.services.deletedInfo", + "defaultMessage": "!!!Service has been deleted", + "file": "src/components/settings/services/ServicesDashboard.js", + "start": { + "line": 46, + "column": 15 + }, + "end": { + "line": 49, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json b/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json new file mode 100644 index 000000000..fa21db10a --- /dev/null +++ b/src/i18n/messages/src/components/settings/settings/EditSettingsForm.json @@ -0,0 +1,236 @@ +[ + { + "id": "settings.app.headline", + "defaultMessage": "!!!Settings", + "file": "src/components/settings/settings/EditSettingsForm.js", + "start": { + "line": 16, + "column": 12 + }, + "end": { + "line": 19, + "column": 3 + } + }, + { + "id": "settings.app.headlineGeneral", + "defaultMessage": "!!!General", + "file": "src/components/settings/settings/EditSettingsForm.js", + "start": { + "line": 20, + "column": 19 + }, + "end": { + "line": 23, + "column": 3 + } + }, + { + "id": "settings.app.headlineLanguage", + "defaultMessage": "!!!Language", + "file": "src/components/settings/settings/EditSettingsForm.js", + "start": { + "line": 24, + "column": 20 + }, + "end": { + "line": 27, + "column": 3 + } + }, + { + "id": "settings.app.headlineUpdates", + "defaultMessage": "!!!Updates", + "file": "src/components/settings/settings/EditSettingsForm.js", + "start": { + "line": 28, + "column": 19 + }, + "end": { + "line": 31, + "column": 3 + } + }, + { + "id": "settings.app.headlineAppearance", + "defaultMessage": "!!!Appearance", + "file": "src/components/settings/settings/EditSettingsForm.js", + "start": { + "line": 32, + "column": 22 + }, + "end": { + "line": 35, + "column": 3 + } + }, + { + "id": "settings.app.headlineAdvanced", + "defaultMessage": "!!!Advanced", + "file": "src/components/settings/settings/EditSettingsForm.js", + "start": { + "line": 36, + "column": 20 + }, + "end": { + "line": 39, + "column": 3 + } + }, + { + "id": "settings.app.translationHelp", + "defaultMessage": "!!!Help us to translate Franz into your language.", + "file": "src/components/settings/settings/EditSettingsForm.js", + "start": { + "line": 40, + "column": 19 + }, + "end": { + "line": 43, + "column": 3 + } + }, + { + "id": "settings.app.subheadlineCache", + "defaultMessage": "!!!Cache", + "file": "src/components/settings/settings/EditSettingsForm.js", + "start": { + "line": 44, + "column": 20 + }, + "end": { + "line": 47, + "column": 3 + } + }, + { + "id": "settings.app.cacheInfo", + "defaultMessage": "!!!Franz cache is currently using {size} of disk space.", + "file": "src/components/settings/settings/EditSettingsForm.js", + "start": { + "line": 48, + "column": 13 + }, + "end": { + "line": 51, + "column": 3 + } + }, + { + "id": "settings.app.buttonClearAllCache", + "defaultMessage": "!!!Clear cache", + "file": "src/components/settings/settings/EditSettingsForm.js", + "start": { + "line": 52, + "column": 23 + }, + "end": { + "line": 55, + "column": 3 + } + }, + { + "id": "settings.app.buttonSearchForUpdate", + "defaultMessage": "!!!Check for updates", + "file": "src/components/settings/settings/EditSettingsForm.js", + "start": { + "line": 56, + "column": 25 + }, + "end": { + "line": 59, + "column": 3 + } + }, + { + "id": "settings.app.buttonInstallUpdate", + "defaultMessage": "!!!Restart & install update", + "file": "src/components/settings/settings/EditSettingsForm.js", + "start": { + "line": 60, + "column": 23 + }, + "end": { + "line": 63, + "column": 3 + } + }, + { + "id": "settings.app.updateStatusSearching", + "defaultMessage": "!!!Is searching for update", + "file": "src/components/settings/settings/EditSettingsForm.js", + "start": { + "line": 64, + "column": 25 + }, + "end": { + "line": 67, + "column": 3 + } + }, + { + "id": "settings.app.updateStatusAvailable", + "defaultMessage": "!!!Update available, downloading...", + "file": "src/components/settings/settings/EditSettingsForm.js", + "start": { + "line": 68, + "column": 25 + }, + "end": { + "line": 71, + "column": 3 + } + }, + { + "id": "settings.app.updateStatusUpToDate", + "defaultMessage": "!!!You are using the latest version of Franz", + "file": "src/components/settings/settings/EditSettingsForm.js", + "start": { + "line": 72, + "column": 24 + }, + "end": { + "line": 75, + "column": 3 + } + }, + { + "id": "settings.app.currentVersion", + "defaultMessage": "!!!Current version:", + "file": "src/components/settings/settings/EditSettingsForm.js", + "start": { + "line": 76, + "column": 18 + }, + "end": { + "line": 79, + "column": 3 + } + }, + { + "id": "settings.app.restartRequired", + "defaultMessage": "!!!Changes require restart", + "file": "src/components/settings/settings/EditSettingsForm.js", + "start": { + "line": 80, + "column": 29 + }, + "end": { + "line": 83, + "column": 3 + } + }, + { + "id": "settings.app.languageDisclaimer", + "defaultMessage": "!!!Official translations are English & German. All other languages are community based translations.", + "file": "src/components/settings/settings/EditSettingsForm.js", + "start": { + "line": 84, + "column": 22 + }, + "end": { + "line": 87, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/settings/user/EditUserForm.json b/src/i18n/messages/src/components/settings/user/EditUserForm.json new file mode 100644 index 000000000..3a59f8681 --- /dev/null +++ b/src/i18n/messages/src/components/settings/user/EditUserForm.json @@ -0,0 +1,80 @@ +[ + { + "id": "settings.account.headline", + "defaultMessage": "!!!Account", + "file": "src/components/settings/user/EditUserForm.js", + "start": { + "line": 15, + "column": 12 + }, + "end": { + "line": 18, + "column": 3 + } + }, + { + "id": "settings.account.headlineProfile", + "defaultMessage": "!!!Update Profile", + "file": "src/components/settings/user/EditUserForm.js", + "start": { + "line": 19, + "column": 19 + }, + "end": { + "line": 22, + "column": 3 + } + }, + { + "id": "settings.account.headlineAccount", + "defaultMessage": "!!!Account Information", + "file": "src/components/settings/user/EditUserForm.js", + "start": { + "line": 23, + "column": 19 + }, + "end": { + "line": 26, + "column": 3 + } + }, + { + "id": "settings.account.headlinePassword", + "defaultMessage": "!!!Change Password", + "file": "src/components/settings/user/EditUserForm.js", + "start": { + "line": 27, + "column": 20 + }, + "end": { + "line": 30, + "column": 3 + } + }, + { + "id": "settings.account.successInfo", + "defaultMessage": "!!!Your changes have been saved", + "file": "src/components/settings/user/EditUserForm.js", + "start": { + "line": 31, + "column": 15 + }, + "end": { + "line": 34, + "column": 3 + } + }, + { + "id": "settings.account.buttonSave", + "defaultMessage": "!!!Update profile", + "file": "src/components/settings/user/EditUserForm.js", + "start": { + "line": 35, + "column": 14 + }, + "end": { + "line": 38, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/subscription/SubscriptionForm.json b/src/i18n/messages/src/components/subscription/SubscriptionForm.json new file mode 100644 index 000000000..cc7470358 --- /dev/null +++ b/src/i18n/messages/src/components/subscription/SubscriptionForm.json @@ -0,0 +1,171 @@ +[ + { + "id": "subscription.submit.label", + "defaultMessage": "!!!Support the development of Franz", + "file": "src/components/subscription/SubscriptionForm.js", + "start": { + "line": 14, + "column": 21 + }, + "end": { + "line": 17, + "column": 3 + } + }, + { + "id": "subscription.paymentSessionError", + "defaultMessage": "!!!Could not initialize payment form", + "file": "src/components/subscription/SubscriptionForm.js", + "start": { + "line": 18, + "column": 23 + }, + "end": { + "line": 21, + "column": 3 + } + }, + { + "id": "subscription.type.free", + "defaultMessage": "!!!free", + "file": "src/components/subscription/SubscriptionForm.js", + "start": { + "line": 22, + "column": 12 + }, + "end": { + "line": 25, + "column": 3 + } + }, + { + "id": "subscription.type.month", + "defaultMessage": "!!!month", + "file": "src/components/subscription/SubscriptionForm.js", + "start": { + "line": 26, + "column": 15 + }, + "end": { + "line": 29, + "column": 3 + } + }, + { + "id": "subscription.type.year", + "defaultMessage": "!!!year", + "file": "src/components/subscription/SubscriptionForm.js", + "start": { + "line": 30, + "column": 14 + }, + "end": { + "line": 33, + "column": 3 + } + }, + { + "id": "subscription.includedFeatures", + "defaultMessage": "!!!The Franz Premium Supporter Account includes", + "file": "src/components/subscription/SubscriptionForm.js", + "start": { + "line": 34, + "column": 20 + }, + "end": { + "line": 37, + "column": 3 + } + }, + { + "id": "subscription.features.onpremise.mattermost", + "defaultMessage": "!!!Add on-premise/hosted services like Mattermost", + "file": "src/components/subscription/SubscriptionForm.js", + "start": { + "line": 38, + "column": 13 + }, + "end": { + "line": 41, + "column": 3 + } + }, + { + "id": "subscription.features.noInterruptions", + "defaultMessage": "!!!No app delays & nagging to upgrade license", + "file": "src/components/subscription/SubscriptionForm.js", + "start": { + "line": 42, + "column": 19 + }, + "end": { + "line": 45, + "column": 3 + } + }, + { + "id": "subscription.features.proxy", + "defaultMessage": "!!!Proxy support for services", + "file": "src/components/subscription/SubscriptionForm.js", + "start": { + "line": 46, + "column": 9 + }, + "end": { + "line": 49, + "column": 3 + } + }, + { + "id": "subscription.features.spellchecker", + "defaultMessage": "!!!Support for Spellchecker", + "file": "src/components/subscription/SubscriptionForm.js", + "start": { + "line": 50, + "column": 16 + }, + "end": { + "line": 53, + "column": 3 + } + }, + { + "id": "subscription.features.ads", + "defaultMessage": "!!!No ads, ever!", + "file": "src/components/subscription/SubscriptionForm.js", + "start": { + "line": 54, + "column": 7 + }, + "end": { + "line": 57, + "column": 3 + } + }, + { + "id": "subscription.features.comingSoon", + "defaultMessage": "!!!coming soon", + "file": "src/components/subscription/SubscriptionForm.js", + "start": { + "line": 58, + "column": 14 + }, + "end": { + "line": 61, + "column": 3 + } + }, + { + "id": "subscription.euTaxInfo", + "defaultMessage": "!!!EU residents: local sales tax may apply", + "file": "src/components/subscription/SubscriptionForm.js", + "start": { + "line": 62, + "column": 13 + }, + "end": { + "line": 65, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/subscription/SubscriptionPopup.json b/src/i18n/messages/src/components/subscription/SubscriptionPopup.json new file mode 100644 index 000000000..c06da7531 --- /dev/null +++ b/src/i18n/messages/src/components/subscription/SubscriptionPopup.json @@ -0,0 +1,28 @@ +[ + { + "id": "subscriptionPopup.buttonCancel", + "defaultMessage": "!!!Cancel", + "file": "src/components/subscription/SubscriptionPopup.js", + "start": { + "line": 11, + "column": 16 + }, + "end": { + "line": 14, + "column": 3 + } + }, + { + "id": "subscriptionPopup.buttonDone", + "defaultMessage": "!!!Done", + "file": "src/components/subscription/SubscriptionPopup.js", + "start": { + "line": 15, + "column": 14 + }, + "end": { + "line": 18, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json b/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json new file mode 100644 index 000000000..320d3ca3e --- /dev/null +++ b/src/i18n/messages/src/components/ui/PremiumFeatureContainer/index.json @@ -0,0 +1,15 @@ +[ + { + "id": "premiumFeature.button.upgradeAccount", + "defaultMessage": "!!!Upgrade account", + "file": "src/components/ui/PremiumFeatureContainer/index.js", + "start": { + "line": 15, + "column": 10 + }, + "end": { + "line": 18, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/ui/WebviewLoader/index.json b/src/i18n/messages/src/components/ui/WebviewLoader/index.json new file mode 100644 index 000000000..ef3e4b593 --- /dev/null +++ b/src/i18n/messages/src/components/ui/WebviewLoader/index.json @@ -0,0 +1,15 @@ +[ + { + "id": "service.webviewLoader.loading", + "defaultMessage": "!!!Loading", + "file": "src/components/ui/WebviewLoader/index.js", + "start": { + "line": 11, + "column": 11 + }, + "end": { + "line": 14, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/components/util/ErrorBoundary/index.json b/src/i18n/messages/src/components/util/ErrorBoundary/index.json new file mode 100644 index 000000000..43c323031 --- /dev/null +++ b/src/i18n/messages/src/components/util/ErrorBoundary/index.json @@ -0,0 +1,28 @@ +[ + { + "id": "app.errorHandler.headline", + "defaultMessage": "!!!Something went wrong.", + "file": "src/components/util/ErrorBoundary/index.js", + "start": { + "line": 11, + "column": 12 + }, + "end": { + "line": 14, + "column": 3 + } + }, + { + "id": "app.errorHandler.action", + "defaultMessage": "!!!Reload", + "file": "src/components/util/ErrorBoundary/index.js", + "start": { + "line": 15, + "column": 10 + }, + "end": { + "line": 18, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/containers/settings/EditServiceScreen.json b/src/i18n/messages/src/containers/settings/EditServiceScreen.json new file mode 100644 index 000000000..42ca42125 --- /dev/null +++ b/src/i18n/messages/src/containers/settings/EditServiceScreen.json @@ -0,0 +1,197 @@ +[ + { + "id": "settings.service.form.name", + "defaultMessage": "!!!Name", + "file": "src/containers/settings/EditServiceScreen.js", + "start": { + "line": 28, + "column": 8 + }, + "end": { + "line": 31, + "column": 3 + } + }, + { + "id": "settings.service.form.enableService", + "defaultMessage": "!!!Enable service", + "file": "src/containers/settings/EditServiceScreen.js", + "start": { + "line": 32, + "column": 17 + }, + "end": { + "line": 35, + "column": 3 + } + }, + { + "id": "settings.service.form.enableNotification", + "defaultMessage": "!!!Enable Notifications", + "file": "src/containers/settings/EditServiceScreen.js", + "start": { + "line": 36, + "column": 22 + }, + "end": { + "line": 39, + "column": 3 + } + }, + { + "id": "settings.service.form.enableBadge", + "defaultMessage": "!!!Show unread message badges", + "file": "src/containers/settings/EditServiceScreen.js", + "start": { + "line": 40, + "column": 15 + }, + "end": { + "line": 43, + "column": 3 + } + }, + { + "id": "settings.service.form.enableAudio", + "defaultMessage": "!!!Enable audio", + "file": "src/containers/settings/EditServiceScreen.js", + "start": { + "line": 44, + "column": 15 + }, + "end": { + "line": 47, + "column": 3 + } + }, + { + "id": "settings.service.form.team", + "defaultMessage": "!!!Team", + "file": "src/containers/settings/EditServiceScreen.js", + "start": { + "line": 48, + "column": 8 + }, + "end": { + "line": 51, + "column": 3 + } + }, + { + "id": "settings.service.form.customUrl", + "defaultMessage": "!!!Custom server", + "file": "src/containers/settings/EditServiceScreen.js", + "start": { + "line": 52, + "column": 13 + }, + "end": { + "line": 55, + "column": 3 + } + }, + { + "id": "settings.service.form.indirectMessages", + "defaultMessage": "!!!Show message badge for all new messages", + "file": "src/containers/settings/EditServiceScreen.js", + "start": { + "line": 56, + "column": 20 + }, + "end": { + "line": 59, + "column": 3 + } + }, + { + "id": "settings.service.form.icon", + "defaultMessage": "!!!Custom icon", + "file": "src/containers/settings/EditServiceScreen.js", + "start": { + "line": 60, + "column": 8 + }, + "end": { + "line": 63, + "column": 3 + } + }, + { + "id": "settings.service.form.enableDarkMode", + "defaultMessage": "!!!Enable Dark Mode", + "file": "src/containers/settings/EditServiceScreen.js", + "start": { + "line": 64, + "column": 18 + }, + "end": { + "line": 67, + "column": 3 + } + }, + { + "id": "settings.service.form.proxy.isEnabled", + "defaultMessage": "!!!Use Proxy", + "file": "src/containers/settings/EditServiceScreen.js", + "start": { + "line": 68, + "column": 15 + }, + "end": { + "line": 71, + "column": 3 + } + }, + { + "id": "settings.service.form.proxy.host", + "defaultMessage": "!!!Proxy Host/IP", + "file": "src/containers/settings/EditServiceScreen.js", + "start": { + "line": 72, + "column": 13 + }, + "end": { + "line": 75, + "column": 3 + } + }, + { + "id": "settings.service.form.proxy.port", + "defaultMessage": "!!!Port", + "file": "src/containers/settings/EditServiceScreen.js", + "start": { + "line": 76, + "column": 13 + }, + "end": { + "line": 79, + "column": 3 + } + }, + { + "id": "settings.service.form.proxy.user", + "defaultMessage": "!!!User", + "file": "src/containers/settings/EditServiceScreen.js", + "start": { + "line": 80, + "column": 13 + }, + "end": { + "line": 83, + "column": 3 + } + }, + { + "id": "settings.service.form.proxy.password", + "defaultMessage": "!!!Password", + "file": "src/containers/settings/EditServiceScreen.js", + "start": { + "line": 84, + "column": 17 + }, + "end": { + "line": 87, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/containers/settings/EditSettingsScreen.json b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json new file mode 100644 index 000000000..d3b413540 --- /dev/null +++ b/src/i18n/messages/src/containers/settings/EditSettingsScreen.json @@ -0,0 +1,158 @@ +[ + { + "id": "settings.app.form.autoLaunchOnStart", + "defaultMessage": "!!!Launch Franz on start", + "file": "src/containers/settings/EditSettingsScreen.js", + "start": { + "line": 22, + "column": 21 + }, + "end": { + "line": 25, + "column": 3 + } + }, + { + "id": "settings.app.form.autoLaunchInBackground", + "defaultMessage": "!!!Open in background", + "file": "src/containers/settings/EditSettingsScreen.js", + "start": { + "line": 26, + "column": 26 + }, + "end": { + "line": 29, + "column": 3 + } + }, + { + "id": "settings.app.form.runInBackground", + "defaultMessage": "!!!Keep Franz in background when closing the window", + "file": "src/containers/settings/EditSettingsScreen.js", + "start": { + "line": 30, + "column": 19 + }, + "end": { + "line": 33, + "column": 3 + } + }, + { + "id": "settings.app.form.enableSystemTray", + "defaultMessage": "!!!Show Franz in system tray", + "file": "src/containers/settings/EditSettingsScreen.js", + "start": { + "line": 34, + "column": 20 + }, + "end": { + "line": 37, + "column": 3 + } + }, + { + "id": "settings.app.form.minimizeToSystemTray", + "defaultMessage": "!!!Minimize Franz to system tray", + "file": "src/containers/settings/EditSettingsScreen.js", + "start": { + "line": 38, + "column": 24 + }, + "end": { + "line": 41, + "column": 3 + } + }, + { + "id": "settings.app.form.language", + "defaultMessage": "!!!Language", + "file": "src/containers/settings/EditSettingsScreen.js", + "start": { + "line": 42, + "column": 12 + }, + "end": { + "line": 45, + "column": 3 + } + }, + { + "id": "settings.app.form.darkMode", + "defaultMessage": "!!!Dark Mode", + "file": "src/containers/settings/EditSettingsScreen.js", + "start": { + "line": 46, + "column": 12 + }, + "end": { + "line": 49, + "column": 3 + } + }, + { + "id": "settings.app.form.showDisabledServices", + "defaultMessage": "!!!Display disabled services tabs", + "file": "src/containers/settings/EditSettingsScreen.js", + "start": { + "line": 50, + "column": 24 + }, + "end": { + "line": 53, + "column": 3 + } + }, + { + "id": "settings.app.form.showMessagesBadgesWhenMuted", + "defaultMessage": "!!!Show unread message badge when notifications are disabled", + "file": "src/containers/settings/EditSettingsScreen.js", + "start": { + "line": 54, + "column": 29 + }, + "end": { + "line": 57, + "column": 3 + } + }, + { + "id": "settings.app.form.enableSpellchecking", + "defaultMessage": "!!!Enable spell checking", + "file": "src/containers/settings/EditSettingsScreen.js", + "start": { + "line": 58, + "column": 23 + }, + "end": { + "line": 61, + "column": 3 + } + }, + { + "id": "settings.app.form.enableGPUAcceleration", + "defaultMessage": "!!!Enable GPU Acceleration", + "file": "src/containers/settings/EditSettingsScreen.js", + "start": { + "line": 62, + "column": 25 + }, + "end": { + "line": 65, + "column": 3 + } + }, + { + "id": "settings.app.form.beta", + "defaultMessage": "!!!Include beta versions", + "file": "src/containers/settings/EditSettingsScreen.js", + "start": { + "line": 66, + "column": 8 + }, + "end": { + "line": 69, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/containers/settings/EditUserScreen.json b/src/i18n/messages/src/containers/settings/EditUserScreen.json new file mode 100644 index 000000000..70ff29945 --- /dev/null +++ b/src/i18n/messages/src/containers/settings/EditUserScreen.json @@ -0,0 +1,119 @@ +[ + { + "id": "settings.user.form.firstname", + "defaultMessage": "!!!Firstname", + "file": "src/containers/settings/EditUserScreen.js", + "start": { + "line": 14, + "column": 13 + }, + "end": { + "line": 17, + "column": 3 + } + }, + { + "id": "settings.user.form.lastname", + "defaultMessage": "!!!Lastname", + "file": "src/containers/settings/EditUserScreen.js", + "start": { + "line": 18, + "column": 12 + }, + "end": { + "line": 21, + "column": 3 + } + }, + { + "id": "settings.user.form.email", + "defaultMessage": "!!!Email", + "file": "src/containers/settings/EditUserScreen.js", + "start": { + "line": 22, + "column": 9 + }, + "end": { + "line": 25, + "column": 3 + } + }, + { + "id": "settings.user.form.accountType.label", + "defaultMessage": "!!!Account type", + "file": "src/containers/settings/EditUserScreen.js", + "start": { + "line": 26, + "column": 20 + }, + "end": { + "line": 29, + "column": 3 + } + }, + { + "id": "settings.user.form.accountType.individual", + "defaultMessage": "!!!Individual", + "file": "src/containers/settings/EditUserScreen.js", + "start": { + "line": 30, + "column": 25 + }, + "end": { + "line": 33, + "column": 3 + } + }, + { + "id": "settings.user.form.accountType.non-profit", + "defaultMessage": "!!!Non-Profit", + "file": "src/containers/settings/EditUserScreen.js", + "start": { + "line": 34, + "column": 24 + }, + "end": { + "line": 37, + "column": 3 + } + }, + { + "id": "settings.user.form.accountType.company", + "defaultMessage": "!!!Company", + "file": "src/containers/settings/EditUserScreen.js", + "start": { + "line": 38, + "column": 22 + }, + "end": { + "line": 41, + "column": 3 + } + }, + { + "id": "settings.user.form.currentPassword", + "defaultMessage": "!!!Current password", + "file": "src/containers/settings/EditUserScreen.js", + "start": { + "line": 42, + "column": 19 + }, + "end": { + "line": 45, + "column": 3 + } + }, + { + "id": "settings.user.form.newPassword", + "defaultMessage": "!!!New password", + "file": "src/containers/settings/EditUserScreen.js", + "start": { + "line": 46, + "column": 15 + }, + "end": { + "line": 49, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json b/src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json new file mode 100644 index 000000000..eb1b66916 --- /dev/null +++ b/src/i18n/messages/src/features/announcements/components/AnnouncementScreen.json @@ -0,0 +1,15 @@ +[ + { + "id": "feature.announcements.changelog.headline", + "defaultMessage": "!!!Changes in Franz {version}", + "file": "src/features/announcements/components/AnnouncementScreen.js", + "start": { + "line": 20, + "column": 12 + }, + "end": { + "line": 23, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/features/delayApp/Component.json b/src/i18n/messages/src/features/delayApp/Component.json new file mode 100644 index 000000000..bacd9444a --- /dev/null +++ b/src/i18n/messages/src/features/delayApp/Component.json @@ -0,0 +1,41 @@ +[ + { + "id": "feature.delayApp.headline", + "defaultMessage": "!!!Please purchase license to skip waiting", + "file": "src/features/delayApp/Component.js", + "start": { + "line": 15, + "column": 12 + }, + "end": { + "line": 18, + "column": 3 + } + }, + { + "id": "feature.delayApp.action", + "defaultMessage": "!!!Get a Franz Supporter License", + "file": "src/features/delayApp/Component.js", + "start": { + "line": 19, + "column": 10 + }, + "end": { + "line": 22, + "column": 3 + } + }, + { + "id": "feature.delayApp.text", + "defaultMessage": "!!!Franz will continue in {seconds} seconds.", + "file": "src/features/delayApp/Component.js", + "start": { + "line": 23, + "column": 8 + }, + "end": { + "line": 26, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/features/shareFranz/Component.json b/src/i18n/messages/src/features/shareFranz/Component.json new file mode 100644 index 000000000..34a43d5a0 --- /dev/null +++ b/src/i18n/messages/src/features/shareFranz/Component.json @@ -0,0 +1,93 @@ +[ + { + "id": "feature.shareFranz.headline", + "defaultMessage": "!!!Franz is better together!", + "file": "src/features/shareFranz/Component.js", + "start": { + "line": 15, + "column": 12 + }, + "end": { + "line": 18, + "column": 3 + } + }, + { + "id": "feature.shareFranz.text", + "defaultMessage": "!!!Tell your friends and colleagues how awesome Franz is and help us to spread the word.", + "file": "src/features/shareFranz/Component.js", + "start": { + "line": 19, + "column": 8 + }, + "end": { + "line": 22, + "column": 3 + } + }, + { + "id": "feature.shareFranz.action.email", + "defaultMessage": "!!!Share as email", + "file": "src/features/shareFranz/Component.js", + "start": { + "line": 23, + "column": 16 + }, + "end": { + "line": 26, + "column": 3 + } + }, + { + "id": "feature.shareFranz.action.facebook", + "defaultMessage": "!!!Share on Facebook", + "file": "src/features/shareFranz/Component.js", + "start": { + "line": 27, + "column": 19 + }, + "end": { + "line": 30, + "column": 3 + } + }, + { + "id": "feature.shareFranz.action.twitter", + "defaultMessage": "!!!Share on Twitter", + "file": "src/features/shareFranz/Component.js", + "start": { + "line": 31, + "column": 18 + }, + "end": { + "line": 34, + "column": 3 + } + }, + { + "id": "feature.shareFranz.shareText.email", + "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com", + "file": "src/features/shareFranz/Component.js", + "start": { + "line": 35, + "column": 18 + }, + "end": { + "line": 38, + "column": 3 + } + }, + { + "id": "feature.shareFranz.shareText.twitter", + "defaultMessage": "!!! I've added {count} services to Franz! Get the free app for WhatsApp, Messenger, Slack, Skype and co at www.meetfranz.com /cc @FranzMessenger", + "file": "src/features/shareFranz/Component.js", + "start": { + "line": 39, + "column": 20 + }, + "end": { + "line": 42, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/features/workspaces/components/CreateWorkspaceForm.json b/src/i18n/messages/src/features/workspaces/components/CreateWorkspaceForm.json new file mode 100644 index 000000000..f62bac42c --- /dev/null +++ b/src/i18n/messages/src/features/workspaces/components/CreateWorkspaceForm.json @@ -0,0 +1,28 @@ +[ + { + "id": "settings.workspace.add.form.submitButton", + "defaultMessage": "!!!Create workspace", + "file": "src/features/workspaces/components/CreateWorkspaceForm.js", + "start": { + "line": 13, + "column": 16 + }, + "end": { + "line": 16, + "column": 3 + } + }, + { + "id": "settings.workspace.add.form.name", + "defaultMessage": "!!!Name", + "file": "src/features/workspaces/components/CreateWorkspaceForm.js", + "start": { + "line": 17, + "column": 8 + }, + "end": { + "line": 20, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json b/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json new file mode 100644 index 000000000..7b0c3e1ce --- /dev/null +++ b/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json @@ -0,0 +1,67 @@ +[ + { + "id": "settings.workspace.form.buttonDelete", + "defaultMessage": "!!!Delete workspace", + "file": "src/features/workspaces/components/EditWorkspaceForm.js", + "start": { + "line": 19, + "column": 16 + }, + "end": { + "line": 22, + "column": 3 + } + }, + { + "id": "settings.workspace.form.buttonSave", + "defaultMessage": "!!!Save workspace", + "file": "src/features/workspaces/components/EditWorkspaceForm.js", + "start": { + "line": 23, + "column": 14 + }, + "end": { + "line": 26, + "column": 3 + } + }, + { + "id": "settings.workspace.form.name", + "defaultMessage": "!!!Name", + "file": "src/features/workspaces/components/EditWorkspaceForm.js", + "start": { + "line": 27, + "column": 8 + }, + "end": { + "line": 30, + "column": 3 + } + }, + { + "id": "settings.workspace.form.yourWorkspaces", + "defaultMessage": "!!!Your workspaces", + "file": "src/features/workspaces/components/EditWorkspaceForm.js", + "start": { + "line": 31, + "column": 18 + }, + "end": { + "line": 34, + "column": 3 + } + }, + { + "id": "settings.workspace.form.servicesInWorkspaceHeadline", + "defaultMessage": "!!!Services in this Workspace", + "file": "src/features/workspaces/components/EditWorkspaceForm.js", + "start": { + "line": 35, + "column": 31 + }, + "end": { + "line": 38, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json new file mode 100644 index 000000000..9f0935620 --- /dev/null +++ b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawer.json @@ -0,0 +1,106 @@ +[ + { + "id": "workspaceDrawer.headline", + "defaultMessage": "!!!Workspaces", + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "start": { + "line": 16, + "column": 12 + }, + "end": { + "line": 19, + "column": 3 + } + }, + { + "id": "workspaceDrawer.allServices", + "defaultMessage": "!!!All services", + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "start": { + "line": 20, + "column": 15 + }, + "end": { + "line": 23, + "column": 3 + } + }, + { + "id": "workspaceDrawer.workspacesSettingsTooltip", + "defaultMessage": "!!!Workspaces settings", + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "start": { + "line": 24, + "column": 29 + }, + "end": { + "line": 27, + "column": 3 + } + }, + { + "id": "workspaceDrawer.workspaceFeatureInfo", + "defaultMessage": "!!!Info about workspace feature", + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "start": { + "line": 28, + "column": 24 + }, + "end": { + "line": 31, + "column": 3 + } + }, + { + "id": "workspaceDrawer.premiumCtaButtonLabel", + "defaultMessage": "!!!Create your first workspace", + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "start": { + "line": 32, + "column": 25 + }, + "end": { + "line": 35, + "column": 3 + } + }, + { + "id": "workspaceDrawer.reactivatePremiumAccountLabel", + "defaultMessage": "!!!Reactivate premium account", + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "start": { + "line": 36, + "column": 28 + }, + "end": { + "line": 39, + "column": 3 + } + }, + { + "id": "workspaceDrawer.addNewWorkspaceLabel", + "defaultMessage": "!!!add new workspace", + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "start": { + "line": 40, + "column": 24 + }, + "end": { + "line": 43, + "column": 3 + } + }, + { + "id": "workspaceDrawer.proFeatureBadge", + "defaultMessage": "!!!Premium feature", + "file": "src/features/workspaces/components/WorkspaceDrawer.js", + "start": { + "line": 44, + "column": 23 + }, + "end": { + "line": 47, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawerItem.json b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawerItem.json new file mode 100644 index 000000000..4ff190606 --- /dev/null +++ b/src/i18n/messages/src/features/workspaces/components/WorkspaceDrawerItem.json @@ -0,0 +1,28 @@ +[ + { + "id": "workspaceDrawer.item.noServicesAddedYet", + "defaultMessage": "!!!No services added yet", + "file": "src/features/workspaces/components/WorkspaceDrawerItem.js", + "start": { + "line": 12, + "column": 22 + }, + "end": { + "line": 15, + "column": 3 + } + }, + { + "id": "workspaceDrawer.item.contextMenuEdit", + "defaultMessage": "!!!edit", + "file": "src/features/workspaces/components/WorkspaceDrawerItem.js", + "start": { + "line": 16, + "column": 19 + }, + "end": { + "line": 19, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspaceSwitchingIndicator.json b/src/i18n/messages/src/features/workspaces/components/WorkspaceSwitchingIndicator.json new file mode 100644 index 000000000..4f3e6d55c --- /dev/null +++ b/src/i18n/messages/src/features/workspaces/components/WorkspaceSwitchingIndicator.json @@ -0,0 +1,15 @@ +[ + { + "id": "workspaces.switchingIndicator.switchingTo", + "defaultMessage": "!!!Switching to", + "file": "src/features/workspaces/components/WorkspaceSwitchingIndicator.js", + "start": { + "line": 12, + "column": 15 + }, + "end": { + "line": 15, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json new file mode 100644 index 000000000..ef8f1bebc --- /dev/null +++ b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json @@ -0,0 +1,106 @@ +[ + { + "id": "settings.workspaces.headline", + "defaultMessage": "!!!Your workspaces", + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "start": { + "line": 17, + "column": 12 + }, + "end": { + "line": 20, + "column": 3 + } + }, + { + "id": "settings.workspaces.noWorkspacesAdded", + "defaultMessage": "!!!You haven't added any workspaces yet.", + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "start": { + "line": 21, + "column": 19 + }, + "end": { + "line": 24, + "column": 3 + } + }, + { + "id": "settings.workspaces.workspacesRequestFailed", + "defaultMessage": "!!!Could not load your workspaces", + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "start": { + "line": 25, + "column": 27 + }, + "end": { + "line": 28, + "column": 3 + } + }, + { + "id": "settings.workspaces.tryReloadWorkspaces", + "defaultMessage": "!!!Try again", + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "start": { + "line": 29, + "column": 23 + }, + "end": { + "line": 32, + "column": 3 + } + }, + { + "id": "settings.workspaces.updatedInfo", + "defaultMessage": "!!!Your changes have been saved", + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "start": { + "line": 33, + "column": 15 + }, + "end": { + "line": 36, + "column": 3 + } + }, + { + "id": "settings.workspaces.deletedInfo", + "defaultMessage": "!!!Workspace has been deleted", + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "start": { + "line": 37, + "column": 15 + }, + "end": { + "line": 40, + "column": 3 + } + }, + { + "id": "settings.workspaces.workspaceFeatureInfo", + "defaultMessage": "!!!Info about workspace feature", + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "start": { + "line": 41, + "column": 24 + }, + "end": { + "line": 44, + "column": 3 + } + }, + { + "id": "settings.workspaces.workspaceFeatureHeadline", + "defaultMessage": "!!!Less is More: Introducing Franz Workspaces", + "file": "src/features/workspaces/components/WorkspacesDashboard.js", + "start": { + "line": 45, + "column": 28 + }, + "end": { + "line": 48, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/helpers/validation-helpers.json b/src/i18n/messages/src/helpers/validation-helpers.json new file mode 100644 index 000000000..86bfe1500 --- /dev/null +++ b/src/i18n/messages/src/helpers/validation-helpers.json @@ -0,0 +1,67 @@ +[ + { + "id": "validation.required", + "defaultMessage": "!!!Field is required", + "file": "src/helpers/validation-helpers.js", + "start": { + "line": 4, + "column": 12 + }, + "end": { + "line": 7, + "column": 3 + } + }, + { + "id": "validation.email", + "defaultMessage": "!!!Email not valid", + "file": "src/helpers/validation-helpers.js", + "start": { + "line": 8, + "column": 9 + }, + "end": { + "line": 11, + "column": 3 + } + }, + { + "id": "validation.url", + "defaultMessage": "!!!Not a valid URL", + "file": "src/helpers/validation-helpers.js", + "start": { + "line": 12, + "column": 7 + }, + "end": { + "line": 15, + "column": 3 + } + }, + { + "id": "validation.minLength", + "defaultMessage": "!!!Too few characters", + "file": "src/helpers/validation-helpers.js", + "start": { + "line": 16, + "column": 13 + }, + "end": { + "line": 19, + "column": 3 + } + }, + { + "id": "validation.oneRequired", + "defaultMessage": "!!!At least one is required", + "file": "src/helpers/validation-helpers.js", + "start": { + "line": 20, + "column": 15 + }, + "end": { + "line": 23, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/i18n/globalMessages.json b/src/i18n/messages/src/i18n/globalMessages.json new file mode 100644 index 000000000..28001614f --- /dev/null +++ b/src/i18n/messages/src/i18n/globalMessages.json @@ -0,0 +1,80 @@ +[ + { + "id": "global.api.unhealthy", + "defaultMessage": "!!!Can't connect to Franz Online Services", + "file": "src/i18n/globalMessages.js", + "start": { + "line": 4, + "column": 16 + }, + "end": { + "line": 7, + "column": 3 + } + }, + { + "id": "global.notConnectedToTheInternet", + "defaultMessage": "!!!You are not connected to the internet.", + "file": "src/i18n/globalMessages.js", + "start": { + "line": 8, + "column": 29 + }, + "end": { + "line": 11, + "column": 3 + } + }, + { + "id": "global.spellchecking.language", + "defaultMessage": "!!!Spell checking language", + "file": "src/i18n/globalMessages.js", + "start": { + "line": 12, + "column": 24 + }, + "end": { + "line": 15, + "column": 3 + } + }, + { + "id": "global.spellchecker.useDefault", + "defaultMessage": "!!!Use System Default ({default})", + "file": "src/i18n/globalMessages.js", + "start": { + "line": 16, + "column": 29 + }, + "end": { + "line": 19, + "column": 3 + } + }, + { + "id": "global.spellchecking.autodetect", + "defaultMessage": "!!!Detect language automatically", + "file": "src/i18n/globalMessages.js", + "start": { + "line": 20, + "column": 34 + }, + "end": { + "line": 23, + "column": 3 + } + }, + { + "id": "global.spellchecking.autodetect.short", + "defaultMessage": "!!!Automatic", + "file": "src/i18n/globalMessages.js", + "start": { + "line": 24, + "column": 39 + }, + "end": { + "line": 27, + "column": 3 + } + } +] \ No newline at end of file diff --git a/src/i18n/messages/src/lib/Menu.json b/src/i18n/messages/src/lib/Menu.json new file mode 100644 index 000000000..a2ce34cd4 --- /dev/null +++ b/src/i18n/messages/src/lib/Menu.json @@ -0,0 +1,691 @@ +[ + { + "id": "menu.edit", + "defaultMessage": "!!!Edit", + "file": "src/lib/Menu.js", + "start": { + "line": 14, + "column": 8 + }, + "end": { + "line": 17, + "column": 3 + } + }, + { + "id": "menu.edit.undo", + "defaultMessage": "!!!Undo", + "file": "src/lib/Menu.js", + "start": { + "line": 18, + "column": 8 + }, + "end": { + "line": 21, + "column": 3 + } + }, + { + "id": "menu.edit.redo", + "defaultMessage": "!!!Redo", + "file": "src/lib/Menu.js", + "start": { + "line": 22, + "column": 8 + }, + "end": { + "line": 25, + "column": 3 + } + }, + { + "id": "menu.edit.cut", + "defaultMessage": "!!!Cut", + "file": "src/lib/Menu.js", + "start": { + "line": 26, + "column": 7 + }, + "end": { + "line": 29, + "column": 3 + } + }, + { + "id": "menu.edit.copy", + "defaultMessage": "!!!Copy", + "file": "src/lib/Menu.js", + "start": { + "line": 30, + "column": 8 + }, + "end": { + "line": 33, + "column": 3 + } + }, + { + "id": "menu.edit.paste", + "defaultMessage": "!!!Paste", + "file": "src/lib/Menu.js", + "start": { + "line": 34, + "column": 9 + }, + "end": { + "line": 37, + "column": 3 + } + }, + { + "id": "menu.edit.pasteAndMatchStyle", + "defaultMessage": "!!!Paste And Match Style", + "file": "src/lib/Menu.js", + "start": { + "line": 38, + "column": 22 + }, + "end": { + "line": 41, + "column": 3 + } + }, + { + "id": "menu.edit.delete", + "defaultMessage": "!!!Delete", + "file": "src/lib/Menu.js", + "start": { + "line": 42, + "column": 10 + }, + "end": { + "line": 45, + "column": 3 + } + }, + { + "id": "menu.edit.selectAll", + "defaultMessage": "!!!Select All", + "file": "src/lib/Menu.js", + "start": { + "line": 46, + "column": 13 + }, + "end": { + "line": 49, + "column": 3 + } + }, + { + "id": "menu.edit.speech", + "defaultMessage": "!!!Speech", + "file": "src/lib/Menu.js", + "start": { + "line": 50, + "column": 10 + }, + "end": { + "line": 53, + "column": 3 + } + }, + { + "id": "menu.edit.startSpeaking", + "defaultMessage": "!!!Start Speaking", + "file": "src/lib/Menu.js", + "start": { + "line": 54, + "column": 17 + }, + "end": { + "line": 57, + "column": 3 + } + }, + { + "id": "menu.edit.stopSpeaking", + "defaultMessage": "!!!Stop Speaking", + "file": "src/lib/Menu.js", + "start": { + "line": 58, + "column": 16 + }, + "end": { + "line": 61, + "column": 3 + } + }, + { + "id": "menu.edit.startDictation", + "defaultMessage": "!!!Start Dictation", + "file": "src/lib/Menu.js", + "start": { + "line": 62, + "column": 18 + }, + "end": { + "line": 65, + "column": 3 + } + }, + { + "id": "menu.edit.emojiSymbols", + "defaultMessage": "!!!Emoji & Symbols", + "file": "src/lib/Menu.js", + "start": { + "line": 66, + "column": 16 + }, + "end": { + "line": 69, + "column": 3 + } + }, + { + "id": "menu.view.resetZoom", + "defaultMessage": "!!!Actual Size", + "file": "src/lib/Menu.js", + "start": { + "line": 70, + "column": 13 + }, + "end": { + "line": 73, + "column": 3 + } + }, + { + "id": "menu.view.zoomIn", + "defaultMessage": "!!!Zoom In", + "file": "src/lib/Menu.js", + "start": { + "line": 74, + "column": 10 + }, + "end": { + "line": 77, + "column": 3 + } + }, + { + "id": "menu.view.zoomOut", + "defaultMessage": "!!!Zoom Out", + "file": "src/lib/Menu.js", + "start": { + "line": 78, + "column": 11 + }, + "end": { + "line": 81, + "column": 3 + } + }, + { + "id": "menu.view.enterFullScreen", + "defaultMessage": "!!!Enter Full Screen", + "file": "src/lib/Menu.js", + "start": { + "line": 82, + "column": 19 + }, + "end": { + "line": 85, + "column": 3 + } + }, + { + "id": "menu.view.exitFullScreen", + "defaultMessage": "!!!Exit Full Screen", + "file": "src/lib/Menu.js", + "start": { + "line": 86, + "column": 18 + }, + "end": { + "line": 89, + "column": 3 + } + }, + { + "id": "menu.view.toggleFullScreen", + "defaultMessage": "!!!Toggle Full Screen", + "file": "src/lib/Menu.js", + "start": { + "line": 90, + "column": 20 + }, + "end": { + "line": 93, + "column": 3 + } + }, + { + "id": "menu.view.toggleDevTools", + "defaultMessage": "!!!Toggle Developer Tools", + "file": "src/lib/Menu.js", + "start": { + "line": 94, + "column": 18 + }, + "end": { + "line": 97, + "column": 3 + } + }, + { + "id": "menu.view.toggleServiceDevTools", + "defaultMessage": "!!!Toggle Service Developer Tools", + "file": "src/lib/Menu.js", + "start": { + "line": 98, + "column": 25 + }, + "end": { + "line": 101, + "column": 3 + } + }, + { + "id": "menu.view.reloadService", + "defaultMessage": "!!!Reload Service", + "file": "src/lib/Menu.js", + "start": { + "line": 102, + "column": 17 + }, + "end": { + "line": 105, + "column": 3 + } + }, + { + "id": "menu.view.reloadFranz", + "defaultMessage": "!!!Reload Franz", + "file": "src/lib/Menu.js", + "start": { + "line": 106, + "column": 15 + }, + "end": { + "line": 109, + "column": 3 + } + }, + { + "id": "menu.window.minimize", + "defaultMessage": "!!!Minimize", + "file": "src/lib/Menu.js", + "start": { + "line": 110, + "column": 12 + }, + "end": { + "line": 113, + "column": 3 + } + }, + { + "id": "menu.window.close", + "defaultMessage": "!!!Close", + "file": "src/lib/Menu.js", + "start": { + "line": 114, + "column": 9 + }, + "end": { + "line": 117, + "column": 3 + } + }, + { + "id": "menu.help.learnMore", + "defaultMessage": "!!!Learn More", + "file": "src/lib/Menu.js", + "start": { + "line": 118, + "column": 13 + }, + "end": { + "line": 121, + "column": 3 + } + }, + { + "id": "menu.help.changelog", + "defaultMessage": "!!!Changelog", + "file": "src/lib/Menu.js", + "start": { + "line": 122, + "column": 13 + }, + "end": { + "line": 125, + "column": 3 + } + }, + { + "id": "menu.help.support", + "defaultMessage": "!!!Support", + "file": "src/lib/Menu.js", + "start": { + "line": 126, + "column": 11 + }, + "end": { + "line": 129, + "column": 3 + } + }, + { + "id": "menu.help.tos", + "defaultMessage": "!!!Terms of Service", + "file": "src/lib/Menu.js", + "start": { + "line": 130, + "column": 7 + }, + "end": { + "line": 133, + "column": 3 + } + }, + { + "id": "menu.help.privacy", + "defaultMessage": "!!!Privacy Statement", + "file": "src/lib/Menu.js", + "start": { + "line": 134, + "column": 11 + }, + "end": { + "line": 137, + "column": 3 + } + }, + { + "id": "menu.file", + "defaultMessage": "!!!File", + "file": "src/lib/Menu.js", + "start": { + "line": 138, + "column": 8 + }, + "end": { + "line": 141, + "column": 3 + } + }, + { + "id": "menu.view", + "defaultMessage": "!!!View", + "file": "src/lib/Menu.js", + "start": { + "line": 142, + "column": 8 + }, + "end": { + "line": 145, + "column": 3 + } + }, + { + "id": "menu.services", + "defaultMessage": "!!!Services", + "file": "src/lib/Menu.js", + "start": { + "line": 146, + "column": 12 + }, + "end": { + "line": 149, + "column": 3 + } + }, + { + "id": "menu.window", + "defaultMessage": "!!!Window", + "file": "src/lib/Menu.js", + "start": { + "line": 150, + "column": 10 + }, + "end": { + "line": 153, + "column": 3 + } + }, + { + "id": "menu.help", + "defaultMessage": "!!!Help", + "file": "src/lib/Menu.js", + "start": { + "line": 154, + "column": 8 + }, + "end": { + "line": 157, + "column": 3 + } + }, + { + "id": "menu.app.about", + "defaultMessage": "!!!About Franz", + "file": "src/lib/Menu.js", + "start": { + "line": 158, + "column": 9 + }, + "end": { + "line": 161, + "column": 3 + } + }, + { + "id": "menu.app.announcement", + "defaultMessage": "!!!What's new?", + "file": "src/lib/Menu.js", + "start": { + "line": 162, + "column": 16 + }, + "end": { + "line": 165, + "column": 3 + } + }, + { + "id": "menu.app.settings", + "defaultMessage": "!!!Settings", + "file": "src/lib/Menu.js", + "start": { + "line": 166, + "column": 12 + }, + "end": { + "line": 169, + "column": 3 + } + }, + { + "id": "menu.app.hide", + "defaultMessage": "!!!Hide", + "file": "src/lib/Menu.js", + "start": { + "line": 170, + "column": 8 + }, + "end": { + "line": 173, + "column": 3 + } + }, + { + "id": "menu.app.hideOthers", + "defaultMessage": "!!!Hide Others", + "file": "src/lib/Menu.js", + "start": { + "line": 174, + "column": 14 + }, + "end": { + "line": 177, + "column": 3 + } + }, + { + "id": "menu.app.unhide", + "defaultMessage": "!!!Unhide", + "file": "src/lib/Menu.js", + "start": { + "line": 178, + "column": 10 + }, + "end": { + "line": 181, + "column": 3 + } + }, + { + "id": "menu.app.quit", + "defaultMessage": "!!!Quit", + "file": "src/lib/Menu.js", + "start": { + "line": 182, + "column": 8 + }, + "end": { + "line": 185, + "column": 3 + } + }, + { + "id": "menu.services.addNewService", + "defaultMessage": "!!!Add New Service...", + "file": "src/lib/Menu.js", + "start": { + "line": 186, + "column": 17 + }, + "end": { + "line": 189, + "column": 3 + } + }, + { + "id": "menu.workspaces.addNewWorkspace", + "defaultMessage": "!!!Add New Workspace...", + "file": "src/lib/Menu.js", + "start": { + "line": 190, + "column": 19 + }, + "end": { + "line": 193, + "column": 3 + } + }, + { + "id": "menu.workspaces.openWorkspaceDrawer", + "defaultMessage": "!!!Open workspace drawer", + "file": "src/lib/Menu.js", + "start": { + "line": 194, + "column": 23 + }, + "end": { + "line": 197, + "column": 3 + } + }, + { + "id": "menu.workspaces.closeWorkspaceDrawer", + "defaultMessage": "!!!Close workspace drawer", + "file": "src/lib/Menu.js", + "start": { + "line": 198, + "column": 24 + }, + "end": { + "line": 201, + "column": 3 + } + }, + { + "id": "menu.services.setNextServiceActive", + "defaultMessage": "!!!Activate next service...", + "file": "src/lib/Menu.js", + "start": { + "line": 202, + "column": 23 + }, + "end": { + "line": 205, + "column": 3 + } + }, + { + "id": "menu.services.activatePreviousService", + "defaultMessage": "!!!Activate previous service...", + "file": "src/lib/Menu.js", + "start": { + "line": 206, + "column": 27 + }, + "end": { + "line": 209, + "column": 3 + } + }, + { + "id": "sidebar.muteApp", + "defaultMessage": "!!!Disable notifications & audio", + "file": "src/lib/Menu.js", + "start": { + "line": 210, + "column": 11 + }, + "end": { + "line": 213, + "column": 3 + } + }, + { + "id": "sidebar.unmuteApp", + "defaultMessage": "!!!Enable notifications & audio", + "file": "src/lib/Menu.js", + "start": { + "line": 214, + "column": 13 + }, + "end": { + "line": 217, + "column": 3 + } + }, + { + "id": "menu.workspaces", + "defaultMessage": "!!!Workspaces", + "file": "src/lib/Menu.js", + "start": { + "line": 218, + "column": 14 + }, + "end": { + "line": 221, + "column": 3 + } + }, + { + "id": "menu.workspaces.defaultWorkspace", + "defaultMessage": "!!!Default", + "file": "src/lib/Menu.js", + "start": { + "line": 222, + "column": 20 + }, + "end": { + "line": 225, + "column": 3 + } + } +] \ No newline at end of file -- cgit v1.2.3-54-g00ecf From 48a0a1e963c27d633f6b0dd736e27ac2215586c5 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Fri, 12 Apr 2019 16:15:11 +0200 Subject: fixes last issues with announcement logic --- src/actions/lib/actions.js | 2 +- .../announcements/components/AnnouncementScreen.js | 100 ++++++++++----------- src/features/announcements/store.js | 5 -- src/features/utils/FeatureStore.js | 1 - src/i18n/locales/en-US.json | 2 +- 5 files changed, 52 insertions(+), 58 deletions(-) diff --git a/src/actions/lib/actions.js b/src/actions/lib/actions.js index 2bc7d2711..b38db9946 100644 --- a/src/actions/lib/actions.js +++ b/src/actions/lib/actions.js @@ -1,7 +1,7 @@ export const createActionsFromDefinitions = (actionDefinitions, validate) => { const actions = {}; Object.keys(actionDefinitions).forEach((actionName) => { - const action = (params) => { + const action = (params = {}) => { const schema = actionDefinitions[actionName]; validate(schema, params, actionName); action.notify(params); diff --git a/src/features/announcements/components/AnnouncementScreen.js b/src/features/announcements/components/AnnouncementScreen.js index 13cb6aab0..dfce6cdd5 100644 --- a/src/features/announcements/components/AnnouncementScreen.js +++ b/src/features/announcements/components/AnnouncementScreen.js @@ -205,65 +205,65 @@ class AnnouncementScreen extends Component { const { changelog, announcement } = announcementsStore; const themeImage = stores.ui.isDarkThemeActive ? 'dark' : 'light'; return ( -
-
-
-

{announcement.main.headline}

-

{announcement.main.subHeadline}

-
-
- -
-
-
-
-
-
- {announcement.spotlight && ( -
-
-

{announcement.spotlight.title}

-

{announcement.spotlight.subject}

-
-
-
-
-
-
- )} -
+ )} +
+ )} {changelog && (

diff --git a/src/features/announcements/store.js b/src/features/announcements/store.js index b99309ca7..0bebf29fd 100644 --- a/src/features/announcements/store.js +++ b/src/features/announcements/store.js @@ -111,16 +111,11 @@ export class AnnouncementsStore extends FeatureStore { // Check if there is an announcement and on't show announcements to new users if (!announcement || isNewUser) return; - this._showAnnouncement(); - // Check if the user has already used current version (= has seen the announcement) const { currentVersion, lastSeenAnnouncementVersion } = this; if (semver.gt(currentVersion, lastSeenAnnouncementVersion)) { debug(`${currentVersion} < ${lastSeenAnnouncementVersion}: announcement is shown`); this._showAnnouncement(); - } else { - debug(`${currentVersion} >= ${lastSeenAnnouncementVersion}: announcement is hidden`); - this._hideAnnouncement(); } }; diff --git a/src/features/utils/FeatureStore.js b/src/features/utils/FeatureStore.js index 967e745b2..b6e0fbce3 100644 --- a/src/features/utils/FeatureStore.js +++ b/src/features/utils/FeatureStore.js @@ -18,7 +18,6 @@ export class FeatureStore { } _startActions(actions = this._actions) { - console.log(actions); actions.forEach(a => a.start()); } diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 70b869557..5bb10438a 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -320,4 +320,4 @@ "workspaceDrawer.workspaceFeatureInfo": "

Franz Workspaces let you focus on what’s important right now. Set up different sets of services and easily switch between them at any time.

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.

", "workspaceDrawer.workspacesSettingsTooltip": "Edit workspaces settings", "workspaces.switchingIndicator.switchingTo": "Switching to" -} +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf From 84dfa95dfb558fcd46f92f901135a5dd847fb061 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Fri, 12 Apr 2019 16:35:34 +0200 Subject: cleanup console log artifacts --- src/api/server/ServerApi.js | 4 ++-- src/stores/AppStore.js | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/api/server/ServerApi.js b/src/api/server/ServerApi.js index bafeef005..ab27e92bf 100644 --- a/src/api/server/ServerApi.js +++ b/src/api/server/ServerApi.js @@ -268,7 +268,7 @@ export default class ServerApi { const data = await request.json(); const features = data; - console.debug('ServerApi::getDefaultFeatures resolves', features); + debug('ServerApi::getDefaultFeatures resolves', features); return features; } @@ -280,7 +280,7 @@ export default class ServerApi { const data = await request.json(); const features = data; - console.debug('ServerApi::getFeatures resolves', features); + debug('ServerApi::getFeatures resolves', features); return features; } diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js index 351ad6422..ca0c9175b 100644 --- a/src/stores/AppStore.js +++ b/src/stores/AppStore.js @@ -172,7 +172,6 @@ export default class AppStore extends Store { reaction(() => this.stores.router.location.pathname, (pathname) => { gaPage(pathname); }); - console.log('router location', this.stores.router.location); } @computed get cacheSize() { -- cgit v1.2.3-54-g00ecf From 9620db3443c70d6f92b55725ed07a17adda8cea4 Mon Sep 17 00:00:00 2001 From: Dominik Guzei Date: Fri, 12 Apr 2019 17:18:19 +0200 Subject: link to in-app changelog on new update notification --- src/components/layout/AppLayout.js | 12 +++++++++-- src/containers/layout/AppLayoutContainer.js | 1 + src/electron/ipc-api/autoUpdate.js | 7 +++++-- src/i18n/locales/defaultMessages.json | 24 +++++++++++----------- .../messages/src/components/layout/AppLayout.json | 24 +++++++++++----------- src/stores/AppStore.js | 4 +++- src/styles/info-bar.scss | 4 ++++ 7 files changed, 47 insertions(+), 29 deletions(-) diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js index eb3f03f12..d5febfaf4 100644 --- a/src/components/layout/AppLayout.js +++ b/src/components/layout/AppLayout.js @@ -17,6 +17,7 @@ import { isWindows } from '../../environment'; import AnnouncementScreen from '../../features/announcements/components/AnnouncementScreen'; import WorkspaceSwitchingIndicator from '../../features/workspaces/components/WorkspaceSwitchingIndicator'; import { workspaceStore } from '../../features/workspaces'; +import { announcementActions } from '../../features/announcements/actions'; function createMarkup(HTMLString) { return { __html: HTMLString }; @@ -72,6 +73,7 @@ class AppLayout extends Component { // isOnline: PropTypes.bool.isRequired, showServicesUpdatedInfoBar: PropTypes.bool.isRequired, appUpdateIsDownloaded: PropTypes.bool.isRequired, + nextAppReleaseVersion: PropTypes.string, removeNewsItem: PropTypes.func.isRequired, reloadServicesAfterUpdate: PropTypes.func.isRequired, installAppUpdate: PropTypes.func.isRequired, @@ -86,6 +88,7 @@ class AppLayout extends Component { static defaultProps = { children: [], + nextAppReleaseVersion: null, }; static contextTypes = { @@ -104,6 +107,7 @@ class AppLayout extends Component { news, showServicesUpdatedInfoBar, appUpdateIsDownloaded, + nextAppReleaseVersion, removeNewsItem, reloadServicesAfterUpdate, installAppUpdate, @@ -181,9 +185,13 @@ class AppLayout extends Component { {intl.formatMessage(messages.updateAvailable)} {' '} - + )} {isDelayAppScreenVisible && ()} diff --git a/src/containers/layout/AppLayoutContainer.js b/src/containers/layout/AppLayoutContainer.js index 8c1d2dfc1..d2891a6a4 100644 --- a/src/containers/layout/AppLayoutContainer.js +++ b/src/containers/layout/AppLayoutContainer.js @@ -136,6 +136,7 @@ export default @inject('stores', 'actions') @observer class AppLayoutContainer e isOnline={app.isOnline} showServicesUpdatedInfoBar={ui.showServicesUpdatedInfoBar} appUpdateIsDownloaded={app.updateStatus === app.updateStatusTypes.DOWNLOADED} + nextAppReleaseVersion={app.nextAppReleaseVersion} sidebar={sidebar} workspacesDrawer={workspacesDrawer} services={servicesContainer} diff --git a/src/electron/ipc-api/autoUpdate.js b/src/electron/ipc-api/autoUpdate.js index 74b718734..9a04c1958 100644 --- a/src/electron/ipc-api/autoUpdate.js +++ b/src/electron/ipc-api/autoUpdate.js @@ -30,9 +30,12 @@ export default (params) => { params.mainWindow.webContents.send('autoUpdate', { available: false }); }); - autoUpdater.on('update-available', () => { + autoUpdater.on('update-available', (event) => { debug('update-available'); - params.mainWindow.webContents.send('autoUpdate', { available: true }); + params.mainWindow.webContents.send('autoUpdate', { + version: event.version, + available: true, + }); }); autoUpdater.on('download-progress', (progressObj) => { diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 3323aa310..df7f04a06 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -625,78 +625,78 @@ "defaultMessage": "!!!Your services have been updated.", "end": { "column": 3, - "line": 29 + "line": 30 }, "file": "src/components/layout/AppLayout.js", "id": "infobar.servicesUpdated", "start": { "column": 19, - "line": 26 + "line": 27 } }, { "defaultMessage": "!!!A new update for Franz is available.", "end": { "column": 3, - "line": 33 + "line": 34 }, "file": "src/components/layout/AppLayout.js", "id": "infobar.updateAvailable", "start": { "column": 19, - "line": 30 + "line": 31 } }, { "defaultMessage": "!!!Reload services", "end": { "column": 3, - "line": 37 + "line": 38 }, "file": "src/components/layout/AppLayout.js", "id": "infobar.buttonReloadServices", "start": { "column": 24, - "line": 34 + "line": 35 } }, { "defaultMessage": "!!!Changelog", "end": { "column": 3, - "line": 41 + "line": 42 }, "file": "src/components/layout/AppLayout.js", "id": "infobar.buttonChangelog", "start": { "column": 13, - "line": 38 + "line": 39 } }, { "defaultMessage": "!!!Restart & install update", "end": { "column": 3, - "line": 45 + "line": 46 }, "file": "src/components/layout/AppLayout.js", "id": "infobar.buttonInstallUpdate", "start": { "column": 23, - "line": 42 + "line": 43 } }, { "defaultMessage": "!!!Could not load services and user information", "end": { "column": 3, - "line": 49 + "line": 50 }, "file": "src/components/layout/AppLayout.js", "id": "infobar.requiredRequestsFailed", "start": { "column": 26, - "line": 46 + "line": 47 } } ], diff --git a/src/i18n/messages/src/components/layout/AppLayout.json b/src/i18n/messages/src/components/layout/AppLayout.json index 4dd354afc..26b8ce040 100644 --- a/src/i18n/messages/src/components/layout/AppLayout.json +++ b/src/i18n/messages/src/components/layout/AppLayout.json @@ -4,11 +4,11 @@ "defaultMessage": "!!!Your services have been updated.", "file": "src/components/layout/AppLayout.js", "start": { - "line": 26, + "line": 27, "column": 19 }, "end": { - "line": 29, + "line": 30, "column": 3 } }, @@ -17,11 +17,11 @@ "defaultMessage": "!!!A new update for Franz is available.", "file": "src/components/layout/AppLayout.js", "start": { - "line": 30, + "line": 31, "column": 19 }, "end": { - "line": 33, + "line": 34, "column": 3 } }, @@ -30,11 +30,11 @@ "defaultMessage": "!!!Reload services", "file": "src/components/layout/AppLayout.js", "start": { - "line": 34, + "line": 35, "column": 24 }, "end": { - "line": 37, + "line": 38, "column": 3 } }, @@ -43,11 +43,11 @@ "defaultMessage": "!!!Changelog", "file": "src/components/layout/AppLayout.js", "start": { - "line": 38, + "line": 39, "column": 13 }, "end": { - "line": 41, + "line": 42, "column": 3 } }, @@ -56,11 +56,11 @@ "defaultMessage": "!!!Restart & install update", "file": "src/components/layout/AppLayout.js", "start": { - "line": 42, + "line": 43, "column": 23 }, "end": { - "line": 45, + "line": 46, "column": 3 } }, @@ -69,11 +69,11 @@ "defaultMessage": "!!!Could not load services and user information", "file": "src/components/layout/AppLayout.js", "start": { - "line": 46, + "line": 47, "column": 26 }, "end": { - "line": 49, + "line": 50, "column": 3 } } diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js index ca0c9175b..e68e797ef 100644 --- a/src/stores/AppStore.js +++ b/src/stores/AppStore.js @@ -67,6 +67,8 @@ export default class AppStore extends Store { @observable isFocused = true; + @observable nextAppReleaseVersion = null; + dictionaries = []; constructor(...args) { @@ -123,7 +125,7 @@ export default class AppStore extends Store { ipcRenderer.on('autoUpdate', (event, data) => { if (data.available) { this.updateStatus = this.updateStatusTypes.AVAILABLE; - + this.nextAppReleaseVersion = data.version; if (isMac) { app.dock.bounce(); } diff --git a/src/styles/info-bar.scss b/src/styles/info-bar.scss index fb4917358..d3010942f 100644 --- a/src/styles/info-bar.scss +++ b/src/styles/info-bar.scss @@ -43,6 +43,10 @@ } } + .info-bar__inline-button { + color: white; + } + &.info-bar--bottom { order: 10; } &.info-bar--primary { -- cgit v1.2.3-54-g00ecf