aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.eslintrc3
-rw-r--r--.gitignore1
-rw-r--r--package-lock.json322
-rw-r--r--packages/forms/src/input/index.tsx10
-rw-r--r--src/actions/index.js6
-rw-r--r--src/actions/lib/actions.js29
-rw-r--r--src/api/utils/auth.js28
-rw-r--r--src/app.js4
-rw-r--r--src/components/layout/Sidebar.js2
-rw-r--r--src/components/services/tabs/Tabbar.js4
-rw-r--r--src/components/settings/navigation/SettingsNavigation.js12
-rw-r--r--src/config.js2
-rw-r--r--src/environment.js1
-rw-r--r--src/features/delayApp/Component.js2
-rw-r--r--src/features/workspaces/actions.js22
-rw-r--r--src/features/workspaces/api.js39
-rw-r--r--src/features/workspaces/components/CreateWorkspaceForm.js93
-rw-r--r--src/features/workspaces/components/EditWorkspaceForm.js192
-rw-r--r--src/features/workspaces/components/ServiceListItem.js48
-rw-r--r--src/features/workspaces/components/WorkspaceItem.js42
-rw-r--r--src/features/workspaces/components/WorkspacesDashboard.js85
-rw-r--r--src/features/workspaces/containers/EditWorkspaceScreen.js59
-rw-r--r--src/features/workspaces/containers/WorkspacesScreen.js33
-rw-r--r--src/features/workspaces/index.js67
-rw-r--r--src/features/workspaces/models/Workspace.js25
-rw-r--r--src/features/workspaces/state.js15
-rw-r--r--src/features/workspaces/store.js114
-rw-r--r--src/features/workspaces/styles/workspaces-table.scss53
-rw-r--r--src/i18n/locales/de.json12
-rw-r--r--src/i18n/locales/defaultMessages.json388
-rw-r--r--src/i18n/locales/en-US.json13
-rw-r--r--src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json29
-rw-r--r--src/i18n/messages/src/features/workspaces/components/CreateWorkspaceForm.json28
-rw-r--r--src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json67
-rw-r--r--src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json28
-rw-r--r--src/i18n/messages/src/lib/Menu.json227
-rw-r--r--src/lib/Menu.js67
-rw-r--r--src/stores/FeaturesStore.js4
-rw-r--r--src/stores/ServicesStore.js9
-rw-r--r--src/styles/main.scss3
40 files changed, 1804 insertions, 384 deletions
diff --git a/.eslintrc b/.eslintrc
index e15148e96..f1051723d 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -2,6 +2,7 @@
2 "parser": "babel-eslint", 2 "parser": "babel-eslint",
3 "extends": "eslint-config-airbnb", 3 "extends": "eslint-config-airbnb",
4 "rules": { 4 "rules": {
5 "consistent-return": 0,
5 "import/extensions": 0, 6 "import/extensions": 0,
6 "import/no-extraneous-dependencies": 0, 7 "import/no-extraneous-dependencies": 0,
7 "import/no-unresolved": [2, { 8 "import/no-unresolved": [2, {
@@ -13,7 +14,7 @@
13 "react/jsx-filename-extension": [1, { 14 "react/jsx-filename-extension": [1, {
14 "extensions": [".js", ".jsx"] 15 "extensions": [".js", ".jsx"]
15 }], 16 }],
16 "react/forbid-prop-types": 1, 17 "react/forbid-prop-types": 0,
17 "react/destructuring-assignment": 1, 18 "react/destructuring-assignment": 1,
18 "prefer-destructuring": 1, 19 "prefer-destructuring": 1,
19 "no-underscore-dangle": 0, 20 "no-underscore-dangle": 0,
diff --git a/.gitignore b/.gitignore
index a5677f0b8..d38c475bf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
1.idea
1node_modules 2node_modules
2flow-typed 3flow-typed
3out 4out
diff --git a/package-lock.json b/package-lock.json
index 8499abda9..1f1ac3c00 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1442,7 +1442,7 @@
1442 "@lerna/get-packed": { 1442 "@lerna/get-packed": {
1443 "version": "3.7.0", 1443 "version": "3.7.0",
1444 "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-3.7.0.tgz", 1444 "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-3.7.0.tgz",
1445 "integrity": "sha512-yuFtjsUZIHjeIvIYQ/QuytC+FQcHwo3peB+yGBST2uWCLUCR5rx6knoQcPzbxdFDCuUb5IFccFGd3B1fHFg3RQ==", 1445 "integrity": "sha1-VJx3OPe+XjsUM+gu2c2pEjvNHtU=",
1446 "dev": true, 1446 "dev": true,
1447 "requires": { 1447 "requires": {
1448 "fs-extra": "^7.0.0", 1448 "fs-extra": "^7.0.0",
@@ -1567,7 +1567,7 @@
1567 "@lerna/npm-conf": { 1567 "@lerna/npm-conf": {
1568 "version": "3.7.0", 1568 "version": "3.7.0",
1569 "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-3.7.0.tgz", 1569 "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-3.7.0.tgz",
1570 "integrity": "sha512-+WSMDfPKcKzMfqq283ydz9RRpOU6p9wfx0wy4hVSUY/6YUpsyuk8SShjcRtY8zTM5AOrxvFBuuV90H4YpZ5+Ng==", 1570 "integrity": "sha1-8QHU/fB8788RYbz688DxBbQgpFA=",
1571 "dev": true, 1571 "dev": true,
1572 "requires": { 1572 "requires": {
1573 "config-chain": "^1.1.11", 1573 "config-chain": "^1.1.11",
@@ -1823,7 +1823,7 @@
1823 "@lerna/run-parallel-batches": { 1823 "@lerna/run-parallel-batches": {
1824 "version": "3.0.0", 1824 "version": "3.0.0",
1825 "resolved": "https://registry.npmjs.org/@lerna/run-parallel-batches/-/run-parallel-batches-3.0.0.tgz", 1825 "resolved": "https://registry.npmjs.org/@lerna/run-parallel-batches/-/run-parallel-batches-3.0.0.tgz",
1826 "integrity": "sha512-Mj1ravlXF7AkkewKd9YFq9BtVrsStNrvVLedD/b2wIVbNqcxp8lS68vehXVOzoL/VWNEDotvqCQtyDBilCodGw==", 1826 "integrity": "sha1-RocEk0CEx0mR0xJNgGB4V9TfqEA=",
1827 "dev": true, 1827 "dev": true,
1828 "requires": { 1828 "requires": {
1829 "p-map": "^1.2.0", 1829 "p-map": "^1.2.0",
@@ -1948,15 +1948,6 @@
1948 "@meetfranz/theme": "^1.0.7", 1948 "@meetfranz/theme": "^1.0.7",
1949 "react-html-attributes": "^1.4.3", 1949 "react-html-attributes": "^1.4.3",
1950 "react-loader": "^2.4.5" 1950 "react-loader": "^2.4.5"
1951 },
1952 "dependencies": {
1953 "@meetfranz/theme": {
1954 "version": "1.0.9",
1955 "bundled": true,
1956 "requires": {
1957 "color": "^3.1.0"
1958 }
1959 }
1960 } 1951 }
1961 }, 1952 },
1962 "@meetfranz/theme": { 1953 "@meetfranz/theme": {
@@ -1972,21 +1963,12 @@
1972 "@mdi/react": "^1.1.0", 1963 "@mdi/react": "^1.1.0",
1973 "@meetfranz/theme": "^1.0.7", 1964 "@meetfranz/theme": "^1.0.7",
1974 "react-loader": "^2.4.5" 1965 "react-loader": "^2.4.5"
1975 },
1976 "dependencies": {
1977 "@meetfranz/theme": {
1978 "version": "1.0.9",
1979 "bundled": true,
1980 "requires": {
1981 "color": "^3.1.0"
1982 }
1983 }
1984 } 1966 }
1985 }, 1967 },
1986 "@mrmlnc/readdir-enhanced": { 1968 "@mrmlnc/readdir-enhanced": {
1987 "version": "2.2.1", 1969 "version": "2.2.1",
1988 "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", 1970 "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
1989 "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", 1971 "integrity": "sha1-UkryQNGjYFJ7cwR17PoTRKpUDd4=",
1990 "dev": true, 1972 "dev": true,
1991 "requires": { 1973 "requires": {
1992 "call-me-maybe": "^1.0.1", 1974 "call-me-maybe": "^1.0.1",
@@ -1996,7 +1978,7 @@
1996 "@nodelib/fs.stat": { 1978 "@nodelib/fs.stat": {
1997 "version": "1.1.3", 1979 "version": "1.1.3",
1998 "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", 1980 "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
1999 "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", 1981 "integrity": "sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs=",
2000 "dev": true 1982 "dev": true
2001 }, 1983 },
2002 "@octokit/endpoint": { 1984 "@octokit/endpoint": {
@@ -2372,7 +2354,7 @@
2372 "dependencies": { 2354 "dependencies": {
2373 "mime-types": { 2355 "mime-types": {
2374 "version": "1.0.2", 2356 "version": "1.0.2",
2375 "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", 2357 "resolved": "http://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz",
2376 "integrity": "sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4=", 2358 "integrity": "sha1-mVrhOSq4r/y/yyZB3QVOlDwNXc4=",
2377 "dev": true 2359 "dev": true
2378 } 2360 }
@@ -2430,7 +2412,7 @@
2430 "agent-base": { 2412 "agent-base": {
2431 "version": "4.2.1", 2413 "version": "4.2.1",
2432 "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", 2414 "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz",
2433 "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", 2415 "integrity": "sha1-2J5ZmfeXh1Z0wH2H8mD8Qeg+jKk=",
2434 "dev": true, 2416 "dev": true,
2435 "requires": { 2417 "requires": {
2436 "es6-promisify": "^5.0.0" 2418 "es6-promisify": "^5.0.0"
@@ -2439,7 +2421,7 @@
2439 "agentkeepalive": { 2421 "agentkeepalive": {
2440 "version": "3.5.2", 2422 "version": "3.5.2",
2441 "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", 2423 "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz",
2442 "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", 2424 "integrity": "sha1-oROSTdP6JKC8O3gQjEUMKr7gD2c=",
2443 "dev": true, 2425 "dev": true,
2444 "requires": { 2426 "requires": {
2445 "humanize-ms": "^1.2.1" 2427 "humanize-ms": "^1.2.1"
@@ -2486,7 +2468,7 @@
2486 }, 2468 },
2487 "ansi-colors": { 2469 "ansi-colors": {
2488 "version": "1.1.0", 2470 "version": "1.1.0",
2489 "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", 2471 "resolved": "http://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
2490 "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", 2472 "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
2491 "dev": true, 2473 "dev": true,
2492 "requires": { 2474 "requires": {
@@ -2913,7 +2895,7 @@
2913 }, 2895 },
2914 "util": { 2896 "util": {
2915 "version": "0.10.3", 2897 "version": "0.10.3",
2916 "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 2898 "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz",
2917 "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", 2899 "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
2918 "dev": true, 2900 "dev": true,
2919 "requires": { 2901 "requires": {
@@ -2948,7 +2930,7 @@
2948 }, 2930 },
2949 "async": { 2931 "async": {
2950 "version": "0.1.22", 2932 "version": "0.1.22",
2951 "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", 2933 "resolved": "http://registry.npmjs.org/async/-/async-0.1.22.tgz",
2952 "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=" 2934 "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE="
2953 }, 2935 },
2954 "async-done": { 2936 "async-done": {
@@ -3771,7 +3753,7 @@
3771 "byte-size": { 3753 "byte-size": {
3772 "version": "4.0.4", 3754 "version": "4.0.4",
3773 "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-4.0.4.tgz", 3755 "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-4.0.4.tgz",
3774 "integrity": "sha512-82RPeneC6nqCdSwCX2hZUz3JPOvN5at/nTEw/CMf05Smu3Hrpo9Psb7LjN+k+XndNArG1EY8L4+BM3aTM4BCvw==", 3756 "integrity": "sha1-KdOBcJ9BquDYnGMfHIGuyIzUCyM=",
3775 "dev": true 3757 "dev": true
3776 }, 3758 },
3777 "bytes": { 3759 "bytes": {
@@ -3783,7 +3765,7 @@
3783 "cacache": { 3765 "cacache": {
3784 "version": "11.3.2", 3766 "version": "11.3.2",
3785 "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", 3767 "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz",
3786 "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", 3768 "integrity": "sha1-LYHjCOPSWMo4Eltna5iyrJzmm/o=",
3787 "dev": true, 3769 "dev": true,
3788 "requires": { 3770 "requires": {
3789 "bluebird": "^3.5.3", 3771 "bluebird": "^3.5.3",
@@ -3805,7 +3787,7 @@
3805 "lru-cache": { 3787 "lru-cache": {
3806 "version": "5.1.1", 3788 "version": "5.1.1",
3807 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 3789 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
3808 "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 3790 "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=",
3809 "dev": true, 3791 "dev": true,
3810 "requires": { 3792 "requires": {
3811 "yallist": "^3.0.2" 3793 "yallist": "^3.0.2"
@@ -4502,7 +4484,7 @@
4502 "config-chain": { 4484 "config-chain": {
4503 "version": "1.1.12", 4485 "version": "1.1.12",
4504 "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", 4486 "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz",
4505 "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", 4487 "integrity": "sha1-D96NCRIA616AjK8l/mGMAvSOTvo=",
4506 "dev": true, 4488 "dev": true,
4507 "requires": { 4489 "requires": {
4508 "ini": "^1.3.4", 4490 "ini": "^1.3.4",
@@ -4548,7 +4530,7 @@
4548 "dependencies": { 4530 "dependencies": {
4549 "debug": { 4531 "debug": {
4550 "version": "1.0.4", 4532 "version": "1.0.4",
4551 "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz", 4533 "resolved": "http://registry.npmjs.org/debug/-/debug-1.0.4.tgz",
4552 "integrity": "sha1-W5wla9VLbsAigxdvqKDt5tFUy/g=", 4534 "integrity": "sha1-W5wla9VLbsAigxdvqKDt5tFUy/g=",
4553 "dev": true, 4535 "dev": true,
4554 "requires": { 4536 "requires": {
@@ -4818,7 +4800,7 @@
4818 "conventional-recommended-bump": { 4800 "conventional-recommended-bump": {
4819 "version": "4.0.4", 4801 "version": "4.0.4",
4820 "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-4.0.4.tgz", 4802 "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-4.0.4.tgz",
4821 "integrity": "sha512-9mY5Yoblq+ZMqJpBzgS+RpSq+SUfP2miOR3H/NR9drGf08WCrY9B6HAGJZEm6+ThsVP917VHAahSOjM6k1vhPg==", 4803 "integrity": "sha1-BVQFhGQdPadYyIY8CXiPyutYaHI=",
4822 "dev": true, 4804 "dev": true,
4823 "requires": { 4805 "requires": {
4824 "concat-stream": "^1.6.0", 4806 "concat-stream": "^1.6.0",
@@ -4909,7 +4891,7 @@
4909 "copy-concurrently": { 4891 "copy-concurrently": {
4910 "version": "1.0.5", 4892 "version": "1.0.5",
4911 "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", 4893 "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
4912 "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", 4894 "integrity": "sha1-kilzmMrjSTf8r9bsgTnBgFHwteA=",
4913 "dev": true, 4895 "dev": true,
4914 "requires": { 4896 "requires": {
4915 "aproba": "^1.1.1", 4897 "aproba": "^1.1.1",
@@ -5489,7 +5471,7 @@
5489 "diff": { 5471 "diff": {
5490 "version": "3.5.0", 5472 "version": "3.5.0",
5491 "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 5473 "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
5492 "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 5474 "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=",
5493 "dev": true 5475 "dev": true
5494 }, 5476 },
5495 "diffie-hellman": { 5477 "diffie-hellman": {
@@ -5506,7 +5488,7 @@
5506 "dir-glob": { 5488 "dir-glob": {
5507 "version": "2.0.0", 5489 "version": "2.0.0",
5508 "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", 5490 "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
5509 "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", 5491 "integrity": "sha1-CyBdK2rvmCOMooZZioIE0p0KADQ=",
5510 "dev": true, 5492 "dev": true,
5511 "requires": { 5493 "requires": {
5512 "arrify": "^1.0.1", 5494 "arrify": "^1.0.1",
@@ -5591,7 +5573,7 @@
5591 "dependencies": { 5573 "dependencies": {
5592 "domelementtype": { 5574 "domelementtype": {
5593 "version": "1.1.3", 5575 "version": "1.1.3",
5594 "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", 5576 "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
5595 "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" 5577 "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs="
5596 } 5578 }
5597 } 5579 }
@@ -5635,7 +5617,7 @@
5635 }, 5617 },
5636 "dotenv": { 5618 "dotenv": {
5637 "version": "4.0.0", 5619 "version": "4.0.0",
5638 "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", 5620 "resolved": "http://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz",
5639 "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=", 5621 "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=",
5640 "dev": true 5622 "dev": true
5641 }, 5623 },
@@ -5655,7 +5637,7 @@
5655 }, 5637 },
5656 "duplexer": { 5638 "duplexer": {
5657 "version": "0.1.1", 5639 "version": "0.1.1",
5658 "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", 5640 "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
5659 "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", 5641 "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
5660 "dev": true 5642 "dev": true
5661 }, 5643 },
@@ -5966,7 +5948,7 @@
5966 }, 5948 },
5967 "readable-stream": { 5949 "readable-stream": {
5968 "version": "1.1.14", 5950 "version": "1.1.14",
5969 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 5951 "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
5970 "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 5952 "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
5971 "dev": true, 5953 "dev": true,
5972 "requires": { 5954 "requires": {
@@ -6488,7 +6470,7 @@
6488 }, 6470 },
6489 "debug": { 6471 "debug": {
6490 "version": "2.3.3", 6472 "version": "2.3.3",
6491 "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", 6473 "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
6492 "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", 6474 "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
6493 "dev": true, 6475 "dev": true,
6494 "requires": { 6476 "requires": {
@@ -6497,7 +6479,7 @@
6497 }, 6479 },
6498 "ms": { 6480 "ms": {
6499 "version": "0.7.2", 6481 "version": "0.7.2",
6500 "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", 6482 "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
6501 "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", 6483 "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
6502 "dev": true 6484 "dev": true
6503 }, 6485 },
@@ -6531,7 +6513,7 @@
6531 "dependencies": { 6513 "dependencies": {
6532 "debug": { 6514 "debug": {
6533 "version": "2.3.3", 6515 "version": "2.3.3",
6534 "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", 6516 "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
6535 "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", 6517 "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
6536 "dev": true, 6518 "dev": true,
6537 "requires": { 6519 "requires": {
@@ -6540,7 +6522,7 @@
6540 }, 6522 },
6541 "ms": { 6523 "ms": {
6542 "version": "0.7.2", 6524 "version": "0.7.2",
6543 "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", 6525 "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
6544 "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", 6526 "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
6545 "dev": true 6527 "dev": true
6546 } 6528 }
@@ -6664,12 +6646,12 @@
6664 "es6-promise": { 6646 "es6-promise": {
6665 "version": "4.2.5", 6647 "version": "4.2.5",
6666 "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", 6648 "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz",
6667 "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", 6649 "integrity": "sha1-2m0NVpLvtGHggsFIF/4kJ9j10FQ=",
6668 "dev": true 6650 "dev": true
6669 }, 6651 },
6670 "es6-promisify": { 6652 "es6-promisify": {
6671 "version": "5.0.0", 6653 "version": "5.0.0",
6672 "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 6654 "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
6673 "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 6655 "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
6674 "dev": true, 6656 "dev": true,
6675 "requires": { 6657 "requires": {
@@ -6876,7 +6858,7 @@
6876 }, 6858 },
6877 "load-json-file": { 6859 "load-json-file": {
6878 "version": "2.0.0", 6860 "version": "2.0.0",
6879 "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", 6861 "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
6880 "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", 6862 "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
6881 "dev": true, 6863 "dev": true,
6882 "requires": { 6864 "requires": {
@@ -7359,7 +7341,7 @@
7359 }, 7341 },
7360 "finalhandler": { 7342 "finalhandler": {
7361 "version": "1.1.1", 7343 "version": "1.1.1",
7362 "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 7344 "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
7363 "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 7345 "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
7364 "dev": true, 7346 "dev": true,
7365 "requires": { 7347 "requires": {
@@ -7687,7 +7669,7 @@
7687 "figgy-pudding": { 7669 "figgy-pudding": {
7688 "version": "3.5.1", 7670 "version": "3.5.1",
7689 "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", 7671 "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz",
7690 "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", 7672 "integrity": "sha1-hiRwESkBxyeg5JWoB0S9W6odZ5A=",
7691 "dev": true 7673 "dev": true
7692 }, 7674 },
7693 "figures": { 7675 "figures": {
@@ -7745,7 +7727,7 @@
7745 }, 7727 },
7746 "finalhandler": { 7728 "finalhandler": {
7747 "version": "0.1.0", 7729 "version": "0.1.0",
7748 "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.1.0.tgz", 7730 "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-0.1.0.tgz",
7749 "integrity": "sha1-2gW7xPX0owyEzh2R88FUAHxOnao=", 7731 "integrity": "sha1-2gW7xPX0owyEzh2R88FUAHxOnao=",
7750 "dev": true, 7732 "dev": true,
7751 "requires": { 7733 "requires": {
@@ -7755,7 +7737,7 @@
7755 "dependencies": { 7737 "dependencies": {
7756 "debug": { 7738 "debug": {
7757 "version": "1.0.4", 7739 "version": "1.0.4",
7758 "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz", 7740 "resolved": "http://registry.npmjs.org/debug/-/debug-1.0.4.tgz",
7759 "integrity": "sha1-W5wla9VLbsAigxdvqKDt5tFUy/g=", 7741 "integrity": "sha1-W5wla9VLbsAigxdvqKDt5tFUy/g=",
7760 "dev": true, 7742 "dev": true,
7761 "requires": { 7743 "requires": {
@@ -7764,7 +7746,7 @@
7764 }, 7746 },
7765 "ms": { 7747 "ms": {
7766 "version": "0.6.2", 7748 "version": "0.6.2",
7767 "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", 7749 "resolved": "http://registry.npmjs.org/ms/-/ms-0.6.2.tgz",
7768 "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=", 7750 "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=",
7769 "dev": true 7751 "dev": true
7770 } 7752 }
@@ -8109,30 +8091,36 @@
8109 "dependencies": { 8091 "dependencies": {
8110 "abbrev": { 8092 "abbrev": {
8111 "version": "1.1.1", 8093 "version": "1.1.1",
8112 "bundled": true 8094 "resolved": false,
8095 "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
8113 }, 8096 },
8114 "ansi-regex": { 8097 "ansi-regex": {
8115 "version": "2.1.1", 8098 "version": "2.1.1",
8116 "bundled": true 8099 "resolved": false,
8100 "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
8117 }, 8101 },
8118 "aproba": { 8102 "aproba": {
8119 "version": "1.2.0", 8103 "version": "1.2.0",
8120 "bundled": true 8104 "resolved": false,
8105 "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
8121 }, 8106 },
8122 "are-we-there-yet": { 8107 "are-we-there-yet": {
8123 "version": "1.1.5", 8108 "version": "1.1.5",
8124 "bundled": true, 8109 "resolved": false,
8110 "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
8125 "requires": { 8111 "requires": {
8126 "delegates": "^1.0.0" 8112 "delegates": "^1.0.0"
8127 } 8113 }
8128 }, 8114 },
8129 "balanced-match": { 8115 "balanced-match": {
8130 "version": "1.0.0", 8116 "version": "1.0.0",
8131 "bundled": true 8117 "resolved": false,
8118 "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
8132 }, 8119 },
8133 "brace-expansion": { 8120 "brace-expansion": {
8134 "version": "1.1.11", 8121 "version": "1.1.11",
8135 "bundled": true, 8122 "resolved": false,
8123 "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
8136 "requires": { 8124 "requires": {
8137 "balanced-match": "^1.0.0", 8125 "balanced-match": "^1.0.0",
8138 "concat-map": "0.0.1" 8126 "concat-map": "0.0.1"
@@ -8140,54 +8128,66 @@
8140 }, 8128 },
8141 "chownr": { 8129 "chownr": {
8142 "version": "1.1.1", 8130 "version": "1.1.1",
8143 "bundled": true 8131 "resolved": false,
8132 "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g=="
8144 }, 8133 },
8145 "code-point-at": { 8134 "code-point-at": {
8146 "version": "1.1.0", 8135 "version": "1.1.0",
8147 "bundled": true 8136 "resolved": false,
8137 "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
8148 }, 8138 },
8149 "concat-map": { 8139 "concat-map": {
8150 "version": "0.0.1", 8140 "version": "0.0.1",
8151 "bundled": true 8141 "resolved": false,
8142 "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
8152 }, 8143 },
8153 "console-control-strings": { 8144 "console-control-strings": {
8154 "version": "1.1.0", 8145 "version": "1.1.0",
8155 "bundled": true 8146 "resolved": false,
8147 "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
8156 }, 8148 },
8157 "core-util-is": { 8149 "core-util-is": {
8158 "version": "1.0.2", 8150 "version": "1.0.2",
8159 "bundled": true 8151 "resolved": false,
8152 "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
8160 }, 8153 },
8161 "debug": { 8154 "debug": {
8162 "version": "2.6.9", 8155 "version": "2.6.9",
8163 "bundled": true 8156 "resolved": false,
8157 "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="
8164 }, 8158 },
8165 "deep-extend": { 8159 "deep-extend": {
8166 "version": "0.6.0", 8160 "version": "0.6.0",
8167 "bundled": true 8161 "resolved": false,
8162 "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
8168 }, 8163 },
8169 "delegates": { 8164 "delegates": {
8170 "version": "1.0.0", 8165 "version": "1.0.0",
8171 "bundled": true 8166 "resolved": false,
8167 "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
8172 }, 8168 },
8173 "detect-libc": { 8169 "detect-libc": {
8174 "version": "1.0.3", 8170 "version": "1.0.3",
8175 "bundled": true 8171 "resolved": false,
8172 "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
8176 }, 8173 },
8177 "fs-minipass": { 8174 "fs-minipass": {
8178 "version": "1.2.5", 8175 "version": "1.2.5",
8179 "bundled": true, 8176 "resolved": false,
8177 "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
8180 "requires": { 8178 "requires": {
8181 "minipass": "^2.2.1" 8179 "minipass": "^2.2.1"
8182 } 8180 }
8183 }, 8181 },
8184 "fs.realpath": { 8182 "fs.realpath": {
8185 "version": "1.0.0", 8183 "version": "1.0.0",
8186 "bundled": true 8184 "resolved": false,
8185 "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
8187 }, 8186 },
8188 "gauge": { 8187 "gauge": {
8189 "version": "2.7.4", 8188 "version": "2.7.4",
8190 "bundled": true, 8189 "resolved": false,
8190 "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
8191 "requires": { 8191 "requires": {
8192 "aproba": "^1.0.3", 8192 "aproba": "^1.0.3",
8193 "console-control-strings": "^1.0.0", 8193 "console-control-strings": "^1.0.0",
@@ -8199,7 +8199,8 @@
8199 }, 8199 },
8200 "glob": { 8200 "glob": {
8201 "version": "7.1.3", 8201 "version": "7.1.3",
8202 "bundled": true, 8202 "resolved": false,
8203 "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
8203 "requires": { 8204 "requires": {
8204 "fs.realpath": "^1.0.0", 8205 "fs.realpath": "^1.0.0",
8205 "inflight": "^1.0.4", 8206 "inflight": "^1.0.4",
@@ -8211,25 +8212,29 @@
8211 }, 8212 },
8212 "has-unicode": { 8213 "has-unicode": {
8213 "version": "2.0.1", 8214 "version": "2.0.1",
8214 "bundled": true 8215 "resolved": false,
8216 "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
8215 }, 8217 },
8216 "iconv-lite": { 8218 "iconv-lite": {
8217 "version": "0.4.24", 8219 "version": "0.4.24",
8218 "bundled": true, 8220 "resolved": false,
8221 "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
8219 "requires": { 8222 "requires": {
8220 "safer-buffer": ">= 2.1.2 < 3" 8223 "safer-buffer": ">= 2.1.2 < 3"
8221 } 8224 }
8222 }, 8225 },
8223 "ignore-walk": { 8226 "ignore-walk": {
8224 "version": "3.0.1", 8227 "version": "3.0.1",
8225 "bundled": true, 8228 "resolved": false,
8229 "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
8226 "requires": { 8230 "requires": {
8227 "minimatch": "^3.0.4" 8231 "minimatch": "^3.0.4"
8228 } 8232 }
8229 }, 8233 },
8230 "inflight": { 8234 "inflight": {
8231 "version": "1.0.6", 8235 "version": "1.0.6",
8232 "bundled": true, 8236 "resolved": false,
8237 "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
8233 "requires": { 8238 "requires": {
8234 "once": "^1.3.0", 8239 "once": "^1.3.0",
8235 "wrappy": "1" 8240 "wrappy": "1"
@@ -8237,15 +8242,18 @@
8237 }, 8242 },
8238 "inherits": { 8243 "inherits": {
8239 "version": "2.0.3", 8244 "version": "2.0.3",
8240 "bundled": true 8245 "resolved": false,
8246 "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
8241 }, 8247 },
8242 "ini": { 8248 "ini": {
8243 "version": "1.3.5", 8249 "version": "1.3.5",
8244 "bundled": true 8250 "resolved": false,
8251 "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
8245 }, 8252 },
8246 "is-fullwidth-code-point": { 8253 "is-fullwidth-code-point": {
8247 "version": "1.0.0", 8254 "version": "1.0.0",
8248 "bundled": true, 8255 "resolved": false,
8256 "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
8249 "requires": { 8257 "requires": {
8250 "number-is-nan": "^1.0.0" 8258 "number-is-nan": "^1.0.0"
8251 } 8259 }
@@ -8341,7 +8349,7 @@
8341 "genfun": { 8349 "genfun": {
8342 "version": "5.0.0", 8350 "version": "5.0.0",
8343 "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", 8351 "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz",
8344 "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", 8352 "integrity": "sha1-ndlxCgaQClxKW/V6yl2k5S/nZTc=",
8345 "dev": true 8353 "dev": true
8346 }, 8354 },
8347 "get-caller-file": { 8355 "get-caller-file": {
@@ -8880,7 +8888,7 @@
8880 }, 8888 },
8881 "got": { 8889 "got": {
8882 "version": "6.7.1", 8890 "version": "6.7.1",
8883 "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", 8891 "resolved": "http://registry.npmjs.org/got/-/got-6.7.1.tgz",
8884 "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", 8892 "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
8885 "dev": true, 8893 "dev": true,
8886 "requires": { 8894 "requires": {
@@ -9462,7 +9470,7 @@
9462 }, 9470 },
9463 "yargs": { 9471 "yargs": {
9464 "version": "3.32.0", 9472 "version": "3.32.0",
9465 "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", 9473 "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz",
9466 "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", 9474 "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=",
9467 "dev": true, 9475 "dev": true,
9468 "requires": { 9476 "requires": {
@@ -9637,7 +9645,7 @@
9637 }, 9645 },
9638 "lodash": { 9646 "lodash": {
9639 "version": "1.0.2", 9647 "version": "1.0.2",
9640 "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", 9648 "resolved": "http://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz",
9641 "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", 9649 "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=",
9642 "dev": true 9650 "dev": true
9643 }, 9651 },
@@ -9697,7 +9705,7 @@
9697 }, 9705 },
9698 "readable-stream": { 9706 "readable-stream": {
9699 "version": "1.0.34", 9707 "version": "1.0.34",
9700 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 9708 "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
9701 "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 9709 "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
9702 "dev": true, 9710 "dev": true,
9703 "requires": { 9711 "requires": {
@@ -10278,7 +10286,7 @@
10278 "http-cache-semantics": { 10286 "http-cache-semantics": {
10279 "version": "3.8.1", 10287 "version": "3.8.1",
10280 "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", 10288 "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz",
10281 "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", 10289 "integrity": "sha1-ObDhat2bYFvwqe89nar0hDtMrNI=",
10282 "dev": true 10290 "dev": true
10283 }, 10291 },
10284 "http-deceiver": { 10292 "http-deceiver": {
@@ -10289,7 +10297,7 @@
10289 }, 10297 },
10290 "http-errors": { 10298 "http-errors": {
10291 "version": "1.6.3", 10299 "version": "1.6.3",
10292 "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 10300 "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
10293 "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 10301 "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
10294 "dev": true, 10302 "dev": true,
10295 "requires": { 10303 "requires": {
@@ -10327,7 +10335,7 @@
10327 "http-proxy-agent": { 10335 "http-proxy-agent": {
10328 "version": "2.1.0", 10336 "version": "2.1.0",
10329 "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", 10337 "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz",
10330 "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", 10338 "integrity": "sha1-5IIb7vWyFCogJr1zkm/lN2McVAU=",
10331 "dev": true, 10339 "dev": true,
10332 "requires": { 10340 "requires": {
10333 "agent-base": "4", 10341 "agent-base": "4",
@@ -10337,7 +10345,7 @@
10337 "debug": { 10345 "debug": {
10338 "version": "3.1.0", 10346 "version": "3.1.0",
10339 "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 10347 "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
10340 "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 10348 "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
10341 "dev": true, 10349 "dev": true,
10342 "requires": { 10350 "requires": {
10343 "ms": "2.0.0" 10351 "ms": "2.0.0"
@@ -10385,7 +10393,7 @@
10385 "https-proxy-agent": { 10393 "https-proxy-agent": {
10386 "version": "2.2.1", 10394 "version": "2.2.1",
10387 "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", 10395 "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
10388 "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", 10396 "integrity": "sha1-UVUpcPoE1yPgTFbQQXjD+SWSu8A=",
10389 "dev": true, 10397 "dev": true,
10390 "requires": { 10398 "requires": {
10391 "agent-base": "^4.1.0", 10399 "agent-base": "^4.1.0",
@@ -10395,7 +10403,7 @@
10395 "debug": { 10403 "debug": {
10396 "version": "3.2.6", 10404 "version": "3.2.6",
10397 "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 10405 "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
10398 "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 10406 "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=",
10399 "dev": true, 10407 "dev": true,
10400 "requires": { 10408 "requires": {
10401 "ms": "^2.1.1" 10409 "ms": "^2.1.1"
@@ -10404,7 +10412,7 @@
10404 "ms": { 10412 "ms": {
10405 "version": "2.1.1", 10413 "version": "2.1.1",
10406 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 10414 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
10407 "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 10415 "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=",
10408 "dev": true 10416 "dev": true
10409 } 10417 }
10410 } 10418 }
@@ -10420,7 +10428,7 @@
10420 }, 10428 },
10421 "hunspell-asm": { 10429 "hunspell-asm": {
10422 "version": "1.0.2", 10430 "version": "1.0.2",
10423 "resolved": "https://registry.npmjs.org/hunspell-asm/-/hunspell-asm-1.0.2.tgz", 10431 "resolved": "http://registry.npmjs.org/hunspell-asm/-/hunspell-asm-1.0.2.tgz",
10424 "integrity": "sha512-UTLBvc0yZiIcHl9qrgxnFTZbX3zF4CprzEY+u+N0iXlUKZnUJRIgvgppTdgiQTsucm5b0aN/rHsgXz2q/0kBRA==", 10432 "integrity": "sha512-UTLBvc0yZiIcHl9qrgxnFTZbX3zF4CprzEY+u+N0iXlUKZnUJRIgvgppTdgiQTsucm5b0aN/rHsgXz2q/0kBRA==",
10425 "requires": { 10433 "requires": {
10426 "emscripten-wasm-loader": "^1.0.0", 10434 "emscripten-wasm-loader": "^1.0.0",
@@ -10498,7 +10506,7 @@
10498 "ignore-walk": { 10506 "ignore-walk": {
10499 "version": "3.0.1", 10507 "version": "3.0.1",
10500 "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", 10508 "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz",
10501 "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", 10509 "integrity": "sha1-qD5i59JyrA47VRqqgoMaGbafgvg=",
10502 "dev": true, 10510 "dev": true,
10503 "requires": { 10511 "requires": {
10504 "minimatch": "^3.0.4" 10512 "minimatch": "^3.0.4"
@@ -10540,7 +10548,7 @@
10540 "import-local": { 10548 "import-local": {
10541 "version": "1.0.0", 10549 "version": "1.0.0",
10542 "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", 10550 "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz",
10543 "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", 10551 "integrity": "sha1-Xk/9wD9P5sAJxnKb6yljHC+CJ7w=",
10544 "dev": true, 10552 "dev": true,
10545 "requires": { 10553 "requires": {
10546 "pkg-dir": "^2.0.0", 10554 "pkg-dir": "^2.0.0",
@@ -10604,7 +10612,7 @@
10604 "init-package-json": { 10612 "init-package-json": {
10605 "version": "1.10.3", 10613 "version": "1.10.3",
10606 "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.10.3.tgz", 10614 "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.10.3.tgz",
10607 "integrity": "sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==", 10615 "integrity": "sha1-Rf/i9hCoyhNPK9HbVjeyNQcPbL4=",
10608 "dev": true, 10616 "dev": true,
10609 "requires": { 10617 "requires": {
10610 "glob": "^7.1.1", 10618 "glob": "^7.1.1",
@@ -10708,7 +10716,7 @@
10708 "inversify": { 10716 "inversify": {
10709 "version": "5.0.1", 10717 "version": "5.0.1",
10710 "resolved": "https://registry.npmjs.org/inversify/-/inversify-5.0.1.tgz", 10718 "resolved": "https://registry.npmjs.org/inversify/-/inversify-5.0.1.tgz",
10711 "integrity": "sha512-Ieh06s48WnEYGcqHepdsJUIJUXpwH5o5vodAX+DK2JA/gjy4EbEcQZxw+uFfzysmKjiLXGYwNG3qDZsKVMcINQ==", 10719 "integrity": "sha1-UA1wmxQ0iWzloNWJFcSkIQ40+24=",
10712 "dev": true 10720 "dev": true
10713 }, 10721 },
10714 "invert-kv": { 10722 "invert-kv": {
@@ -10737,7 +10745,7 @@
10737 }, 10745 },
10738 "is": { 10746 "is": {
10739 "version": "0.3.0", 10747 "version": "0.3.0",
10740 "resolved": "https://registry.npmjs.org/is/-/is-0.3.0.tgz", 10748 "resolved": "http://registry.npmjs.org/is/-/is-0.3.0.tgz",
10741 "integrity": "sha1-qPcd/IpuKDcWJ/JskpCYxvTV1dc=", 10749 "integrity": "sha1-qPcd/IpuKDcWJ/JskpCYxvTV1dc=",
10742 "dev": true 10750 "dev": true
10743 }, 10751 },
@@ -10961,7 +10969,7 @@
10961 }, 10969 },
10962 "is-obj": { 10970 "is-obj": {
10963 "version": "1.0.1", 10971 "version": "1.0.1",
10964 "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 10972 "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
10965 "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", 10973 "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
10966 "dev": true 10974 "dev": true
10967 }, 10975 },
@@ -11143,7 +11151,7 @@
11143 }, 11151 },
11144 "isemail": { 11152 "isemail": {
11145 "version": "1.2.0", 11153 "version": "1.2.0",
11146 "resolved": "https://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz", 11154 "resolved": "http://registry.npmjs.org/isemail/-/isemail-1.2.0.tgz",
11147 "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo=" 11155 "integrity": "sha1-vgPfjMPineTSxd9lASY/H6RZXpo="
11148 }, 11156 },
11149 "isexe": { 11157 "isexe": {
@@ -11174,7 +11182,7 @@
11174 }, 11182 },
11175 "joi": { 11183 "joi": {
11176 "version": "6.10.1", 11184 "version": "6.10.1",
11177 "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", 11185 "resolved": "http://registry.npmjs.org/joi/-/joi-6.10.1.tgz",
11178 "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=", 11186 "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=",
11179 "requires": { 11187 "requires": {
11180 "hoek": "2.x.x", 11188 "hoek": "2.x.x",
@@ -11581,7 +11589,7 @@
11581 "libnpmaccess": { 11589 "libnpmaccess": {
11582 "version": "3.0.1", 11590 "version": "3.0.1",
11583 "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-3.0.1.tgz", 11591 "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-3.0.1.tgz",
11584 "integrity": "sha512-RlZ7PNarCBt+XbnP7R6PoVgOq9t+kou5rvhaInoNibhPO7eMlRfS0B8yjatgn2yaHIwWNyoJDolC/6Lc5L/IQA==", 11592 "integrity": "sha1-Wzqd5iHyk9QlGRqi53kQL4QWf6g=",
11585 "dev": true, 11593 "dev": true,
11586 "requires": { 11594 "requires": {
11587 "aproba": "^2.0.0", 11595 "aproba": "^2.0.0",
@@ -11593,7 +11601,7 @@
11593 "aproba": { 11601 "aproba": {
11594 "version": "2.0.0", 11602 "version": "2.0.0",
11595 "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", 11603 "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
11596 "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", 11604 "integrity": "sha1-UlILiuW1aSFbNU78DKo/4eRaitw=",
11597 "dev": true 11605 "dev": true
11598 } 11606 }
11599 } 11607 }
@@ -12039,7 +12047,7 @@
12039 "make-fetch-happen": { 12047 "make-fetch-happen": {
12040 "version": "4.0.1", 12048 "version": "4.0.1",
12041 "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz", 12049 "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz",
12042 "integrity": "sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ==", 12050 "integrity": "sha1-FBSXy4ePJDupMTbIPYq6EsIWwIM=",
12043 "dev": true, 12051 "dev": true,
12044 "requires": { 12052 "requires": {
12045 "agentkeepalive": "^3.4.1", 12053 "agentkeepalive": "^3.4.1",
@@ -12130,7 +12138,7 @@
12130 }, 12138 },
12131 "media-typer": { 12139 "media-typer": {
12132 "version": "0.3.0", 12140 "version": "0.3.0",
12133 "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 12141 "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
12134 "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", 12142 "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
12135 "dev": true 12143 "dev": true
12136 }, 12144 },
@@ -12221,7 +12229,7 @@
12221 }, 12229 },
12222 "readable-stream": { 12230 "readable-stream": {
12223 "version": "1.0.34", 12231 "version": "1.0.34",
12224 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 12232 "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
12225 "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 12233 "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
12226 "dev": true, 12234 "dev": true,
12227 "requires": { 12235 "requires": {
@@ -12252,7 +12260,7 @@
12252 "merge2": { 12260 "merge2": {
12253 "version": "1.2.3", 12261 "version": "1.2.3",
12254 "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", 12262 "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz",
12255 "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", 12263 "integrity": "sha1-fumdvWm7ZIFoklPwGEiKG5ArDtU=",
12256 "dev": true 12264 "dev": true
12257 }, 12265 },
12258 "methods": { 12266 "methods": {
@@ -12346,7 +12354,7 @@
12346 }, 12354 },
12347 "minimist": { 12355 "minimist": {
12348 "version": "1.2.0", 12356 "version": "1.2.0",
12349 "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 12357 "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
12350 "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 12358 "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
12351 "dev": true 12359 "dev": true
12352 }, 12360 },
@@ -12380,7 +12388,7 @@
12380 "mississippi": { 12388 "mississippi": {
12381 "version": "3.0.0", 12389 "version": "3.0.0",
12382 "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", 12390 "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
12383 "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", 12391 "integrity": "sha1-6goykfl+C16HdrNj1fChLZTGcCI=",
12384 "dev": true, 12392 "dev": true,
12385 "requires": { 12393 "requires": {
12386 "concat-stream": "^1.5.0", 12394 "concat-stream": "^1.5.0",
@@ -12418,7 +12426,7 @@
12418 }, 12426 },
12419 "mkdirp": { 12427 "mkdirp": {
12420 "version": "0.5.1", 12428 "version": "0.5.1",
12421 "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 12429 "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
12422 "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 12430 "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
12423 "requires": { 12431 "requires": {
12424 "minimist": "0.0.8" 12432 "minimist": "0.0.8"
@@ -12426,7 +12434,7 @@
12426 "dependencies": { 12434 "dependencies": {
12427 "minimist": { 12435 "minimist": {
12428 "version": "0.0.8", 12436 "version": "0.0.8",
12429 "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 12437 "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
12430 "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 12438 "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
12431 } 12439 }
12432 } 12440 }
@@ -12598,7 +12606,7 @@
12598 }, 12606 },
12599 "multimatch": { 12607 "multimatch": {
12600 "version": "2.1.0", 12608 "version": "2.1.0",
12601 "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", 12609 "resolved": "http://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz",
12602 "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", 12610 "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=",
12603 "dev": true, 12611 "dev": true,
12604 "requires": { 12612 "requires": {
@@ -12736,7 +12744,7 @@
12736 "node-fetch-npm": { 12744 "node-fetch-npm": {
12737 "version": "2.0.2", 12745 "version": "2.0.2",
12738 "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", 12746 "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz",
12739 "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", 12747 "integrity": "sha1-cljJBGGC3KNFtCCO2pGNrzNpf/c=",
12740 "dev": true, 12748 "dev": true,
12741 "requires": { 12749 "requires": {
12742 "encoding": "^0.1.11", 12750 "encoding": "^0.1.11",
@@ -12772,7 +12780,7 @@
12772 "dependencies": { 12780 "dependencies": {
12773 "semver": { 12781 "semver": {
12774 "version": "5.3.0", 12782 "version": "5.3.0",
12775 "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", 12783 "resolved": "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
12776 "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", 12784 "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
12777 "dev": true 12785 "dev": true
12778 }, 12786 },
@@ -13950,7 +13958,7 @@
13950 "p-map": { 13958 "p-map": {
13951 "version": "1.2.0", 13959 "version": "1.2.0",
13952 "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", 13960 "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
13953 "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", 13961 "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=",
13954 "dev": true 13962 "dev": true
13955 }, 13963 },
13956 "p-map-series": { 13964 "p-map-series": {
@@ -14123,7 +14131,7 @@
14123 "dependencies": { 14131 "dependencies": {
14124 "color-convert": { 14132 "color-convert": {
14125 "version": "0.5.3", 14133 "version": "0.5.3",
14126 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz", 14134 "resolved": "http://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz",
14127 "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=", 14135 "integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0=",
14128 "dev": true 14136 "dev": true
14129 } 14137 }
@@ -14268,7 +14276,7 @@
14268 }, 14276 },
14269 "path-browserify": { 14277 "path-browserify": {
14270 "version": "0.0.0", 14278 "version": "0.0.0",
14271 "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", 14279 "resolved": "http://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
14272 "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", 14280 "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
14273 "dev": true 14281 "dev": true
14274 }, 14282 },
@@ -14547,7 +14555,7 @@
14547 }, 14555 },
14548 "pretty-hrtime": { 14556 "pretty-hrtime": {
14549 "version": "1.0.3", 14557 "version": "1.0.3",
14550 "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", 14558 "resolved": "http://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
14551 "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", 14559 "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
14552 "dev": true 14560 "dev": true
14553 }, 14561 },
@@ -14692,7 +14700,7 @@
14692 "protoduck": { 14700 "protoduck": {
14693 "version": "5.0.1", 14701 "version": "5.0.1",
14694 "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", 14702 "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz",
14695 "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", 14703 "integrity": "sha1-A8NlnKGAB7aaUP2Cp+vMUWJhFR8=",
14696 "dev": true, 14704 "dev": true,
14697 "requires": { 14705 "requires": {
14698 "genfun": "^5.0.0" 14706 "genfun": "^5.0.0"
@@ -15052,7 +15060,7 @@
15052 }, 15060 },
15053 "react-router": { 15061 "react-router": {
15054 "version": "3.2.1", 15062 "version": "3.2.1",
15055 "resolved": "https://registry.npmjs.org/react-router/-/react-router-3.2.1.tgz", 15063 "resolved": "http://registry.npmjs.org/react-router/-/react-router-3.2.1.tgz",
15056 "integrity": "sha512-SXkhC0nr3G0ltzVU07IN8jYl0bB6FsrDIqlLC9dK3SITXqyTJyM7yhXlUqs89w3Nqi5OkXsfRUeHX+P874HQrg==", 15064 "integrity": "sha512-SXkhC0nr3G0ltzVU07IN8jYl0bB6FsrDIqlLC9dK3SITXqyTJyM7yhXlUqs89w3Nqi5OkXsfRUeHX+P874HQrg==",
15057 "requires": { 15065 "requires": {
15058 "create-react-class": "^15.5.1", 15066 "create-react-class": "^15.5.1",
@@ -15167,7 +15175,7 @@
15167 "read-package-json": { 15175 "read-package-json": {
15168 "version": "2.0.13", 15176 "version": "2.0.13",
15169 "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", 15177 "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz",
15170 "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==", 15178 "integrity": "sha1-LoLr2fYTuqbS6+Oqcs7+P2jkH0o=",
15171 "dev": true, 15179 "dev": true,
15172 "requires": { 15180 "requires": {
15173 "glob": "^7.1.1", 15181 "glob": "^7.1.1",
@@ -15188,7 +15196,7 @@
15188 "read-package-tree": { 15196 "read-package-tree": {
15189 "version": "5.2.1", 15197 "version": "5.2.1",
15190 "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.2.1.tgz", 15198 "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.2.1.tgz",
15191 "integrity": "sha512-2CNoRoh95LxY47LvqrehIAfUVda2JbuFE/HaGYs42bNrGG+ojbw1h3zOcPcQ+1GQ3+rkzNndZn85u1XyZ3UsIA==", 15199 "integrity": "sha1-Yhixh9b6yCKJzkOHu7r47vU2rWM=",
15192 "dev": true, 15200 "dev": true,
15193 "requires": { 15201 "requires": {
15194 "debuglog": "^1.0.1", 15202 "debuglog": "^1.0.1",
@@ -15556,7 +15564,7 @@
15556 }, 15564 },
15557 "htmlparser2": { 15565 "htmlparser2": {
15558 "version": "3.3.0", 15566 "version": "3.3.0",
15559 "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", 15567 "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz",
15560 "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", 15568 "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=",
15561 "dev": true, 15569 "dev": true,
15562 "requires": { 15570 "requires": {
@@ -15574,7 +15582,7 @@
15574 }, 15582 },
15575 "readable-stream": { 15583 "readable-stream": {
15576 "version": "1.0.34", 15584 "version": "1.0.34",
15577 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 15585 "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
15578 "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 15586 "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
15579 "dev": true, 15587 "dev": true,
15580 "requires": { 15588 "requires": {
@@ -15586,7 +15594,7 @@
15586 }, 15594 },
15587 "string_decoder": { 15595 "string_decoder": {
15588 "version": "0.10.31", 15596 "version": "0.10.31",
15589 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 15597 "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
15590 "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 15598 "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
15591 "dev": true 15599 "dev": true
15592 }, 15600 },
@@ -16209,7 +16217,7 @@
16209 "dependencies": { 16217 "dependencies": {
16210 "debug": { 16218 "debug": {
16211 "version": "1.0.4", 16219 "version": "1.0.4",
16212 "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz", 16220 "resolved": "http://registry.npmjs.org/debug/-/debug-1.0.4.tgz",
16213 "integrity": "sha1-W5wla9VLbsAigxdvqKDt5tFUy/g=", 16221 "integrity": "sha1-W5wla9VLbsAigxdvqKDt5tFUy/g=",
16214 "dev": true, 16222 "dev": true,
16215 "requires": { 16223 "requires": {
@@ -16224,7 +16232,7 @@
16224 }, 16232 },
16225 "ms": { 16233 "ms": {
16226 "version": "0.6.2", 16234 "version": "0.6.2",
16227 "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", 16235 "resolved": "http://registry.npmjs.org/ms/-/ms-0.6.2.tgz",
16228 "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=", 16236 "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=",
16229 "dev": true 16237 "dev": true
16230 } 16238 }
@@ -16301,7 +16309,7 @@
16301 }, 16309 },
16302 "sha.js": { 16310 "sha.js": {
16303 "version": "2.4.11", 16311 "version": "2.4.11",
16304 "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 16312 "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
16305 "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 16313 "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
16306 "dev": true, 16314 "dev": true,
16307 "requires": { 16315 "requires": {
@@ -16552,7 +16560,7 @@
16552 "dependencies": { 16560 "dependencies": {
16553 "debug": { 16561 "debug": {
16554 "version": "2.3.3", 16562 "version": "2.3.3",
16555 "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", 16563 "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
16556 "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", 16564 "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
16557 "dev": true, 16565 "dev": true,
16558 "requires": { 16566 "requires": {
@@ -16561,7 +16569,7 @@
16561 }, 16569 },
16562 "ms": { 16570 "ms": {
16563 "version": "0.7.2", 16571 "version": "0.7.2",
16564 "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", 16572 "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
16565 "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", 16573 "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
16566 "dev": true 16574 "dev": true
16567 }, 16575 },
@@ -16585,7 +16593,7 @@
16585 "dependencies": { 16593 "dependencies": {
16586 "debug": { 16594 "debug": {
16587 "version": "2.3.3", 16595 "version": "2.3.3",
16588 "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", 16596 "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
16589 "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", 16597 "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
16590 "dev": true, 16598 "dev": true,
16591 "requires": { 16599 "requires": {
@@ -16594,7 +16602,7 @@
16594 }, 16602 },
16595 "ms": { 16603 "ms": {
16596 "version": "0.7.2", 16604 "version": "0.7.2",
16597 "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", 16605 "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
16598 "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", 16606 "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
16599 "dev": true 16607 "dev": true
16600 } 16608 }
@@ -16621,7 +16629,7 @@
16621 "dependencies": { 16629 "dependencies": {
16622 "debug": { 16630 "debug": {
16623 "version": "2.3.3", 16631 "version": "2.3.3",
16624 "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", 16632 "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
16625 "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", 16633 "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
16626 "dev": true, 16634 "dev": true,
16627 "requires": { 16635 "requires": {
@@ -16630,7 +16638,7 @@
16630 }, 16638 },
16631 "ms": { 16639 "ms": {
16632 "version": "0.7.2", 16640 "version": "0.7.2",
16633 "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", 16641 "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
16634 "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", 16642 "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
16635 "dev": true 16643 "dev": true
16636 } 16644 }
@@ -16656,7 +16664,7 @@
16656 }, 16664 },
16657 "debug": { 16665 "debug": {
16658 "version": "2.2.0", 16666 "version": "2.2.0",
16659 "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", 16667 "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
16660 "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", 16668 "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
16661 "dev": true, 16669 "dev": true,
16662 "requires": { 16670 "requires": {
@@ -16671,7 +16679,7 @@
16671 }, 16679 },
16672 "ms": { 16680 "ms": {
16673 "version": "0.7.1", 16681 "version": "0.7.1",
16674 "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", 16682 "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
16675 "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", 16683 "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
16676 "dev": true 16684 "dev": true
16677 } 16685 }
@@ -16747,7 +16755,7 @@
16747 "socks-proxy-agent": { 16755 "socks-proxy-agent": {
16748 "version": "4.0.1", 16756 "version": "4.0.1",
16749 "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz", 16757 "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz",
16750 "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==", 16758 "integrity": "sha1-WTa/i3B6mTB5xvN9sgkYIb/6ZHM=",
16751 "dev": true, 16759 "dev": true,
16752 "requires": { 16760 "requires": {
16753 "agent-base": "~4.2.0", 16761 "agent-base": "~4.2.0",
@@ -16984,7 +16992,7 @@
16984 "ssri": { 16992 "ssri": {
16985 "version": "6.0.1", 16993 "version": "6.0.1",
16986 "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", 16994 "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
16987 "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", 16995 "integrity": "sha1-KjxBso3UW2K2Nnbst0ABJlrp7dg=",
16988 "dev": true, 16996 "dev": true,
16989 "requires": { 16997 "requires": {
16990 "figgy-pudding": "^3.5.1" 16998 "figgy-pudding": "^3.5.1"
@@ -17103,7 +17111,7 @@
17103 "stream-each": { 17111 "stream-each": {
17104 "version": "1.2.3", 17112 "version": "1.2.3",
17105 "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", 17113 "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
17106 "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", 17114 "integrity": "sha1-6+J6DDibBPvMIzZClS4Qcxr6m64=",
17107 "dev": true, 17115 "dev": true,
17108 "requires": { 17116 "requires": {
17109 "end-of-stream": "^1.1.0", 17117 "end-of-stream": "^1.1.0",
@@ -17499,7 +17507,7 @@
17499 }, 17507 },
17500 "through": { 17508 "through": {
17501 "version": "2.3.8", 17509 "version": "2.3.8",
17502 "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 17510 "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
17503 "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 17511 "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
17504 "dev": true 17512 "dev": true
17505 }, 17513 },
@@ -17771,7 +17779,7 @@
17771 "tslint": { 17779 "tslint": {
17772 "version": "5.12.0", 17780 "version": "5.12.0",
17773 "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.0.tgz", 17781 "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.0.tgz",
17774 "integrity": "sha512-CKEcH1MHUBhoV43SA/Jmy1l24HJJgI0eyLbBNSRyFlsQvb9v6Zdq+Nz2vEOH00nC5SUx4SneJ59PZUS/ARcokQ==", 17782 "integrity": "sha1-R/LbopHtPVgHUtEJhm+2QHaPyjY=",
17775 "dev": true, 17783 "dev": true,
17776 "requires": { 17784 "requires": {
17777 "babel-code-frame": "^6.22.0", 17785 "babel-code-frame": "^6.22.0",
@@ -17791,7 +17799,7 @@
17791 "tslint-config-airbnb": { 17799 "tslint-config-airbnb": {
17792 "version": "5.11.1", 17800 "version": "5.11.1",
17793 "resolved": "https://registry.npmjs.org/tslint-config-airbnb/-/tslint-config-airbnb-5.11.1.tgz", 17801 "resolved": "https://registry.npmjs.org/tslint-config-airbnb/-/tslint-config-airbnb-5.11.1.tgz",
17794 "integrity": "sha512-hkaittm2607vVMe8eotANGN1CimD5tor7uoY3ypg2VTtEcDB/KGWYbJOz58t8LI4cWSyWtgqYQ5F0HwKxxhlkQ==", 17802 "integrity": "sha1-UaJ/u4vyTBRNBkonSnHaR+fs5hc=",
17795 "dev": true, 17803 "dev": true,
17796 "requires": { 17804 "requires": {
17797 "tslint-consistent-codestyle": "^1.14.1", 17805 "tslint-consistent-codestyle": "^1.14.1",
@@ -17813,7 +17821,7 @@
17813 "tslint-eslint-rules": { 17821 "tslint-eslint-rules": {
17814 "version": "5.4.0", 17822 "version": "5.4.0",
17815 "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", 17823 "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz",
17816 "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", 17824 "integrity": "sha1-5IjMkYG/GT/lzXv8ohOnaV8XN7U=",
17817 "dev": true, 17825 "dev": true,
17818 "requires": { 17826 "requires": {
17819 "doctrine": "0.7.2", 17827 "doctrine": "0.7.2",
@@ -17823,7 +17831,7 @@
17823 "dependencies": { 17831 "dependencies": {
17824 "doctrine": { 17832 "doctrine": {
17825 "version": "0.7.2", 17833 "version": "0.7.2",
17826 "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", 17834 "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz",
17827 "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", 17835 "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=",
17828 "dev": true, 17836 "dev": true,
17829 "requires": { 17837 "requires": {
@@ -17846,7 +17854,7 @@
17846 "tslib": { 17854 "tslib": {
17847 "version": "1.9.0", 17855 "version": "1.9.0",
17848 "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", 17856 "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz",
17849 "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", 17857 "integrity": "sha1-43qG/ajLuvI6BX9HPJ9Nxk5fwug=",
17850 "dev": true 17858 "dev": true
17851 }, 17859 },
17852 "tsutils": { 17860 "tsutils": {
@@ -17863,7 +17871,7 @@
17863 "tslint-microsoft-contrib": { 17871 "tslint-microsoft-contrib": {
17864 "version": "5.2.1", 17872 "version": "5.2.1",
17865 "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz", 17873 "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.2.1.tgz",
17866 "integrity": "sha512-PDYjvpo0gN9IfMULwKk0KpVOPMhU6cNoT9VwCOLeDl/QS8v8W2yspRpFFuUS7/c5EIH/n8ApMi8TxJAz1tfFUA==", 17874 "integrity": "sha1-pihoOfgA4lkdBB6igAx3SHhErYE=",
17867 "dev": true, 17875 "dev": true,
17868 "requires": { 17876 "requires": {
17869 "tsutils": "^2.27.2 <2.29.0" 17877 "tsutils": "^2.27.2 <2.29.0"
@@ -17872,7 +17880,7 @@
17872 "tsutils": { 17880 "tsutils": {
17873 "version": "2.28.0", 17881 "version": "2.28.0",
17874 "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz", 17882 "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.28.0.tgz",
17875 "integrity": "sha512-bh5nAtW0tuhvOJnx1GLRn5ScraRLICGyJV5wJhtRWOLsxW70Kk5tZtpK3O/hW6LDnqKS9mlUMPZj9fEMJ0gxqA==", 17883 "integrity": "sha1-a9ceFggo+dAZtvToRHQiKPhRaaE=",
17876 "dev": true, 17884 "dev": true,
17877 "requires": { 17885 "requires": {
17878 "tslib": "^1.8.1" 17886 "tslib": "^1.8.1"
@@ -17883,7 +17891,7 @@
17883 "tsutils": { 17891 "tsutils": {
17884 "version": "2.29.0", 17892 "version": "2.29.0",
17885 "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 17893 "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
17886 "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 17894 "integrity": "sha1-MrSIUBRnrL7dS4VJhnOggSrKC5k=",
17887 "dev": true, 17895 "dev": true,
17888 "requires": { 17896 "requires": {
17889 "tslib": "^1.8.1" 17897 "tslib": "^1.8.1"
@@ -17891,7 +17899,7 @@
17891 }, 17899 },
17892 "tty-browserify": { 17900 "tty-browserify": {
17893 "version": "0.0.0", 17901 "version": "0.0.0",
17894 "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", 17902 "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
17895 "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", 17903 "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
17896 "dev": true 17904 "dev": true
17897 }, 17905 },
@@ -17938,7 +17946,7 @@
17938 "typescript": { 17946 "typescript": {
17939 "version": "3.2.2", 17947 "version": "3.2.2",
17940 "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", 17948 "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz",
17941 "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", 17949 "integrity": "sha1-/oEBxGqhI/g1NSPr3PVzDCrkk+U=",
17942 "dev": true 17950 "dev": true
17943 }, 17951 },
17944 "ua-parser-js": { 17952 "ua-parser-js": {
@@ -18077,7 +18085,7 @@
18077 "unique-filename": { 18085 "unique-filename": {
18078 "version": "1.1.1", 18086 "version": "1.1.1",
18079 "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", 18087 "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
18080 "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", 18088 "integrity": "sha1-HWl2k2mtoFgxA6HmrodoG1ZXMjA=",
18081 "dev": true, 18089 "dev": true,
18082 "requires": { 18090 "requires": {
18083 "unique-slug": "^2.0.0" 18091 "unique-slug": "^2.0.0"
@@ -18086,7 +18094,7 @@
18086 "unique-slug": { 18094 "unique-slug": {
18087 "version": "2.0.1", 18095 "version": "2.0.1",
18088 "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", 18096 "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz",
18089 "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", 18097 "integrity": "sha1-Xp7cbRzo+yZNsYpQfvm9hURFHKY=",
18090 "dev": true, 18098 "dev": true,
18091 "requires": { 18099 "requires": {
18092 "imurmurhash": "^0.1.4" 18100 "imurmurhash": "^0.1.4"
@@ -18531,7 +18539,7 @@
18531 }, 18539 },
18532 "vm-browserify": { 18540 "vm-browserify": {
18533 "version": "0.0.4", 18541 "version": "0.0.4",
18534 "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", 18542 "resolved": "http://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
18535 "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", 18543 "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
18536 "dev": true, 18544 "dev": true,
18537 "requires": { 18545 "requires": {
@@ -18636,7 +18644,7 @@
18636 "webidl-conversions": { 18644 "webidl-conversions": {
18637 "version": "4.0.2", 18645 "version": "4.0.2",
18638 "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", 18646 "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
18639 "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", 18647 "integrity": "sha1-qFWYCx8LazWbodXZ+zmulB+qY60=",
18640 "dev": true 18648 "dev": true
18641 }, 18649 },
18642 "webpack": { 18650 "webpack": {
@@ -19127,7 +19135,7 @@
19127 }, 19135 },
19128 "wrap-ansi": { 19136 "wrap-ansi": {
19129 "version": "2.1.0", 19137 "version": "2.1.0",
19130 "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 19138 "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
19131 "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 19139 "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
19132 "dev": true, 19140 "dev": true,
19133 "requires": { 19141 "requires": {
@@ -19235,7 +19243,7 @@
19235 "write-pkg": { 19243 "write-pkg": {
19236 "version": "3.2.0", 19244 "version": "3.2.0",
19237 "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.2.0.tgz", 19245 "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.2.0.tgz",
19238 "integrity": "sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw==", 19246 "integrity": "sha1-DheP6Xgg04mokovHlTXb5ows/yE=",
19239 "dev": true, 19247 "dev": true,
19240 "requires": { 19248 "requires": {
19241 "sort-keys": "^2.0.0", 19249 "sort-keys": "^2.0.0",
@@ -19277,7 +19285,7 @@
19277 }, 19285 },
19278 "xmlbuilder": { 19286 "xmlbuilder": {
19279 "version": "9.0.7", 19287 "version": "9.0.7",
19280 "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", 19288 "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
19281 "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", 19289 "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
19282 "dev": true 19290 "dev": true
19283 }, 19291 },
diff --git a/packages/forms/src/input/index.tsx b/packages/forms/src/input/index.tsx
index 478738cad..cc3709b1a 100644
--- a/packages/forms/src/input/index.tsx
+++ b/packages/forms/src/input/index.tsx
@@ -25,6 +25,7 @@ interface IProps extends React.InputHTMLAttributes<HTMLInputElement>, IFormField
25 showPasswordToggle?: boolean; 25 showPasswordToggle?: boolean;
26 data: IData; 26 data: IData;
27 inputClassName?: string; 27 inputClassName?: string;
28 onEnterKey?: Function;
28} 29}
29 30
30interface IState { 31interface IState {
@@ -81,6 +82,13 @@ class InputComponent extends Component<IProps, IState> {
81 } 82 }
82 } 83 }
83 84
85 onInputKeyPress(e: React.KeyboardEvent) {
86 if (e.key === "Enter") {
87 const { onEnterKey } = this.props;
88 onEnterKey && onEnterKey();
89 }
90 }
91
84 render() { 92 render() {
85 const { 93 const {
86 classes, 94 classes,
@@ -101,6 +109,7 @@ class InputComponent extends Component<IProps, IState> {
101 placeholder, 109 placeholder,
102 spellCheck, 110 spellCheck,
103 onBlur, 111 onBlur,
112 onEnterKey,
104 onFocus, 113 onFocus,
105 } = this.props; 114 } = this.props;
106 115
@@ -147,6 +156,7 @@ class InputComponent extends Component<IProps, IState> {
147 onFocus={onFocus} 156 onFocus={onFocus}
148 onBlur={onBlur} 157 onBlur={onBlur}
149 disabled={disabled} 158 disabled={disabled}
159 onKeyPress={this.onInputKeyPress.bind(this)}
150 /> 160 />
151 {suffix && ( 161 {suffix && (
152 <span className={classes.suffix}> 162 <span className={classes.suffix}>
diff --git a/src/actions/index.js b/src/actions/index.js
index 59acabb0b..00f843cd6 100644
--- a/src/actions/index.js
+++ b/src/actions/index.js
@@ -11,6 +11,7 @@ import payment from './payment';
11import news from './news'; 11import news from './news';
12import settings from './settings'; 12import settings from './settings';
13import requests from './requests'; 13import requests from './requests';
14import workspaces from '../features/workspaces/actions';
14 15
15const actions = Object.assign({}, { 16const actions = Object.assign({}, {
16 service, 17 service,
@@ -25,4 +26,7 @@ const actions = Object.assign({}, {
25 requests, 26 requests,
26}); 27});
27 28
28export default defineActions(actions, PropTypes.checkPropTypes); 29export default Object.assign(
30 defineActions(actions, PropTypes.checkPropTypes),
31 { workspaces },
32);
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 @@
1export const createActionsFromDefinitions = (actionDefinitions, validate) => {
2 const actions = {};
3 Object.keys(actionDefinitions).forEach((actionName) => {
4 const action = (params) => {
5 const schema = actionDefinitions[actionName];
6 validate(schema, params, actionName);
7 action.notify(params);
8 };
9 actions[actionName] = action;
10 action.listeners = [];
11 action.listen = listener => action.listeners.push(listener);
12 action.notify = params => action.listeners.forEach(listener => listener(params));
13 });
14 return actions;
15};
16
1export default (definitions, validate) => { 17export default (definitions, validate) => {
2 const newActions = {}; 18 const newActions = {};
3 Object.keys(definitions).forEach((scopeName) => { 19 Object.keys(definitions).forEach((scopeName) => {
4 newActions[scopeName] = {}; 20 newActions[scopeName] = createActionsFromDefinitions(definitions[scopeName], validate);
5 Object.keys(definitions[scopeName]).forEach((actionName) => {
6 const action = (params) => {
7 const schema = definitions[scopeName][actionName];
8 validate(schema, params, actionName);
9 action.notify(params);
10 };
11 newActions[scopeName][actionName] = action;
12 action.listeners = [];
13 action.listen = listener => action.listeners.push(listener);
14 action.notify = params => action.listeners.forEach(listener => listener(params));
15 });
16 }); 21 });
17 return newActions; 22 return newActions;
18}; 23};
diff --git a/src/api/utils/auth.js b/src/api/utils/auth.js
new file mode 100644
index 000000000..d469853a5
--- /dev/null
+++ b/src/api/utils/auth.js
@@ -0,0 +1,28 @@
1import { remote } from 'electron';
2import localStorage from 'mobx-localstorage';
3
4const { app } = remote;
5
6export const prepareAuthRequest = (options, auth = true) => {
7 const request = Object.assign(options, {
8 mode: 'cors',
9 headers: Object.assign({
10 'Content-Type': 'application/json',
11 'X-Franz-Source': 'desktop',
12 'X-Franz-Version': app.getVersion(),
13 'X-Franz-platform': process.platform,
14 'X-Franz-Timezone-Offset': new Date().getTimezoneOffset(),
15 'X-Franz-System-Locale': app.getLocale(),
16 }, options.headers),
17 });
18
19 if (auth) {
20 request.headers.Authorization = `Bearer ${localStorage.getItem('authToken')}`;
21 }
22
23 return request;
24};
25
26export const sendAuthRequest = (url, options) => (
27 window.fetch(url, prepareAuthRequest(options))
28);
diff --git a/src/app.js b/src/app.js
index 6660feb46..d3b540f62 100644
--- a/src/app.js
+++ b/src/app.js
@@ -39,6 +39,8 @@ import PricingScreen from './containers/auth/PricingScreen';
39import InviteScreen from './containers/auth/InviteScreen'; 39import InviteScreen from './containers/auth/InviteScreen';
40import AuthLayoutContainer from './containers/auth/AuthLayoutContainer'; 40import AuthLayoutContainer from './containers/auth/AuthLayoutContainer';
41import SubscriptionPopupScreen from './containers/subscription/SubscriptionPopupScreen'; 41import SubscriptionPopupScreen from './containers/subscription/SubscriptionPopupScreen';
42import WorkspacesScreen from './features/workspaces/containers/WorkspacesScreen';
43import EditWorkspaceScreen from './features/workspaces/containers/EditWorkspaceScreen';
42 44
43// Add Polyfills 45// Add Polyfills
44smoothScroll.polyfill(); 46smoothScroll.polyfill();
@@ -75,6 +77,8 @@ window.addEventListener('load', () => {
75 <Route path="/settings/recipes/:filter" component={RecipesScreen} /> 77 <Route path="/settings/recipes/:filter" component={RecipesScreen} />
76 <Route path="/settings/services" component={ServicesScreen} /> 78 <Route path="/settings/services" component={ServicesScreen} />
77 <Route path="/settings/services/:action/:id" component={EditServiceScreen} /> 79 <Route path="/settings/services/:action/:id" component={EditServiceScreen} />
80 <Route path="/settings/workspaces" component={WorkspacesScreen} />
81 <Route path="/settings/workspaces/:action/:id" component={EditWorkspaceScreen} />
78 <Route path="/settings/user" component={AccountScreen} /> 82 <Route path="/settings/user" component={AccountScreen} />
79 <Route path="/settings/user/edit" component={EditUserScreen} /> 83 <Route path="/settings/user/edit" component={EditUserScreen} />
80 <Route path="/settings/app" component={EditSettingsScreen} /> 84 <Route path="/settings/app" component={EditSettingsScreen} />
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 {
31 openSettings: PropTypes.func.isRequired, 31 openSettings: PropTypes.func.isRequired,
32 toggleMuteApp: PropTypes.func.isRequired, 32 toggleMuteApp: PropTypes.func.isRequired,
33 isAppMuted: PropTypes.bool.isRequired, 33 isAppMuted: PropTypes.bool.isRequired,
34 } 34 };
35 35
36 static contextTypes = { 36 static contextTypes = {
37 intl: intlShape, 37 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 {
19 updateService: PropTypes.func.isRequired, 19 updateService: PropTypes.func.isRequired,
20 showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired, 20 showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired,
21 showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired, 21 showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired,
22 } 22 };
23 23
24 onSortEnd = ({ oldIndex, newIndex }) => { 24 onSortEnd = ({ oldIndex, newIndex }) => {
25 const { 25 const {
@@ -45,7 +45,7 @@ export default @observer class TabBar extends Component {
45 redirect: false, 45 redirect: false,
46 }); 46 });
47 } 47 }
48 } 48 };
49 49
50 disableService({ serviceId }) { 50 disableService({ serviceId }) {
51 this.toggleService({ serviceId, isEnabled: false }); 51 this.toggleService({ serviceId, isEnabled: false });
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({
14 id: 'settings.navigation.yourServices', 14 id: 'settings.navigation.yourServices',
15 defaultMessage: '!!!Your services', 15 defaultMessage: '!!!Your services',
16 }, 16 },
17 yourWorkspaces: {
18 id: 'settings.navigation.yourWorkspaces',
19 defaultMessage: '!!!Your workspaces',
20 },
17 account: { 21 account: {
18 id: 'settings.navigation.account', 22 id: 'settings.navigation.account',
19 defaultMessage: '!!!Account', 23 defaultMessage: '!!!Account',
@@ -64,6 +68,14 @@ export default @inject('stores') @observer class SettingsNavigation extends Comp
64 <span className="badge">{serviceCount}</span> 68 <span className="badge">{serviceCount}</span>
65 </Link> 69 </Link>
66 <Link 70 <Link
71 to="/settings/workspaces"
72 className="settings-navigation__link"
73 activeClassName="is-active"
74 >
75 {intl.formatMessage(messages.yourWorkspaces)}
76 {' '}
77 </Link>
78 <Link
67 to="/settings/user" 79 to="/settings/user"
68 className="settings-navigation__link" 80 className="settings-navigation__link"
69 activeClassName="is-active" 81 activeClassName="is-active"
diff --git a/src/config.js b/src/config.js
index 479572edb..d619a7492 100644
--- a/src/config.js
+++ b/src/config.js
@@ -41,6 +41,8 @@ export const DEFAULT_FEATURES_CONFIG = {
41 }, 41 },
42 isServiceProxyEnabled: false, 42 isServiceProxyEnabled: false,
43 isServiceProxyPremiumFeature: true, 43 isServiceProxyPremiumFeature: true,
44 isWorkspacePremiumFeature: true,
45 isWorkspaceEnabled: true,
44}; 46};
45 47
46export const DEFAULT_WINDOW_OPTIONS = { 48export const DEFAULT_WINDOW_OPTIONS = {
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)) {
28} 28}
29 29
30export const API = api; 30export const API = api;
31export const API_VERSION = 'v1';
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
38 38
39 state = { 39 state = {
40 countdown: config.delayDuration, 40 countdown: config.delayDuration,
41 } 41 };
42 42
43 countdownInterval = null; 43 countdownInterval = null;
44 44
diff --git a/src/features/workspaces/actions.js b/src/features/workspaces/actions.js
new file mode 100644
index 000000000..25246de09
--- /dev/null
+++ b/src/features/workspaces/actions.js
@@ -0,0 +1,22 @@
1import PropTypes from 'prop-types';
2import Workspace from './models/Workspace';
3import { createActionsFromDefinitions } from '../../actions/lib/actions';
4
5export default createActionsFromDefinitions({
6 edit: {
7 workspace: PropTypes.instanceOf(Workspace).isRequired,
8 },
9 create: {
10 name: PropTypes.string.isRequired,
11 },
12 delete: {
13 workspace: PropTypes.instanceOf(Workspace).isRequired,
14 },
15 update: {
16 workspace: PropTypes.instanceOf(Workspace).isRequired,
17 },
18 activate: {
19 workspace: PropTypes.instanceOf(Workspace).isRequired,
20 },
21 deactivate: {},
22}, PropTypes.checkPropTypes);
diff --git a/src/features/workspaces/api.js b/src/features/workspaces/api.js
new file mode 100644
index 000000000..733cb5593
--- /dev/null
+++ b/src/features/workspaces/api.js
@@ -0,0 +1,39 @@
1import { pick } from 'lodash';
2import { sendAuthRequest } from '../../api/utils/auth';
3import { API, API_VERSION } from '../../environment';
4
5export default {
6 getUserWorkspaces: async () => {
7 const url = `${API}/${API_VERSION}/workspace`;
8 const request = await sendAuthRequest(url, { method: 'GET' });
9 if (!request.ok) throw request;
10 return request.json();
11 },
12
13 createWorkspace: async (name) => {
14 const url = `${API}/${API_VERSION}/workspace`;
15 const request = await sendAuthRequest(url, {
16 method: 'POST',
17 body: JSON.stringify({ name }),
18 });
19 if (!request.ok) throw request;
20 return request.json();
21 },
22
23 deleteWorkspace: async (workspace) => {
24 const url = `${API}/${API_VERSION}/workspace/${workspace.id}`;
25 const request = await sendAuthRequest(url, { method: 'DELETE' });
26 if (!request.ok) throw request;
27 return request.json();
28 },
29
30 updateWorkspace: async (workspace) => {
31 const url = `${API}/${API_VERSION}/workspace/${workspace.id}`;
32 const request = await sendAuthRequest(url, {
33 method: 'PUT',
34 body: JSON.stringify(pick(workspace, ['name', 'services'])),
35 });
36 if (!request.ok) throw request;
37 return request.json();
38 },
39};
diff --git a/src/features/workspaces/components/CreateWorkspaceForm.js b/src/features/workspaces/components/CreateWorkspaceForm.js
new file mode 100644
index 000000000..83f6e07f7
--- /dev/null
+++ b/src/features/workspaces/components/CreateWorkspaceForm.js
@@ -0,0 +1,93 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import { Input, Button } from '@meetfranz/forms';
6import injectSheet from 'react-jss';
7import Form from '../../../lib/Form';
8import { required } from '../../../helpers/validation-helpers';
9
10const messages = defineMessages({
11 submitButton: {
12 id: 'settings.workspace.add.form.submitButton',
13 defaultMessage: '!!!Save workspace',
14 },
15 name: {
16 id: 'settings.workspace.add.form.name',
17 defaultMessage: '!!!Name',
18 },
19});
20
21const styles = () => ({
22 form: {
23 display: 'flex',
24 },
25 input: {
26 flexGrow: 1,
27 marginRight: '10px',
28 },
29 submitButton: {
30 height: 'inherit',
31 marginTop: '3px',
32 },
33});
34
35@injectSheet(styles) @observer
36class CreateWorkspaceForm extends Component {
37 static contextTypes = {
38 intl: intlShape,
39 };
40
41 static propTypes = {
42 classes: PropTypes.object.isRequired,
43 onSubmit: PropTypes.func.isRequired,
44 };
45
46 form = (() => {
47 const { intl } = this.context;
48 return new Form({
49 fields: {
50 name: {
51 label: intl.formatMessage(messages.name),
52 placeholder: intl.formatMessage(messages.name),
53 value: '',
54 validators: [required],
55 },
56 },
57 });
58 })();
59
60 submitForm() {
61 const { form } = this;
62 form.submit({
63 onSuccess: async (f) => {
64 const { onSubmit } = this.props;
65 onSubmit(f.values());
66 },
67 });
68 }
69
70 render() {
71 const { intl } = this.context;
72 const { classes } = this.props;
73 const { form } = this;
74 return (
75 <div className={classes.form}>
76 <Input
77 className={classes.input}
78 {...form.$('name').bind()}
79 showLabel={false}
80 onEnterKey={this.submitForm.bind(this, form)}
81 />
82 <Button
83 className={classes.submitButton}
84 type="submit"
85 label={intl.formatMessage(messages.submitButton)}
86 onClick={this.submitForm.bind(this, form)}
87 />
88 </div>
89 );
90 }
91}
92
93export default CreateWorkspaceForm;
diff --git a/src/features/workspaces/components/EditWorkspaceForm.js b/src/features/workspaces/components/EditWorkspaceForm.js
new file mode 100644
index 000000000..48090f608
--- /dev/null
+++ b/src/features/workspaces/components/EditWorkspaceForm.js
@@ -0,0 +1,192 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import { Link } from 'react-router';
6import { Input, Button } from '@meetfranz/forms';
7import injectSheet from 'react-jss';
8
9import Workspace from '../models/Workspace';
10import Service from '../../../models/Service';
11import Form from '../../../lib/Form';
12import { required } from '../../../helpers/validation-helpers';
13import ServiceListItem from './ServiceListItem';
14
15const messages = defineMessages({
16 buttonDelete: {
17 id: 'settings.workspace.form.buttonDelete',
18 defaultMessage: '!!!Delete workspace',
19 },
20 buttonSave: {
21 id: 'settings.workspace.form.buttonSave',
22 defaultMessage: '!!!Save workspace',
23 },
24 name: {
25 id: 'settings.workspace.form.name',
26 defaultMessage: '!!!Name',
27 },
28 yourWorkspaces: {
29 id: 'settings.workspace.form.yourWorkspaces',
30 defaultMessage: '!!!Your workspaces',
31 },
32 servicesInWorkspaceHeadline: {
33 id: 'settings.workspace.form.servicesInWorkspaceHeadline',
34 defaultMessage: '!!!Services in this Workspace',
35 },
36});
37
38const styles = () => ({
39 nameInput: {
40 height: 'auto',
41 },
42 serviceList: {
43 height: 'auto',
44 },
45});
46
47@injectSheet(styles) @observer
48class EditWorkspaceForm extends Component {
49 static contextTypes = {
50 intl: intlShape,
51 };
52
53 static propTypes = {
54 classes: PropTypes.object.isRequired,
55 isDeleting: PropTypes.bool.isRequired,
56 isSaving: PropTypes.bool.isRequired,
57 onDelete: PropTypes.func.isRequired,
58 onSave: PropTypes.func.isRequired,
59 services: PropTypes.arrayOf(PropTypes.instanceOf(Service)).isRequired,
60 workspace: PropTypes.instanceOf(Workspace).isRequired,
61 };
62
63 form = this.prepareWorkspaceForm(this.props.workspace);
64
65 componentWillReceiveProps(nextProps) {
66 const { workspace } = this.props;
67 if (workspace.id !== nextProps.workspace.id) {
68 this.form = this.prepareWorkspaceForm(nextProps.workspace);
69 }
70 }
71
72 prepareWorkspaceForm(workspace) {
73 const { intl } = this.context;
74 return new Form({
75 fields: {
76 name: {
77 label: intl.formatMessage(messages.name),
78 placeholder: intl.formatMessage(messages.name),
79 value: workspace.name,
80 validators: [required],
81 },
82 services: {
83 value: workspace.services.slice(),
84 },
85 },
86 });
87 }
88
89 submitForm(form) {
90 form.submit({
91 onSuccess: async (f) => {
92 const { onSave } = this.props;
93 const values = f.values();
94 onSave(values);
95 },
96 onError: async () => {},
97 });
98 }
99
100 toggleService(service) {
101 const servicesField = this.form.$('services');
102 const serviceIds = servicesField.value;
103 if (serviceIds.includes(service.id)) {
104 serviceIds.splice(serviceIds.indexOf(service.id), 1);
105 } else {
106 serviceIds.push(service.id);
107 }
108 servicesField.set(serviceIds);
109 }
110
111 render() {
112 const { intl } = this.context;
113 const {
114 classes,
115 isDeleting,
116 isSaving,
117 onDelete,
118 workspace,
119 services,
120 } = this.props;
121 const { form } = this;
122 const workspaceServices = form.$('services').value;
123 return (
124 <div className="settings__main">
125 <div className="settings__header">
126 <span className="settings__header-item">
127 <Link to="/settings/workspaces">
128 {intl.formatMessage(messages.yourWorkspaces)}
129 </Link>
130 </span>
131 <span className="separator" />
132 <span className="settings__header-item">
133 {workspace.name}
134 </span>
135 </div>
136 <div className="settings__body">
137 <div className={classes.nameInput}>
138 <Input {...form.$('name').bind()} />
139 </div>
140 <h2>{intl.formatMessage(messages.servicesInWorkspaceHeadline)}</h2>
141 <div className={classes.serviceList}>
142 {services.map(s => (
143 <ServiceListItem
144 key={s.id}
145 service={s}
146 isInWorkspace={workspaceServices.includes(s.id)}
147 onToggle={() => this.toggleService(s)}
148 />
149 ))}
150 </div>
151 </div>
152 <div className="settings__controls">
153 {/* ===== Delete Button ===== */}
154 {isDeleting ? (
155 <Button
156 label={intl.formatMessage(messages.buttonDelete)}
157 loaded={false}
158 buttonType="secondary"
159 className="settings__delete-button"
160 disabled
161 />
162 ) : (
163 <Button
164 buttonType="danger"
165 label={intl.formatMessage(messages.buttonDelete)}
166 className="settings__delete-button"
167 onClick={onDelete}
168 />
169 )}
170 {/* ===== Save Button ===== */}
171 {isSaving ? (
172 <Button
173 type="submit"
174 label={intl.formatMessage(messages.buttonSave)}
175 loaded={!isSaving}
176 buttonType="secondary"
177 disabled
178 />
179 ) : (
180 <Button
181 type="submit"
182 label={intl.formatMessage(messages.buttonSave)}
183 onClick={this.submitForm.bind(this, form)}
184 />
185 )}
186 </div>
187 </div>
188 );
189 }
190}
191
192export default EditWorkspaceForm;
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 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer } from 'mobx-react';
4import injectSheet from 'react-jss';
5import { Toggle } from '@meetfranz/forms';
6
7import Service from '../../../models/Service';
8
9const styles = () => ({
10 service: {
11 height: 'auto',
12 display: 'flex',
13 },
14 name: {
15 marginTop: '4px',
16 },
17});
18
19@injectSheet(styles) @observer
20class ServiceListItem extends Component {
21 static propTypes = {
22 classes: PropTypes.object.isRequired,
23 isInWorkspace: PropTypes.bool.isRequired,
24 onToggle: PropTypes.func.isRequired,
25 service: PropTypes.instanceOf(Service).isRequired,
26 };
27
28 render() {
29 const {
30 classes,
31 isInWorkspace,
32 onToggle,
33 service,
34 } = this.props;
35
36 return (
37 <div className={classes.service}>
38 <Toggle
39 checked={isInWorkspace}
40 onChange={onToggle}
41 label={service.name}
42 />
43 </div>
44 );
45 }
46}
47
48export default ServiceListItem;
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 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { intlShape } from 'react-intl';
4import { observer } from 'mobx-react';
5import classnames from 'classnames';
6import Workspace from '../models/Workspace';
7
8// const messages = defineMessages({});
9
10@observer
11class WorkspaceItem extends Component {
12 static propTypes = {
13 workspace: PropTypes.instanceOf(Workspace).isRequired,
14 onItemClick: PropTypes.func.isRequired,
15 };
16
17 static contextTypes = {
18 intl: intlShape,
19 };
20
21 render() {
22 const { workspace, onItemClick } = this.props;
23 // const { intl } = this.context;
24
25 return (
26 <tr
27 className={classnames({
28 'workspace-table__row': true,
29 })}
30 >
31 <td
32 className="workspace-table__column-name"
33 onClick={() => onItemClick(workspace)}
34 >
35 {workspace.name}
36 </td>
37 </tr>
38 );
39 }
40}
41
42export default WorkspaceItem;
diff --git a/src/features/workspaces/components/WorkspacesDashboard.js b/src/features/workspaces/components/WorkspacesDashboard.js
new file mode 100644
index 000000000..917807302
--- /dev/null
+++ b/src/features/workspaces/components/WorkspacesDashboard.js
@@ -0,0 +1,85 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer, PropTypes as MobxPropTypes } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import injectSheet from 'react-jss';
6
7import Loader from '../../../components/ui/Loader';
8import WorkspaceItem from './WorkspaceItem';
9import CreateWorkspaceForm from './CreateWorkspaceForm';
10
11const messages = defineMessages({
12 headline: {
13 id: 'settings.workspaces.headline',
14 defaultMessage: '!!!Your workspaces',
15 },
16 noServicesAdded: {
17 id: 'settings.workspaces.noWorkspacesAdded',
18 defaultMessage: '!!!You haven\'t added any workspaces yet.',
19 },
20});
21
22const styles = () => ({
23 createForm: {
24 height: 'auto',
25 marginBottom: '20px',
26 },
27});
28
29@observer @injectSheet(styles)
30class WorkspacesDashboard extends Component {
31 static propTypes = {
32 classes: PropTypes.object.isRequired,
33 isLoading: PropTypes.bool.isRequired,
34 onCreateWorkspaceSubmit: PropTypes.func.isRequired,
35 onWorkspaceClick: PropTypes.func.isRequired,
36 workspaces: MobxPropTypes.arrayOrObservableArray.isRequired,
37 };
38
39 static contextTypes = {
40 intl: intlShape,
41 };
42
43 render() {
44 const {
45 workspaces,
46 isLoading,
47 onCreateWorkspaceSubmit,
48 onWorkspaceClick,
49 classes,
50 } = this.props;
51 const { intl } = this.context;
52
53 return (
54 <div className="settings__main">
55 <div className="settings__header">
56 <h1>{intl.formatMessage(messages.headline)}</h1>
57 </div>
58 <div className="settings__body">
59 <div className={classes.body}>
60 <div className={classes.createForm}>
61 <CreateWorkspaceForm onSubmit={onCreateWorkspaceSubmit} />
62 </div>
63 {isLoading ? (
64 <Loader />
65 ) : (
66 <table className="workspace-table">
67 <tbody>
68 {workspaces.map(workspace => (
69 <WorkspaceItem
70 key={workspace.id}
71 workspace={workspace}
72 onItemClick={w => onWorkspaceClick(w)}
73 />
74 ))}
75 </tbody>
76 </table>
77 )}
78 </div>
79 </div>
80 </div>
81 );
82 }
83}
84
85export default WorkspacesDashboard;
diff --git a/src/features/workspaces/containers/EditWorkspaceScreen.js b/src/features/workspaces/containers/EditWorkspaceScreen.js
new file mode 100644
index 000000000..1b13bc2d4
--- /dev/null
+++ b/src/features/workspaces/containers/EditWorkspaceScreen.js
@@ -0,0 +1,59 @@
1import React, { Component } from 'react';
2import { inject, observer } from 'mobx-react';
3import PropTypes from 'prop-types';
4
5import ErrorBoundary from '../../../components/util/ErrorBoundary';
6import EditWorkspaceForm from '../components/EditWorkspaceForm';
7import { workspacesState } from '../state';
8import ServicesStore from '../../../stores/ServicesStore';
9import Workspace from '../models/Workspace';
10
11@inject('stores', 'actions') @observer
12class EditWorkspaceScreen extends Component {
13 static propTypes = {
14 actions: PropTypes.shape({
15 workspace: PropTypes.shape({
16 delete: PropTypes.func.isRequired,
17 }),
18 }).isRequired,
19 stores: PropTypes.shape({
20 services: PropTypes.instanceOf(ServicesStore).isRequired,
21 }).isRequired,
22 };
23
24 onDelete = () => {
25 const { workspaceBeingEdited } = workspacesState;
26 const { actions } = this.props;
27 if (!workspaceBeingEdited) return null;
28 actions.workspaces.delete({ workspace: workspaceBeingEdited });
29 };
30
31 onSave = (values) => {
32 const { workspaceBeingEdited } = workspacesState;
33 const { actions } = this.props;
34 const workspace = new Workspace(
35 Object.assign({}, workspaceBeingEdited, values),
36 );
37 actions.workspaces.update({ workspace });
38 };
39
40 render() {
41 const { workspaceBeingEdited } = workspacesState;
42 const { stores } = this.props;
43 if (!workspaceBeingEdited) return null;
44 return (
45 <ErrorBoundary>
46 <EditWorkspaceForm
47 workspace={workspaceBeingEdited}
48 services={stores.services.all}
49 onDelete={this.onDelete}
50 onSave={this.onSave}
51 isDeleting={false}
52 isSaving={false}
53 />
54 </ErrorBoundary>
55 );
56 }
57}
58
59export default EditWorkspaceScreen;
diff --git a/src/features/workspaces/containers/WorkspacesScreen.js b/src/features/workspaces/containers/WorkspacesScreen.js
new file mode 100644
index 000000000..94e714255
--- /dev/null
+++ b/src/features/workspaces/containers/WorkspacesScreen.js
@@ -0,0 +1,33 @@
1import React, { Component } from 'react';
2import { inject, observer } from 'mobx-react';
3import PropTypes from 'prop-types';
4import { workspacesState } from '../state';
5import WorkspacesDashboard from '../components/WorkspacesDashboard';
6import ErrorBoundary from '../../../components/util/ErrorBoundary';
7
8@inject('actions') @observer
9class WorkspacesScreen extends Component {
10 static propTypes = {
11 actions: PropTypes.shape({
12 workspace: PropTypes.shape({
13 edit: PropTypes.func.isRequired,
14 }),
15 }).isRequired,
16 };
17
18 render() {
19 const { actions } = this.props;
20 return (
21 <ErrorBoundary>
22 <WorkspacesDashboard
23 workspaces={workspacesState.workspaces}
24 isLoading={workspacesState.isLoading}
25 onCreateWorkspaceSubmit={data => actions.workspaces.create(data)}
26 onWorkspaceClick={w => actions.workspaces.edit({ workspace: w })}
27 />
28 </ErrorBoundary>
29 );
30 }
31}
32
33export default WorkspacesScreen;
diff --git a/src/features/workspaces/index.js b/src/features/workspaces/index.js
new file mode 100644
index 000000000..26cadea64
--- /dev/null
+++ b/src/features/workspaces/index.js
@@ -0,0 +1,67 @@
1import { reaction, runInAction } from 'mobx';
2import WorkspacesStore from './store';
3import api from './api';
4import { workspacesState, resetState } from './state';
5
6const debug = require('debug')('Franz:feature:workspaces');
7
8let store = null;
9
10export const filterServicesByActiveWorkspace = (services) => {
11 const { isFeatureActive, activeWorkspace } = workspacesState;
12 if (isFeatureActive && activeWorkspace) {
13 return services.filter(s => activeWorkspace.services.includes(s.id));
14 }
15 return services;
16};
17
18export const getActiveWorkspaceServices = services => (
19 filterServicesByActiveWorkspace(services)
20);
21
22export default function initWorkspaces(stores, actions) {
23 const { features, user } = stores;
24
25 // Toggle workspace feature
26 reaction(
27 () => (
28 features.features.isWorkspaceEnabled && (
29 !features.features.isWorkspacePremiumFeature || user.data.isPremium
30 )
31 ),
32 (isEnabled) => {
33 if (isEnabled) {
34 debug('Initializing `workspaces` feature');
35 store = new WorkspacesStore(stores, api, actions, workspacesState);
36 store.initialize();
37 runInAction(() => { workspacesState.isFeatureActive = true; });
38 } else if (store) {
39 debug('Disabling `workspaces` feature');
40 runInAction(() => { workspacesState.isFeatureActive = false; });
41 store.teardown();
42 store = null;
43 resetState(); // Reset state to default
44 }
45 },
46 {
47 fireImmediately: true,
48 },
49 );
50
51 // Update active service on workspace switches
52 reaction(() => ({
53 isFeatureActive: workspacesState.isFeatureActive,
54 activeWorkspace: workspacesState.activeWorkspace,
55 }), ({ isFeatureActive, activeWorkspace }) => {
56 if (!isFeatureActive) return;
57 if (activeWorkspace) {
58 const services = stores.services.allDisplayed;
59 const activeService = services.find(s => s.isActive);
60 const workspaceServices = filterServicesByActiveWorkspace(services);
61 const isActiveServiceInWorkspace = workspaceServices.includes(activeService);
62 if (!isActiveServiceInWorkspace) {
63 actions.service.setActive({ serviceId: workspaceServices[0].id });
64 }
65 }
66 });
67}
diff --git a/src/features/workspaces/models/Workspace.js b/src/features/workspaces/models/Workspace.js
new file mode 100644
index 000000000..6c73d7095
--- /dev/null
+++ b/src/features/workspaces/models/Workspace.js
@@ -0,0 +1,25 @@
1import { observable } from 'mobx';
2
3export default class Workspace {
4 id = null;
5
6 @observable name = null;
7
8 @observable order = null;
9
10 @observable services = [];
11
12 @observable userId = null;
13
14 constructor(data) {
15 if (!data.id) {
16 throw Error('Workspace requires Id');
17 }
18
19 this.id = data.id;
20 this.name = data.name;
21 this.order = data.order;
22 this.services.replace(data.services);
23 this.userId = data.userId;
24 }
25}
diff --git a/src/features/workspaces/state.js b/src/features/workspaces/state.js
new file mode 100644
index 000000000..963b96f81
--- /dev/null
+++ b/src/features/workspaces/state.js
@@ -0,0 +1,15 @@
1import { observable } from 'mobx';
2
3const defaultState = {
4 activeWorkspace: null,
5 isLoading: false,
6 isFeatureActive: false,
7 workspaces: [],
8 workspaceBeingEdited: null,
9};
10
11export const workspacesState = observable(defaultState);
12
13export function resetState() {
14 Object.assign(workspacesState, defaultState);
15}
diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js
new file mode 100644
index 000000000..a2997a0d2
--- /dev/null
+++ b/src/features/workspaces/store.js
@@ -0,0 +1,114 @@
1import { observable, reaction, action } from 'mobx';
2import Store from '../../stores/lib/Store';
3import CachedRequest from '../../stores/lib/CachedRequest';
4import Workspace from './models/Workspace';
5import { matchRoute } from '../../helpers/routing-helpers';
6import workspaceActions from './actions';
7
8const debug = require('debug')('Franz:feature:workspaces');
9
10export default class WorkspacesStore extends Store {
11 @observable allWorkspacesRequest = new CachedRequest(this.api, 'getUserWorkspaces');
12
13 constructor(stores, api, actions, state) {
14 super(stores, api, actions);
15 this.state = state;
16 }
17
18 setup() {
19 debug('fetching workspaces');
20 this.allWorkspacesRequest.execute();
21
22 /**
23 * Update the state workspaces array when workspaces request has results.
24 */
25 reaction(
26 () => this.allWorkspacesRequest.result,
27 workspaces => this._setWorkspaces(workspaces),
28 );
29 /**
30 * Update the loading state when workspace request is executing.
31 */
32 reaction(
33 () => this.allWorkspacesRequest.isExecuting,
34 isExecuting => this._setIsLoading(isExecuting),
35 );
36 /**
37 * Update the state with the workspace to be edited when route matches.
38 */
39 reaction(
40 () => ({
41 pathname: this.stores.router.location.pathname,
42 workspaces: this.state.workspaces,
43 }),
44 ({ pathname }) => {
45 const match = matchRoute('/settings/workspaces/edit/:id', pathname);
46 if (match) {
47 this.state.workspaceBeingEdited = this._getWorkspaceById(match.id);
48 }
49 },
50 );
51
52 workspaceActions.edit.listen(this._edit);
53 workspaceActions.create.listen(this._create);
54 workspaceActions.delete.listen(this._delete);
55 workspaceActions.update.listen(this._update);
56 workspaceActions.activate.listen(this._setActiveWorkspace);
57 workspaceActions.deactivate.listen(this._deactivateActiveWorkspace);
58 }
59
60 _getWorkspaceById = id => this.state.workspaces.find(w => w.id === id);
61
62 @action _setWorkspaces = (workspaces) => {
63 debug('setting user workspaces', workspaces.slice());
64 this.state.workspaces = workspaces.map(data => new Workspace(data));
65 };
66
67 @action _setIsLoading = (isLoading) => {
68 this.state.isLoading = isLoading;
69 };
70
71 @action _edit = ({ workspace }) => {
72 this.stores.router.push(`/settings/workspaces/edit/${workspace.id}`);
73 };
74
75 @action _create = async ({ name }) => {
76 try {
77 const result = await this.api.createWorkspace(name);
78 const workspace = new Workspace(result);
79 this.state.workspaces.push(workspace);
80 this._edit({ workspace });
81 } catch (error) {
82 throw error;
83 }
84 };
85
86 @action _delete = async ({ workspace }) => {
87 try {
88 await this.api.deleteWorkspace(workspace);
89 this.state.workspaces.remove(workspace);
90 this.stores.router.push('/settings/workspaces');
91 } catch (error) {
92 throw error;
93 }
94 };
95
96 @action _update = async ({ workspace }) => {
97 try {
98 await this.api.updateWorkspace(workspace);
99 const localWorkspace = this.state.workspaces.find(ws => ws.id === workspace.id);
100 Object.assign(localWorkspace, workspace);
101 this.stores.router.push('/settings/workspaces');
102 } catch (error) {
103 throw error;
104 }
105 };
106
107 @action _setActiveWorkspace = ({ workspace }) => {
108 this.state.activeWorkspace = workspace;
109 };
110
111 @action _deactivateActiveWorkspace = () => {
112 this.state.activeWorkspace = null;
113 };
114}
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 @@
1@import '../../../styles/config';
2
3.theme__dark .workspace-table {
4 .workspace-table__column-info .mdi { color: $dark-theme-gray-lightest; }
5
6 .workspace-table__row {
7 border-bottom: 1px solid $dark-theme-gray-darker;
8
9 &:hover { background: $dark-theme-gray-darker; }
10 &.workspace-table__row--disabled { color: $dark-theme-gray; }
11 }
12}
13
14.workspace-table {
15 width: 100%;
16
17 .workspace-table__toggle {
18 width: 60px;
19
20 .franz-form__field {
21 margin-bottom: 0;
22 }
23 }
24
25 .workspace-table__column-action {
26 width: 40px
27 }
28
29 .workspace-table__column-info {
30 width: 40px;
31
32 .mdi {
33 color: $theme-gray-light;
34 display: block;
35 font-size: 18px;
36 }
37 }
38
39 .workspace-table__row {
40 border-bottom: 1px solid $theme-gray-lightest;
41
42 &:hover {
43 cursor: initial;
44 background: $theme-gray-lightest;
45 }
46
47 &.workspace-table__row--disabled {
48 color: $theme-gray-light;
49 }
50 }
51
52 td { padding: 10px; }
53}
diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json
index 13b8d12fc..3ca62ca56 100644
--- a/src/i18n/locales/de.json
+++ b/src/i18n/locales/de.json
@@ -85,6 +85,9 @@
85 "menu.window" : "Fenster", 85 "menu.window" : "Fenster",
86 "menu.window.close" : "Schließen", 86 "menu.window.close" : "Schließen",
87 "menu.window.minimize" : "Minimieren", 87 "menu.window.minimize" : "Minimieren",
88 "menu.workspaces": "Workspaces",
89 "menu.workspaces.defaultWorkspace": "All services",
90 "menu.workspaces.addNewWorkspace": "Add New Workspace",
88 "password.email.label" : "E-Mail Adresse", 91 "password.email.label" : "E-Mail Adresse",
89 "password.headline" : "Passwort zurücksetzen", 92 "password.headline" : "Passwort zurücksetzen",
90 "password.link.login" : "An Deinem Konto anmelden", 93 "password.link.login" : "An Deinem Konto anmelden",
@@ -169,6 +172,7 @@
169 "settings.navigation.logout" : "Abmelden", 172 "settings.navigation.logout" : "Abmelden",
170 "settings.navigation.settings" : "Einstellungen", 173 "settings.navigation.settings" : "Einstellungen",
171 "settings.navigation.yourServices" : "Deine Dienste", 174 "settings.navigation.yourServices" : "Deine Dienste",
175 "settings.navigation.yourWorkspaces": "Deine Workspaces",
172 "settings.recipes.all" : "Alle Dienste", 176 "settings.recipes.all" : "Alle Dienste",
173 "settings.recipes.dev" : "Entwicklung", 177 "settings.recipes.dev" : "Entwicklung",
174 "settings.recipes.headline" : "Verfügbare Dienste", 178 "settings.recipes.headline" : "Verfügbare Dienste",
@@ -227,6 +231,14 @@
227 "settings.services.tooltip.isMuted" : "Alle Töne sind deaktiviert", 231 "settings.services.tooltip.isMuted" : "Alle Töne sind deaktiviert",
228 "settings.services.tooltip.notificationsDisabled" : "Benachrichtigungen deaktiviert", 232 "settings.services.tooltip.notificationsDisabled" : "Benachrichtigungen deaktiviert",
229 "settings.services.updatedInfo" : "Deine Änderungen wurden gespeichert", 233 "settings.services.updatedInfo" : "Deine Änderungen wurden gespeichert",
234 "settings.workspaces.headline": "Deine Workspaces",
235 "settings.workspace.add.form.submitButton": "Workspace erstellen",
236 "settings.workspace.add.form.name": "Name",
237 "settings.workspace.form.yourWorkspaces": "Deine Workspaces",
238 "settings.workspace.form.name": "Name",
239 "settings.workspace.form.buttonDelete": "Workspace löschen",
240 "settings.workspace.form.buttonSave": "Workspace speichern",
241 "settings.workspace.form.servicesInWorkspaceHeadline": "Services in diesem Workspace",
230 "settings.user.form.accountType.company" : "Firma", 242 "settings.user.form.accountType.company" : "Firma",
231 "settings.user.form.accountType.individual" : "Einzelperson", 243 "settings.user.form.accountType.individual" : "Einzelperson",
232 "settings.user.form.accountType.label" : "Konto-Typ", 244 "settings.user.form.accountType.label" : "Konto-Typ",
diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json
index 0641c510c..c8bb03ded 100644
--- a/src/i18n/locales/defaultMessages.json
+++ b/src/i18n/locales/defaultMessages.json
@@ -1299,55 +1299,68 @@
1299 } 1299 }
1300 }, 1300 },
1301 { 1301 {
1302 "defaultMessage": "!!!Account", 1302 "defaultMessage": "!!!Your workspaces",
1303 "end": { 1303 "end": {
1304 "column": 3, 1304 "column": 3,
1305 "line": 20 1305 "line": 20
1306 }, 1306 },
1307 "file": "src/components/settings/navigation/SettingsNavigation.js", 1307 "file": "src/components/settings/navigation/SettingsNavigation.js",
1308 "id": "settings.navigation.yourWorkspaces",
1309 "start": {
1310 "column": 18,
1311 "line": 17
1312 }
1313 },
1314 {
1315 "defaultMessage": "!!!Account",
1316 "end": {
1317 "column": 3,
1318 "line": 24
1319 },
1320 "file": "src/components/settings/navigation/SettingsNavigation.js",
1308 "id": "settings.navigation.account", 1321 "id": "settings.navigation.account",
1309 "start": { 1322 "start": {
1310 "column": 11, 1323 "column": 11,
1311 "line": 17 1324 "line": 21
1312 } 1325 }
1313 }, 1326 },
1314 { 1327 {
1315 "defaultMessage": "!!!Settings", 1328 "defaultMessage": "!!!Settings",
1316 "end": { 1329 "end": {
1317 "column": 3, 1330 "column": 3,
1318 "line": 24 1331 "line": 28
1319 }, 1332 },
1320 "file": "src/components/settings/navigation/SettingsNavigation.js", 1333 "file": "src/components/settings/navigation/SettingsNavigation.js",
1321 "id": "settings.navigation.settings", 1334 "id": "settings.navigation.settings",
1322 "start": { 1335 "start": {
1323 "column": 12, 1336 "column": 12,
1324 "line": 21 1337 "line": 25
1325 } 1338 }
1326 }, 1339 },
1327 { 1340 {
1328 "defaultMessage": "!!!Invite Friends", 1341 "defaultMessage": "!!!Invite Friends",
1329 "end": { 1342 "end": {
1330 "column": 3, 1343 "column": 3,
1331 "line": 28 1344 "line": 32
1332 }, 1345 },
1333 "file": "src/components/settings/navigation/SettingsNavigation.js", 1346 "file": "src/components/settings/navigation/SettingsNavigation.js",
1334 "id": "settings.navigation.inviteFriends", 1347 "id": "settings.navigation.inviteFriends",
1335 "start": { 1348 "start": {
1336 "column": 17, 1349 "column": 17,
1337 "line": 25 1350 "line": 29
1338 } 1351 }
1339 }, 1352 },
1340 { 1353 {
1341 "defaultMessage": "!!!Logout", 1354 "defaultMessage": "!!!Logout",
1342 "end": { 1355 "end": {
1343 "column": 3, 1356 "column": 3,
1344 "line": 32 1357 "line": 36
1345 }, 1358 },
1346 "file": "src/components/settings/navigation/SettingsNavigation.js", 1359 "file": "src/components/settings/navigation/SettingsNavigation.js",
1347 "id": "settings.navigation.logout", 1360 "id": "settings.navigation.logout",
1348 "start": { 1361 "start": {
1349 "column": 10, 1362 "column": 10,
1350 "line": 29 1363 "line": 33
1351 } 1364 }
1352 } 1365 }
1353 ], 1366 ],
@@ -3165,6 +3178,138 @@
3165 { 3178 {
3166 "descriptors": [ 3179 "descriptors": [
3167 { 3180 {
3181 "defaultMessage": "!!!Save workspace",
3182 "end": {
3183 "column": 3,
3184 "line": 14
3185 },
3186 "file": "src/features/workspaces/components/CreateWorkspaceForm.js",
3187 "id": "settings.workspace.add.form.submitButton",
3188 "start": {
3189 "column": 16,
3190 "line": 11
3191 }
3192 },
3193 {
3194 "defaultMessage": "!!!Name",
3195 "end": {
3196 "column": 3,
3197 "line": 18
3198 },
3199 "file": "src/features/workspaces/components/CreateWorkspaceForm.js",
3200 "id": "settings.workspace.add.form.name",
3201 "start": {
3202 "column": 8,
3203 "line": 15
3204 }
3205 }
3206 ],
3207 "path": "src/features/workspaces/components/CreateWorkspaceForm.json"
3208 },
3209 {
3210 "descriptors": [
3211 {
3212 "defaultMessage": "!!!Delete workspace",
3213 "end": {
3214 "column": 3,
3215 "line": 19
3216 },
3217 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
3218 "id": "settings.workspace.form.buttonDelete",
3219 "start": {
3220 "column": 16,
3221 "line": 16
3222 }
3223 },
3224 {
3225 "defaultMessage": "!!!Save workspace",
3226 "end": {
3227 "column": 3,
3228 "line": 23
3229 },
3230 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
3231 "id": "settings.workspace.form.buttonSave",
3232 "start": {
3233 "column": 14,
3234 "line": 20
3235 }
3236 },
3237 {
3238 "defaultMessage": "!!!Name",
3239 "end": {
3240 "column": 3,
3241 "line": 27
3242 },
3243 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
3244 "id": "settings.workspace.form.name",
3245 "start": {
3246 "column": 8,
3247 "line": 24
3248 }
3249 },
3250 {
3251 "defaultMessage": "!!!Your workspaces",
3252 "end": {
3253 "column": 3,
3254 "line": 31
3255 },
3256 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
3257 "id": "settings.workspace.form.yourWorkspaces",
3258 "start": {
3259 "column": 18,
3260 "line": 28
3261 }
3262 },
3263 {
3264 "defaultMessage": "!!!Services in this Workspace",
3265 "end": {
3266 "column": 3,
3267 "line": 35
3268 },
3269 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
3270 "id": "settings.workspace.form.servicesInWorkspaceHeadline",
3271 "start": {
3272 "column": 31,
3273 "line": 32
3274 }
3275 }
3276 ],
3277 "path": "src/features/workspaces/components/EditWorkspaceForm.json"
3278 },
3279 {
3280 "descriptors": [
3281 {
3282 "defaultMessage": "!!!Your workspaces",
3283 "end": {
3284 "column": 3,
3285 "line": 15
3286 },
3287 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
3288 "id": "settings.workspaces.headline",
3289 "start": {
3290 "column": 12,
3291 "line": 12
3292 }
3293 },
3294 {
3295 "defaultMessage": "!!!You haven't added any workspaces yet.",
3296 "end": {
3297 "column": 3,
3298 "line": 19
3299 },
3300 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
3301 "id": "settings.workspaces.noWorkspacesAdded",
3302 "start": {
3303 "column": 19,
3304 "line": 16
3305 }
3306 }
3307 ],
3308 "path": "src/features/workspaces/components/WorkspacesDashboard.json"
3309 },
3310 {
3311 "descriptors": [
3312 {
3168 "defaultMessage": "!!!Field is required", 3313 "defaultMessage": "!!!Field is required",
3169 "end": { 3314 "end": {
3170 "column": 3, 3315 "column": 3,
@@ -3321,611 +3466,650 @@
3321 "defaultMessage": "!!!Edit", 3466 "defaultMessage": "!!!Edit",
3322 "end": { 3467 "end": {
3323 "column": 3, 3468 "column": 3,
3324 "line": 13 3469 "line": 15
3325 }, 3470 },
3326 "file": "src/lib/Menu.js", 3471 "file": "src/lib/Menu.js",
3327 "id": "menu.edit", 3472 "id": "menu.edit",
3328 "start": { 3473 "start": {
3329 "column": 8, 3474 "column": 8,
3330 "line": 10 3475 "line": 12
3331 } 3476 }
3332 }, 3477 },
3333 { 3478 {
3334 "defaultMessage": "!!!Undo", 3479 "defaultMessage": "!!!Undo",
3335 "end": { 3480 "end": {
3336 "column": 3, 3481 "column": 3,
3337 "line": 17 3482 "line": 19
3338 }, 3483 },
3339 "file": "src/lib/Menu.js", 3484 "file": "src/lib/Menu.js",
3340 "id": "menu.edit.undo", 3485 "id": "menu.edit.undo",
3341 "start": { 3486 "start": {
3342 "column": 8, 3487 "column": 8,
3343 "line": 14 3488 "line": 16
3344 } 3489 }
3345 }, 3490 },
3346 { 3491 {
3347 "defaultMessage": "!!!Redo", 3492 "defaultMessage": "!!!Redo",
3348 "end": { 3493 "end": {
3349 "column": 3, 3494 "column": 3,
3350 "line": 21 3495 "line": 23
3351 }, 3496 },
3352 "file": "src/lib/Menu.js", 3497 "file": "src/lib/Menu.js",
3353 "id": "menu.edit.redo", 3498 "id": "menu.edit.redo",
3354 "start": { 3499 "start": {
3355 "column": 8, 3500 "column": 8,
3356 "line": 18 3501 "line": 20
3357 } 3502 }
3358 }, 3503 },
3359 { 3504 {
3360 "defaultMessage": "!!!Cut", 3505 "defaultMessage": "!!!Cut",
3361 "end": { 3506 "end": {
3362 "column": 3, 3507 "column": 3,
3363 "line": 25 3508 "line": 27
3364 }, 3509 },
3365 "file": "src/lib/Menu.js", 3510 "file": "src/lib/Menu.js",
3366 "id": "menu.edit.cut", 3511 "id": "menu.edit.cut",
3367 "start": { 3512 "start": {
3368 "column": 7, 3513 "column": 7,
3369 "line": 22 3514 "line": 24
3370 } 3515 }
3371 }, 3516 },
3372 { 3517 {
3373 "defaultMessage": "!!!Copy", 3518 "defaultMessage": "!!!Copy",
3374 "end": { 3519 "end": {
3375 "column": 3, 3520 "column": 3,
3376 "line": 29 3521 "line": 31
3377 }, 3522 },
3378 "file": "src/lib/Menu.js", 3523 "file": "src/lib/Menu.js",
3379 "id": "menu.edit.copy", 3524 "id": "menu.edit.copy",
3380 "start": { 3525 "start": {
3381 "column": 8, 3526 "column": 8,
3382 "line": 26 3527 "line": 28
3383 } 3528 }
3384 }, 3529 },
3385 { 3530 {
3386 "defaultMessage": "!!!Paste", 3531 "defaultMessage": "!!!Paste",
3387 "end": { 3532 "end": {
3388 "column": 3, 3533 "column": 3,
3389 "line": 33 3534 "line": 35
3390 }, 3535 },
3391 "file": "src/lib/Menu.js", 3536 "file": "src/lib/Menu.js",
3392 "id": "menu.edit.paste", 3537 "id": "menu.edit.paste",
3393 "start": { 3538 "start": {
3394 "column": 9, 3539 "column": 9,
3395 "line": 30 3540 "line": 32
3396 } 3541 }
3397 }, 3542 },
3398 { 3543 {
3399 "defaultMessage": "!!!Paste And Match Style", 3544 "defaultMessage": "!!!Paste And Match Style",
3400 "end": { 3545 "end": {
3401 "column": 3, 3546 "column": 3,
3402 "line": 37 3547 "line": 39
3403 }, 3548 },
3404 "file": "src/lib/Menu.js", 3549 "file": "src/lib/Menu.js",
3405 "id": "menu.edit.pasteAndMatchStyle", 3550 "id": "menu.edit.pasteAndMatchStyle",
3406 "start": { 3551 "start": {
3407 "column": 22, 3552 "column": 22,
3408 "line": 34 3553 "line": 36
3409 } 3554 }
3410 }, 3555 },
3411 { 3556 {
3412 "defaultMessage": "!!!Delete", 3557 "defaultMessage": "!!!Delete",
3413 "end": { 3558 "end": {
3414 "column": 3, 3559 "column": 3,
3415 "line": 41 3560 "line": 43
3416 }, 3561 },
3417 "file": "src/lib/Menu.js", 3562 "file": "src/lib/Menu.js",
3418 "id": "menu.edit.delete", 3563 "id": "menu.edit.delete",
3419 "start": { 3564 "start": {
3420 "column": 10, 3565 "column": 10,
3421 "line": 38 3566 "line": 40
3422 } 3567 }
3423 }, 3568 },
3424 { 3569 {
3425 "defaultMessage": "!!!Select All", 3570 "defaultMessage": "!!!Select All",
3426 "end": { 3571 "end": {
3427 "column": 3, 3572 "column": 3,
3428 "line": 45 3573 "line": 47
3429 }, 3574 },
3430 "file": "src/lib/Menu.js", 3575 "file": "src/lib/Menu.js",
3431 "id": "menu.edit.selectAll", 3576 "id": "menu.edit.selectAll",
3432 "start": { 3577 "start": {
3433 "column": 13, 3578 "column": 13,
3434 "line": 42 3579 "line": 44
3435 } 3580 }
3436 }, 3581 },
3437 { 3582 {
3438 "defaultMessage": "!!!Speech", 3583 "defaultMessage": "!!!Speech",
3439 "end": { 3584 "end": {
3440 "column": 3, 3585 "column": 3,
3441 "line": 49 3586 "line": 51
3442 }, 3587 },
3443 "file": "src/lib/Menu.js", 3588 "file": "src/lib/Menu.js",
3444 "id": "menu.edit.speech", 3589 "id": "menu.edit.speech",
3445 "start": { 3590 "start": {
3446 "column": 10, 3591 "column": 10,
3447 "line": 46 3592 "line": 48
3448 } 3593 }
3449 }, 3594 },
3450 { 3595 {
3451 "defaultMessage": "!!!Start Speaking", 3596 "defaultMessage": "!!!Start Speaking",
3452 "end": { 3597 "end": {
3453 "column": 3, 3598 "column": 3,
3454 "line": 53 3599 "line": 55
3455 }, 3600 },
3456 "file": "src/lib/Menu.js", 3601 "file": "src/lib/Menu.js",
3457 "id": "menu.edit.startSpeaking", 3602 "id": "menu.edit.startSpeaking",
3458 "start": { 3603 "start": {
3459 "column": 17, 3604 "column": 17,
3460 "line": 50 3605 "line": 52
3461 } 3606 }
3462 }, 3607 },
3463 { 3608 {
3464 "defaultMessage": "!!!Stop Speaking", 3609 "defaultMessage": "!!!Stop Speaking",
3465 "end": { 3610 "end": {
3466 "column": 3, 3611 "column": 3,
3467 "line": 57 3612 "line": 59
3468 }, 3613 },
3469 "file": "src/lib/Menu.js", 3614 "file": "src/lib/Menu.js",
3470 "id": "menu.edit.stopSpeaking", 3615 "id": "menu.edit.stopSpeaking",
3471 "start": { 3616 "start": {
3472 "column": 16, 3617 "column": 16,
3473 "line": 54 3618 "line": 56
3474 } 3619 }
3475 }, 3620 },
3476 { 3621 {
3477 "defaultMessage": "!!!Start Dictation", 3622 "defaultMessage": "!!!Start Dictation",
3478 "end": { 3623 "end": {
3479 "column": 3, 3624 "column": 3,
3480 "line": 61 3625 "line": 63
3481 }, 3626 },
3482 "file": "src/lib/Menu.js", 3627 "file": "src/lib/Menu.js",
3483 "id": "menu.edit.startDictation", 3628 "id": "menu.edit.startDictation",
3484 "start": { 3629 "start": {
3485 "column": 18, 3630 "column": 18,
3486 "line": 58 3631 "line": 60
3487 } 3632 }
3488 }, 3633 },
3489 { 3634 {
3490 "defaultMessage": "!!!Emoji & Symbols", 3635 "defaultMessage": "!!!Emoji & Symbols",
3491 "end": { 3636 "end": {
3492 "column": 3, 3637 "column": 3,
3493 "line": 65 3638 "line": 67
3494 }, 3639 },
3495 "file": "src/lib/Menu.js", 3640 "file": "src/lib/Menu.js",
3496 "id": "menu.edit.emojiSymbols", 3641 "id": "menu.edit.emojiSymbols",
3497 "start": { 3642 "start": {
3498 "column": 16, 3643 "column": 16,
3499 "line": 62 3644 "line": 64
3500 } 3645 }
3501 }, 3646 },
3502 { 3647 {
3503 "defaultMessage": "!!!Actual Size", 3648 "defaultMessage": "!!!Actual Size",
3504 "end": { 3649 "end": {
3505 "column": 3, 3650 "column": 3,
3506 "line": 69 3651 "line": 71
3507 }, 3652 },
3508 "file": "src/lib/Menu.js", 3653 "file": "src/lib/Menu.js",
3509 "id": "menu.view.resetZoom", 3654 "id": "menu.view.resetZoom",
3510 "start": { 3655 "start": {
3511 "column": 13, 3656 "column": 13,
3512 "line": 66 3657 "line": 68
3513 } 3658 }
3514 }, 3659 },
3515 { 3660 {
3516 "defaultMessage": "!!!Zoom In", 3661 "defaultMessage": "!!!Zoom In",
3517 "end": { 3662 "end": {
3518 "column": 3, 3663 "column": 3,
3519 "line": 73 3664 "line": 75
3520 }, 3665 },
3521 "file": "src/lib/Menu.js", 3666 "file": "src/lib/Menu.js",
3522 "id": "menu.view.zoomIn", 3667 "id": "menu.view.zoomIn",
3523 "start": { 3668 "start": {
3524 "column": 10, 3669 "column": 10,
3525 "line": 70 3670 "line": 72
3526 } 3671 }
3527 }, 3672 },
3528 { 3673 {
3529 "defaultMessage": "!!!Zoom Out", 3674 "defaultMessage": "!!!Zoom Out",
3530 "end": { 3675 "end": {
3531 "column": 3, 3676 "column": 3,
3532 "line": 77 3677 "line": 79
3533 }, 3678 },
3534 "file": "src/lib/Menu.js", 3679 "file": "src/lib/Menu.js",
3535 "id": "menu.view.zoomOut", 3680 "id": "menu.view.zoomOut",
3536 "start": { 3681 "start": {
3537 "column": 11, 3682 "column": 11,
3538 "line": 74 3683 "line": 76
3539 } 3684 }
3540 }, 3685 },
3541 { 3686 {
3542 "defaultMessage": "!!!Enter Full Screen", 3687 "defaultMessage": "!!!Enter Full Screen",
3543 "end": { 3688 "end": {
3544 "column": 3, 3689 "column": 3,
3545 "line": 81 3690 "line": 83
3546 }, 3691 },
3547 "file": "src/lib/Menu.js", 3692 "file": "src/lib/Menu.js",
3548 "id": "menu.view.enterFullScreen", 3693 "id": "menu.view.enterFullScreen",
3549 "start": { 3694 "start": {
3550 "column": 19, 3695 "column": 19,
3551 "line": 78 3696 "line": 80
3552 } 3697 }
3553 }, 3698 },
3554 { 3699 {
3555 "defaultMessage": "!!!Exit Full Screen", 3700 "defaultMessage": "!!!Exit Full Screen",
3556 "end": { 3701 "end": {
3557 "column": 3, 3702 "column": 3,
3558 "line": 85 3703 "line": 87
3559 }, 3704 },
3560 "file": "src/lib/Menu.js", 3705 "file": "src/lib/Menu.js",
3561 "id": "menu.view.exitFullScreen", 3706 "id": "menu.view.exitFullScreen",
3562 "start": { 3707 "start": {
3563 "column": 18, 3708 "column": 18,
3564 "line": 82 3709 "line": 84
3565 } 3710 }
3566 }, 3711 },
3567 { 3712 {
3568 "defaultMessage": "!!!Toggle Full Screen", 3713 "defaultMessage": "!!!Toggle Full Screen",
3569 "end": { 3714 "end": {
3570 "column": 3, 3715 "column": 3,
3571 "line": 89 3716 "line": 91
3572 }, 3717 },
3573 "file": "src/lib/Menu.js", 3718 "file": "src/lib/Menu.js",
3574 "id": "menu.view.toggleFullScreen", 3719 "id": "menu.view.toggleFullScreen",
3575 "start": { 3720 "start": {
3576 "column": 20, 3721 "column": 20,
3577 "line": 86 3722 "line": 88
3578 } 3723 }
3579 }, 3724 },
3580 { 3725 {
3581 "defaultMessage": "!!!Toggle Developer Tools", 3726 "defaultMessage": "!!!Toggle Developer Tools",
3582 "end": { 3727 "end": {
3583 "column": 3, 3728 "column": 3,
3584 "line": 93 3729 "line": 95
3585 }, 3730 },
3586 "file": "src/lib/Menu.js", 3731 "file": "src/lib/Menu.js",
3587 "id": "menu.view.toggleDevTools", 3732 "id": "menu.view.toggleDevTools",
3588 "start": { 3733 "start": {
3589 "column": 18, 3734 "column": 18,
3590 "line": 90 3735 "line": 92
3591 } 3736 }
3592 }, 3737 },
3593 { 3738 {
3594 "defaultMessage": "!!!Toggle Service Developer Tools", 3739 "defaultMessage": "!!!Toggle Service Developer Tools",
3595 "end": { 3740 "end": {
3596 "column": 3, 3741 "column": 3,
3597 "line": 97 3742 "line": 99
3598 }, 3743 },
3599 "file": "src/lib/Menu.js", 3744 "file": "src/lib/Menu.js",
3600 "id": "menu.view.toggleServiceDevTools", 3745 "id": "menu.view.toggleServiceDevTools",
3601 "start": { 3746 "start": {
3602 "column": 25, 3747 "column": 25,
3603 "line": 94 3748 "line": 96
3604 } 3749 }
3605 }, 3750 },
3606 { 3751 {
3607 "defaultMessage": "!!!Reload Service", 3752 "defaultMessage": "!!!Reload Service",
3608 "end": { 3753 "end": {
3609 "column": 3, 3754 "column": 3,
3610 "line": 101 3755 "line": 103
3611 }, 3756 },
3612 "file": "src/lib/Menu.js", 3757 "file": "src/lib/Menu.js",
3613 "id": "menu.view.reloadService", 3758 "id": "menu.view.reloadService",
3614 "start": { 3759 "start": {
3615 "column": 17, 3760 "column": 17,
3616 "line": 98 3761 "line": 100
3617 } 3762 }
3618 }, 3763 },
3619 { 3764 {
3620 "defaultMessage": "!!!Reload Franz", 3765 "defaultMessage": "!!!Reload Franz",
3621 "end": { 3766 "end": {
3622 "column": 3, 3767 "column": 3,
3623 "line": 105 3768 "line": 107
3624 }, 3769 },
3625 "file": "src/lib/Menu.js", 3770 "file": "src/lib/Menu.js",
3626 "id": "menu.view.reloadFranz", 3771 "id": "menu.view.reloadFranz",
3627 "start": { 3772 "start": {
3628 "column": 15, 3773 "column": 15,
3629 "line": 102 3774 "line": 104
3630 } 3775 }
3631 }, 3776 },
3632 { 3777 {
3633 "defaultMessage": "!!!Minimize", 3778 "defaultMessage": "!!!Minimize",
3634 "end": { 3779 "end": {
3635 "column": 3, 3780 "column": 3,
3636 "line": 109 3781 "line": 111
3637 }, 3782 },
3638 "file": "src/lib/Menu.js", 3783 "file": "src/lib/Menu.js",
3639 "id": "menu.window.minimize", 3784 "id": "menu.window.minimize",
3640 "start": { 3785 "start": {
3641 "column": 12, 3786 "column": 12,
3642 "line": 106 3787 "line": 108
3643 } 3788 }
3644 }, 3789 },
3645 { 3790 {
3646 "defaultMessage": "!!!Close", 3791 "defaultMessage": "!!!Close",
3647 "end": { 3792 "end": {
3648 "column": 3, 3793 "column": 3,
3649 "line": 113 3794 "line": 115
3650 }, 3795 },
3651 "file": "src/lib/Menu.js", 3796 "file": "src/lib/Menu.js",
3652 "id": "menu.window.close", 3797 "id": "menu.window.close",
3653 "start": { 3798 "start": {
3654 "column": 9, 3799 "column": 9,
3655 "line": 110 3800 "line": 112
3656 } 3801 }
3657 }, 3802 },
3658 { 3803 {
3659 "defaultMessage": "!!!Learn More", 3804 "defaultMessage": "!!!Learn More",
3660 "end": { 3805 "end": {
3661 "column": 3, 3806 "column": 3,
3662 "line": 117 3807 "line": 119
3663 }, 3808 },
3664 "file": "src/lib/Menu.js", 3809 "file": "src/lib/Menu.js",
3665 "id": "menu.help.learnMore", 3810 "id": "menu.help.learnMore",
3666 "start": { 3811 "start": {
3667 "column": 13, 3812 "column": 13,
3668 "line": 114 3813 "line": 116
3669 } 3814 }
3670 }, 3815 },
3671 { 3816 {
3672 "defaultMessage": "!!!Changelog", 3817 "defaultMessage": "!!!Changelog",
3673 "end": { 3818 "end": {
3674 "column": 3, 3819 "column": 3,
3675 "line": 121 3820 "line": 123
3676 }, 3821 },
3677 "file": "src/lib/Menu.js", 3822 "file": "src/lib/Menu.js",
3678 "id": "menu.help.changelog", 3823 "id": "menu.help.changelog",
3679 "start": { 3824 "start": {
3680 "column": 13, 3825 "column": 13,
3681 "line": 118 3826 "line": 120
3682 } 3827 }
3683 }, 3828 },
3684 { 3829 {
3685 "defaultMessage": "!!!Support", 3830 "defaultMessage": "!!!Support",
3686 "end": { 3831 "end": {
3687 "column": 3, 3832 "column": 3,
3688 "line": 125 3833 "line": 127
3689 }, 3834 },
3690 "file": "src/lib/Menu.js", 3835 "file": "src/lib/Menu.js",
3691 "id": "menu.help.support", 3836 "id": "menu.help.support",
3692 "start": { 3837 "start": {
3693 "column": 11, 3838 "column": 11,
3694 "line": 122 3839 "line": 124
3695 } 3840 }
3696 }, 3841 },
3697 { 3842 {
3698 "defaultMessage": "!!!Terms of Service", 3843 "defaultMessage": "!!!Terms of Service",
3699 "end": { 3844 "end": {
3700 "column": 3, 3845 "column": 3,
3701 "line": 129 3846 "line": 131
3702 }, 3847 },
3703 "file": "src/lib/Menu.js", 3848 "file": "src/lib/Menu.js",
3704 "id": "menu.help.tos", 3849 "id": "menu.help.tos",
3705 "start": { 3850 "start": {
3706 "column": 7, 3851 "column": 7,
3707 "line": 126 3852 "line": 128
3708 } 3853 }
3709 }, 3854 },
3710 { 3855 {
3711 "defaultMessage": "!!!Privacy Statement", 3856 "defaultMessage": "!!!Privacy Statement",
3712 "end": { 3857 "end": {
3713 "column": 3, 3858 "column": 3,
3714 "line": 133 3859 "line": 135
3715 }, 3860 },
3716 "file": "src/lib/Menu.js", 3861 "file": "src/lib/Menu.js",
3717 "id": "menu.help.privacy", 3862 "id": "menu.help.privacy",
3718 "start": { 3863 "start": {
3719 "column": 11, 3864 "column": 11,
3720 "line": 130 3865 "line": 132
3721 } 3866 }
3722 }, 3867 },
3723 { 3868 {
3724 "defaultMessage": "!!!File", 3869 "defaultMessage": "!!!File",
3725 "end": { 3870 "end": {
3726 "column": 3, 3871 "column": 3,
3727 "line": 137 3872 "line": 139
3728 }, 3873 },
3729 "file": "src/lib/Menu.js", 3874 "file": "src/lib/Menu.js",
3730 "id": "menu.file", 3875 "id": "menu.file",
3731 "start": { 3876 "start": {
3732 "column": 8, 3877 "column": 8,
3733 "line": 134 3878 "line": 136
3734 } 3879 }
3735 }, 3880 },
3736 { 3881 {
3737 "defaultMessage": "!!!View", 3882 "defaultMessage": "!!!View",
3738 "end": { 3883 "end": {
3739 "column": 3, 3884 "column": 3,
3740 "line": 141 3885 "line": 143
3741 }, 3886 },
3742 "file": "src/lib/Menu.js", 3887 "file": "src/lib/Menu.js",
3743 "id": "menu.view", 3888 "id": "menu.view",
3744 "start": { 3889 "start": {
3745 "column": 8, 3890 "column": 8,
3746 "line": 138 3891 "line": 140
3747 } 3892 }
3748 }, 3893 },
3749 { 3894 {
3750 "defaultMessage": "!!!Services", 3895 "defaultMessage": "!!!Services",
3751 "end": { 3896 "end": {
3752 "column": 3, 3897 "column": 3,
3753 "line": 145 3898 "line": 147
3754 }, 3899 },
3755 "file": "src/lib/Menu.js", 3900 "file": "src/lib/Menu.js",
3756 "id": "menu.services", 3901 "id": "menu.services",
3757 "start": { 3902 "start": {
3758 "column": 12, 3903 "column": 12,
3759 "line": 142 3904 "line": 144
3760 } 3905 }
3761 }, 3906 },
3762 { 3907 {
3763 "defaultMessage": "!!!Window", 3908 "defaultMessage": "!!!Window",
3764 "end": { 3909 "end": {
3765 "column": 3, 3910 "column": 3,
3766 "line": 149 3911 "line": 151
3767 }, 3912 },
3768 "file": "src/lib/Menu.js", 3913 "file": "src/lib/Menu.js",
3769 "id": "menu.window", 3914 "id": "menu.window",
3770 "start": { 3915 "start": {
3771 "column": 10, 3916 "column": 10,
3772 "line": 146 3917 "line": 148
3773 } 3918 }
3774 }, 3919 },
3775 { 3920 {
3776 "defaultMessage": "!!!Help", 3921 "defaultMessage": "!!!Help",
3777 "end": { 3922 "end": {
3778 "column": 3, 3923 "column": 3,
3779 "line": 153 3924 "line": 155
3780 }, 3925 },
3781 "file": "src/lib/Menu.js", 3926 "file": "src/lib/Menu.js",
3782 "id": "menu.help", 3927 "id": "menu.help",
3783 "start": { 3928 "start": {
3784 "column": 8, 3929 "column": 8,
3785 "line": 150 3930 "line": 152
3786 } 3931 }
3787 }, 3932 },
3788 { 3933 {
3789 "defaultMessage": "!!!About Franz", 3934 "defaultMessage": "!!!About Franz",
3790 "end": { 3935 "end": {
3791 "column": 3, 3936 "column": 3,
3792 "line": 157 3937 "line": 159
3793 }, 3938 },
3794 "file": "src/lib/Menu.js", 3939 "file": "src/lib/Menu.js",
3795 "id": "menu.app.about", 3940 "id": "menu.app.about",
3796 "start": { 3941 "start": {
3797 "column": 9, 3942 "column": 9,
3798 "line": 154 3943 "line": 156
3799 } 3944 }
3800 }, 3945 },
3801 { 3946 {
3802 "defaultMessage": "!!!Settings", 3947 "defaultMessage": "!!!Settings",
3803 "end": { 3948 "end": {
3804 "column": 3, 3949 "column": 3,
3805 "line": 161 3950 "line": 163
3806 }, 3951 },
3807 "file": "src/lib/Menu.js", 3952 "file": "src/lib/Menu.js",
3808 "id": "menu.app.settings", 3953 "id": "menu.app.settings",
3809 "start": { 3954 "start": {
3810 "column": 12, 3955 "column": 12,
3811 "line": 158 3956 "line": 160
3812 } 3957 }
3813 }, 3958 },
3814 { 3959 {
3815 "defaultMessage": "!!!Hide", 3960 "defaultMessage": "!!!Hide",
3816 "end": { 3961 "end": {
3817 "column": 3, 3962 "column": 3,
3818 "line": 165 3963 "line": 167
3819 }, 3964 },
3820 "file": "src/lib/Menu.js", 3965 "file": "src/lib/Menu.js",
3821 "id": "menu.app.hide", 3966 "id": "menu.app.hide",
3822 "start": { 3967 "start": {
3823 "column": 8, 3968 "column": 8,
3824 "line": 162 3969 "line": 164
3825 } 3970 }
3826 }, 3971 },
3827 { 3972 {
3828 "defaultMessage": "!!!Hide Others", 3973 "defaultMessage": "!!!Hide Others",
3829 "end": { 3974 "end": {
3830 "column": 3, 3975 "column": 3,
3831 "line": 169 3976 "line": 171
3832 }, 3977 },
3833 "file": "src/lib/Menu.js", 3978 "file": "src/lib/Menu.js",
3834 "id": "menu.app.hideOthers", 3979 "id": "menu.app.hideOthers",
3835 "start": { 3980 "start": {
3836 "column": 14, 3981 "column": 14,
3837 "line": 166 3982 "line": 168
3838 } 3983 }
3839 }, 3984 },
3840 { 3985 {
3841 "defaultMessage": "!!!Unhide", 3986 "defaultMessage": "!!!Unhide",
3842 "end": { 3987 "end": {
3843 "column": 3, 3988 "column": 3,
3844 "line": 173 3989 "line": 175
3845 }, 3990 },
3846 "file": "src/lib/Menu.js", 3991 "file": "src/lib/Menu.js",
3847 "id": "menu.app.unhide", 3992 "id": "menu.app.unhide",
3848 "start": { 3993 "start": {
3849 "column": 10, 3994 "column": 10,
3850 "line": 170 3995 "line": 172
3851 } 3996 }
3852 }, 3997 },
3853 { 3998 {
3854 "defaultMessage": "!!!Quit", 3999 "defaultMessage": "!!!Quit",
3855 "end": { 4000 "end": {
3856 "column": 3, 4001 "column": 3,
3857 "line": 177 4002 "line": 179
3858 }, 4003 },
3859 "file": "src/lib/Menu.js", 4004 "file": "src/lib/Menu.js",
3860 "id": "menu.app.quit", 4005 "id": "menu.app.quit",
3861 "start": { 4006 "start": {
3862 "column": 8, 4007 "column": 8,
3863 "line": 174 4008 "line": 176
3864 } 4009 }
3865 }, 4010 },
3866 { 4011 {
3867 "defaultMessage": "!!!Add New Service...", 4012 "defaultMessage": "!!!Add New Service...",
3868 "end": { 4013 "end": {
3869 "column": 3, 4014 "column": 3,
3870 "line": 181 4015 "line": 183
3871 }, 4016 },
3872 "file": "src/lib/Menu.js", 4017 "file": "src/lib/Menu.js",
3873 "id": "menu.services.addNewService", 4018 "id": "menu.services.addNewService",
3874 "start": { 4019 "start": {
3875 "column": 17, 4020 "column": 17,
3876 "line": 178 4021 "line": 180
4022 }
4023 },
4024 {
4025 "defaultMessage": "!!!Add New Workspace...",
4026 "end": {
4027 "column": 3,
4028 "line": 187
4029 },
4030 "file": "src/lib/Menu.js",
4031 "id": "menu.workspaces.addNewWorkspace",
4032 "start": {
4033 "column": 19,
4034 "line": 184
3877 } 4035 }
3878 }, 4036 },
3879 { 4037 {
3880 "defaultMessage": "!!!Activate next service...", 4038 "defaultMessage": "!!!Activate next service...",
3881 "end": { 4039 "end": {
3882 "column": 3, 4040 "column": 3,
3883 "line": 185 4041 "line": 191
3884 }, 4042 },
3885 "file": "src/lib/Menu.js", 4043 "file": "src/lib/Menu.js",
3886 "id": "menu.services.setNextServiceActive", 4044 "id": "menu.services.setNextServiceActive",
3887 "start": { 4045 "start": {
3888 "column": 23, 4046 "column": 23,
3889 "line": 182 4047 "line": 188
3890 } 4048 }
3891 }, 4049 },
3892 { 4050 {
3893 "defaultMessage": "!!!Activate previous service...", 4051 "defaultMessage": "!!!Activate previous service...",
3894 "end": { 4052 "end": {
3895 "column": 3, 4053 "column": 3,
3896 "line": 189 4054 "line": 195
3897 }, 4055 },
3898 "file": "src/lib/Menu.js", 4056 "file": "src/lib/Menu.js",
3899 "id": "menu.services.activatePreviousService", 4057 "id": "menu.services.activatePreviousService",
3900 "start": { 4058 "start": {
3901 "column": 27, 4059 "column": 27,
3902 "line": 186 4060 "line": 192
3903 } 4061 }
3904 }, 4062 },
3905 { 4063 {
3906 "defaultMessage": "!!!Disable notifications & audio", 4064 "defaultMessage": "!!!Disable notifications & audio",
3907 "end": { 4065 "end": {
3908 "column": 3, 4066 "column": 3,
3909 "line": 193 4067 "line": 199
3910 }, 4068 },
3911 "file": "src/lib/Menu.js", 4069 "file": "src/lib/Menu.js",
3912 "id": "sidebar.muteApp", 4070 "id": "sidebar.muteApp",
3913 "start": { 4071 "start": {
3914 "column": 11, 4072 "column": 11,
3915 "line": 190 4073 "line": 196
3916 } 4074 }
3917 }, 4075 },
3918 { 4076 {
3919 "defaultMessage": "!!!Enable notifications & audio", 4077 "defaultMessage": "!!!Enable notifications & audio",
3920 "end": { 4078 "end": {
3921 "column": 3, 4079 "column": 3,
3922 "line": 197 4080 "line": 203
3923 }, 4081 },
3924 "file": "src/lib/Menu.js", 4082 "file": "src/lib/Menu.js",
3925 "id": "sidebar.unmuteApp", 4083 "id": "sidebar.unmuteApp",
3926 "start": { 4084 "start": {
3927 "column": 13, 4085 "column": 13,
3928 "line": 194 4086 "line": 200
4087 }
4088 },
4089 {
4090 "defaultMessage": "!!!Workspaces",
4091 "end": {
4092 "column": 3,
4093 "line": 207
4094 },
4095 "file": "src/lib/Menu.js",
4096 "id": "menu.workspaces",
4097 "start": {
4098 "column": 14,
4099 "line": 204
4100 }
4101 },
4102 {
4103 "defaultMessage": "!!!Default",
4104 "end": {
4105 "column": 3,
4106 "line": 211
4107 },
4108 "file": "src/lib/Menu.js",
4109 "id": "menu.workspaces.defaultWorkspace",
4110 "start": {
4111 "column": 20,
4112 "line": 208
3929 } 4113 }
3930 } 4114 }
3931 ], 4115 ],
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index 7543d38bd..1041a8b5f 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -87,6 +87,9 @@
87 "menu.window": "Window", 87 "menu.window": "Window",
88 "menu.window.close": "Close", 88 "menu.window.close": "Close",
89 "menu.window.minimize": "Minimize", 89 "menu.window.minimize": "Minimize",
90 "menu.workspaces": "Workspaces",
91 "menu.workspaces.addNewWorkspace": "Add New Workspace...",
92 "menu.workspaces.defaultWorkspace": "All services",
90 "password.email.label": "Email address", 93 "password.email.label": "Email address",
91 "password.headline": "Reset password", 94 "password.headline": "Reset password",
92 "password.link.login": "Sign in to your account", 95 "password.link.login": "Sign in to your account",
@@ -169,6 +172,7 @@
169 "settings.navigation.logout": "Logout", 172 "settings.navigation.logout": "Logout",
170 "settings.navigation.settings": "Settings", 173 "settings.navigation.settings": "Settings",
171 "settings.navigation.yourServices": "Your services", 174 "settings.navigation.yourServices": "Your services",
175 "settings.navigation.yourWorkspaces": "Your workspaces",
172 "settings.recipes.all": "All services", 176 "settings.recipes.all": "All services",
173 "settings.recipes.dev": "Development", 177 "settings.recipes.dev": "Development",
174 "settings.recipes.headline": "Available services", 178 "settings.recipes.headline": "Available services",
@@ -235,6 +239,15 @@
235 "settings.user.form.firstname": "First Name", 239 "settings.user.form.firstname": "First Name",
236 "settings.user.form.lastname": "Last Name", 240 "settings.user.form.lastname": "Last Name",
237 "settings.user.form.newPassword": "New password", 241 "settings.user.form.newPassword": "New password",
242 "settings.workspace.add.form.name": "Name",
243 "settings.workspace.add.form.submitButton": "Save workspace",
244 "settings.workspace.form.buttonDelete": "Delete workspace",
245 "settings.workspace.form.buttonSave": "Save workspace",
246 "settings.workspace.form.name": "Name",
247 "settings.workspace.form.servicesInWorkspaceHeadline": "Services in this Workspace",
248 "settings.workspace.form.yourWorkspaces": "Your workspaces",
249 "settings.workspaces.headline": "Your workspaces",
250 "settings.workspaces.noWorkspacesAdded": "You haven't added any workspaces yet.",
238 "sidebar.addNewService": "Add new service", 251 "sidebar.addNewService": "Add new service",
239 "sidebar.muteApp": "Disable notifications & audio", 252 "sidebar.muteApp": "Disable notifications & audio",
240 "sidebar.settings": "Settings", 253 "sidebar.settings": "Settings",
diff --git a/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json
index 785ce9f29..4d8443b02 100644
--- a/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json
+++ b/src/i18n/messages/src/components/settings/navigation/SettingsNavigation.json
@@ -26,15 +26,28 @@
26 } 26 }
27 }, 27 },
28 { 28 {
29 "id": "settings.navigation.yourWorkspaces",
30 "defaultMessage": "!!!Your workspaces",
31 "file": "src/components/settings/navigation/SettingsNavigation.js",
32 "start": {
33 "line": 17,
34 "column": 18
35 },
36 "end": {
37 "line": 20,
38 "column": 3
39 }
40 },
41 {
29 "id": "settings.navigation.account", 42 "id": "settings.navigation.account",
30 "defaultMessage": "!!!Account", 43 "defaultMessage": "!!!Account",
31 "file": "src/components/settings/navigation/SettingsNavigation.js", 44 "file": "src/components/settings/navigation/SettingsNavigation.js",
32 "start": { 45 "start": {
33 "line": 17, 46 "line": 21,
34 "column": 11 47 "column": 11
35 }, 48 },
36 "end": { 49 "end": {
37 "line": 20, 50 "line": 24,
38 "column": 3 51 "column": 3
39 } 52 }
40 }, 53 },
@@ -43,11 +56,11 @@
43 "defaultMessage": "!!!Settings", 56 "defaultMessage": "!!!Settings",
44 "file": "src/components/settings/navigation/SettingsNavigation.js", 57 "file": "src/components/settings/navigation/SettingsNavigation.js",
45 "start": { 58 "start": {
46 "line": 21, 59 "line": 25,
47 "column": 12 60 "column": 12
48 }, 61 },
49 "end": { 62 "end": {
50 "line": 24, 63 "line": 28,
51 "column": 3 64 "column": 3
52 } 65 }
53 }, 66 },
@@ -56,11 +69,11 @@
56 "defaultMessage": "!!!Invite Friends", 69 "defaultMessage": "!!!Invite Friends",
57 "file": "src/components/settings/navigation/SettingsNavigation.js", 70 "file": "src/components/settings/navigation/SettingsNavigation.js",
58 "start": { 71 "start": {
59 "line": 25, 72 "line": 29,
60 "column": 17 73 "column": 17
61 }, 74 },
62 "end": { 75 "end": {
63 "line": 28, 76 "line": 32,
64 "column": 3 77 "column": 3
65 } 78 }
66 }, 79 },
@@ -69,11 +82,11 @@
69 "defaultMessage": "!!!Logout", 82 "defaultMessage": "!!!Logout",
70 "file": "src/components/settings/navigation/SettingsNavigation.js", 83 "file": "src/components/settings/navigation/SettingsNavigation.js",
71 "start": { 84 "start": {
72 "line": 29, 85 "line": 33,
73 "column": 10 86 "column": 10
74 }, 87 },
75 "end": { 88 "end": {
76 "line": 32, 89 "line": 36,
77 "column": 3 90 "column": 3
78 } 91 }
79 } 92 }
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..1d5063a97
--- /dev/null
+++ b/src/i18n/messages/src/features/workspaces/components/CreateWorkspaceForm.json
@@ -0,0 +1,28 @@
1[
2 {
3 "id": "settings.workspace.add.form.submitButton",
4 "defaultMessage": "!!!Save workspace",
5 "file": "src/features/workspaces/components/CreateWorkspaceForm.js",
6 "start": {
7 "line": 11,
8 "column": 16
9 },
10 "end": {
11 "line": 14,
12 "column": 3
13 }
14 },
15 {
16 "id": "settings.workspace.add.form.name",
17 "defaultMessage": "!!!Name",
18 "file": "src/features/workspaces/components/CreateWorkspaceForm.js",
19 "start": {
20 "line": 15,
21 "column": 8
22 },
23 "end": {
24 "line": 18,
25 "column": 3
26 }
27 }
28] \ 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..467f49cda
--- /dev/null
+++ b/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json
@@ -0,0 +1,67 @@
1[
2 {
3 "id": "settings.workspace.form.buttonDelete",
4 "defaultMessage": "!!!Delete workspace",
5 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
6 "start": {
7 "line": 16,
8 "column": 16
9 },
10 "end": {
11 "line": 19,
12 "column": 3
13 }
14 },
15 {
16 "id": "settings.workspace.form.buttonSave",
17 "defaultMessage": "!!!Save workspace",
18 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
19 "start": {
20 "line": 20,
21 "column": 14
22 },
23 "end": {
24 "line": 23,
25 "column": 3
26 }
27 },
28 {
29 "id": "settings.workspace.form.name",
30 "defaultMessage": "!!!Name",
31 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
32 "start": {
33 "line": 24,
34 "column": 8
35 },
36 "end": {
37 "line": 27,
38 "column": 3
39 }
40 },
41 {
42 "id": "settings.workspace.form.yourWorkspaces",
43 "defaultMessage": "!!!Your workspaces",
44 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
45 "start": {
46 "line": 28,
47 "column": 18
48 },
49 "end": {
50 "line": 31,
51 "column": 3
52 }
53 },
54 {
55 "id": "settings.workspace.form.servicesInWorkspaceHeadline",
56 "defaultMessage": "!!!Services in this Workspace",
57 "file": "src/features/workspaces/components/EditWorkspaceForm.js",
58 "start": {
59 "line": 32,
60 "column": 31
61 },
62 "end": {
63 "line": 35,
64 "column": 3
65 }
66 }
67] \ 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..0e053a124
--- /dev/null
+++ b/src/i18n/messages/src/features/workspaces/components/WorkspacesDashboard.json
@@ -0,0 +1,28 @@
1[
2 {
3 "id": "settings.workspaces.headline",
4 "defaultMessage": "!!!Your workspaces",
5 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
6 "start": {
7 "line": 12,
8 "column": 12
9 },
10 "end": {
11 "line": 15,
12 "column": 3
13 }
14 },
15 {
16 "id": "settings.workspaces.noWorkspacesAdded",
17 "defaultMessage": "!!!You haven't added any workspaces yet.",
18 "file": "src/features/workspaces/components/WorkspacesDashboard.js",
19 "start": {
20 "line": 16,
21 "column": 19
22 },
23 "end": {
24 "line": 19,
25 "column": 3
26 }
27 }
28] \ No newline at end of file
diff --git a/src/i18n/messages/src/lib/Menu.json b/src/i18n/messages/src/lib/Menu.json
index 9314f5cce..53fa038c6 100644
--- a/src/i18n/messages/src/lib/Menu.json
+++ b/src/i18n/messages/src/lib/Menu.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Edit", 4 "defaultMessage": "!!!Edit",
5 "file": "src/lib/Menu.js", 5 "file": "src/lib/Menu.js",
6 "start": { 6 "start": {
7 "line": 10, 7 "line": 12,
8 "column": 8 8 "column": 8
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 13, 11 "line": 15,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Undo", 17 "defaultMessage": "!!!Undo",
18 "file": "src/lib/Menu.js", 18 "file": "src/lib/Menu.js",
19 "start": { 19 "start": {
20 "line": 14, 20 "line": 16,
21 "column": 8 21 "column": 8
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 17, 24 "line": 19,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Redo", 30 "defaultMessage": "!!!Redo",
31 "file": "src/lib/Menu.js", 31 "file": "src/lib/Menu.js",
32 "start": { 32 "start": {
33 "line": 18, 33 "line": 20,
34 "column": 8 34 "column": 8
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 21, 37 "line": 23,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!Cut", 43 "defaultMessage": "!!!Cut",
44 "file": "src/lib/Menu.js", 44 "file": "src/lib/Menu.js",
45 "start": { 45 "start": {
46 "line": 22, 46 "line": 24,
47 "column": 7 47 "column": 7
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 25, 50 "line": 27,
51 "column": 3 51 "column": 3
52 } 52 }
53 }, 53 },
@@ -56,11 +56,11 @@
56 "defaultMessage": "!!!Copy", 56 "defaultMessage": "!!!Copy",
57 "file": "src/lib/Menu.js", 57 "file": "src/lib/Menu.js",
58 "start": { 58 "start": {
59 "line": 26, 59 "line": 28,
60 "column": 8 60 "column": 8
61 }, 61 },
62 "end": { 62 "end": {
63 "line": 29, 63 "line": 31,
64 "column": 3 64 "column": 3
65 } 65 }
66 }, 66 },
@@ -69,11 +69,11 @@
69 "defaultMessage": "!!!Paste", 69 "defaultMessage": "!!!Paste",
70 "file": "src/lib/Menu.js", 70 "file": "src/lib/Menu.js",
71 "start": { 71 "start": {
72 "line": 30, 72 "line": 32,
73 "column": 9 73 "column": 9
74 }, 74 },
75 "end": { 75 "end": {
76 "line": 33, 76 "line": 35,
77 "column": 3 77 "column": 3
78 } 78 }
79 }, 79 },
@@ -82,11 +82,11 @@
82 "defaultMessage": "!!!Paste And Match Style", 82 "defaultMessage": "!!!Paste And Match Style",
83 "file": "src/lib/Menu.js", 83 "file": "src/lib/Menu.js",
84 "start": { 84 "start": {
85 "line": 34, 85 "line": 36,
86 "column": 22 86 "column": 22
87 }, 87 },
88 "end": { 88 "end": {
89 "line": 37, 89 "line": 39,
90 "column": 3 90 "column": 3
91 } 91 }
92 }, 92 },
@@ -95,11 +95,11 @@
95 "defaultMessage": "!!!Delete", 95 "defaultMessage": "!!!Delete",
96 "file": "src/lib/Menu.js", 96 "file": "src/lib/Menu.js",
97 "start": { 97 "start": {
98 "line": 38, 98 "line": 40,
99 "column": 10 99 "column": 10
100 }, 100 },
101 "end": { 101 "end": {
102 "line": 41, 102 "line": 43,
103 "column": 3 103 "column": 3
104 } 104 }
105 }, 105 },
@@ -108,11 +108,11 @@
108 "defaultMessage": "!!!Select All", 108 "defaultMessage": "!!!Select All",
109 "file": "src/lib/Menu.js", 109 "file": "src/lib/Menu.js",
110 "start": { 110 "start": {
111 "line": 42, 111 "line": 44,
112 "column": 13 112 "column": 13
113 }, 113 },
114 "end": { 114 "end": {
115 "line": 45, 115 "line": 47,
116 "column": 3 116 "column": 3
117 } 117 }
118 }, 118 },
@@ -121,11 +121,11 @@
121 "defaultMessage": "!!!Speech", 121 "defaultMessage": "!!!Speech",
122 "file": "src/lib/Menu.js", 122 "file": "src/lib/Menu.js",
123 "start": { 123 "start": {
124 "line": 46, 124 "line": 48,
125 "column": 10 125 "column": 10
126 }, 126 },
127 "end": { 127 "end": {
128 "line": 49, 128 "line": 51,
129 "column": 3 129 "column": 3
130 } 130 }
131 }, 131 },
@@ -134,11 +134,11 @@
134 "defaultMessage": "!!!Start Speaking", 134 "defaultMessage": "!!!Start Speaking",
135 "file": "src/lib/Menu.js", 135 "file": "src/lib/Menu.js",
136 "start": { 136 "start": {
137 "line": 50, 137 "line": 52,
138 "column": 17 138 "column": 17
139 }, 139 },
140 "end": { 140 "end": {
141 "line": 53, 141 "line": 55,
142 "column": 3 142 "column": 3
143 } 143 }
144 }, 144 },
@@ -147,11 +147,11 @@
147 "defaultMessage": "!!!Stop Speaking", 147 "defaultMessage": "!!!Stop Speaking",
148 "file": "src/lib/Menu.js", 148 "file": "src/lib/Menu.js",
149 "start": { 149 "start": {
150 "line": 54, 150 "line": 56,
151 "column": 16 151 "column": 16
152 }, 152 },
153 "end": { 153 "end": {
154 "line": 57, 154 "line": 59,
155 "column": 3 155 "column": 3
156 } 156 }
157 }, 157 },
@@ -160,11 +160,11 @@
160 "defaultMessage": "!!!Start Dictation", 160 "defaultMessage": "!!!Start Dictation",
161 "file": "src/lib/Menu.js", 161 "file": "src/lib/Menu.js",
162 "start": { 162 "start": {
163 "line": 58, 163 "line": 60,
164 "column": 18 164 "column": 18
165 }, 165 },
166 "end": { 166 "end": {
167 "line": 61, 167 "line": 63,
168 "column": 3 168 "column": 3
169 } 169 }
170 }, 170 },
@@ -173,11 +173,11 @@
173 "defaultMessage": "!!!Emoji & Symbols", 173 "defaultMessage": "!!!Emoji & Symbols",
174 "file": "src/lib/Menu.js", 174 "file": "src/lib/Menu.js",
175 "start": { 175 "start": {
176 "line": 62, 176 "line": 64,
177 "column": 16 177 "column": 16
178 }, 178 },
179 "end": { 179 "end": {
180 "line": 65, 180 "line": 67,
181 "column": 3 181 "column": 3
182 } 182 }
183 }, 183 },
@@ -186,11 +186,11 @@
186 "defaultMessage": "!!!Actual Size", 186 "defaultMessage": "!!!Actual Size",
187 "file": "src/lib/Menu.js", 187 "file": "src/lib/Menu.js",
188 "start": { 188 "start": {
189 "line": 66, 189 "line": 68,
190 "column": 13 190 "column": 13
191 }, 191 },
192 "end": { 192 "end": {
193 "line": 69, 193 "line": 71,
194 "column": 3 194 "column": 3
195 } 195 }
196 }, 196 },
@@ -199,11 +199,11 @@
199 "defaultMessage": "!!!Zoom In", 199 "defaultMessage": "!!!Zoom In",
200 "file": "src/lib/Menu.js", 200 "file": "src/lib/Menu.js",
201 "start": { 201 "start": {
202 "line": 70, 202 "line": 72,
203 "column": 10 203 "column": 10
204 }, 204 },
205 "end": { 205 "end": {
206 "line": 73, 206 "line": 75,
207 "column": 3 207 "column": 3
208 } 208 }
209 }, 209 },
@@ -212,11 +212,11 @@
212 "defaultMessage": "!!!Zoom Out", 212 "defaultMessage": "!!!Zoom Out",
213 "file": "src/lib/Menu.js", 213 "file": "src/lib/Menu.js",
214 "start": { 214 "start": {
215 "line": 74, 215 "line": 76,
216 "column": 11 216 "column": 11
217 }, 217 },
218 "end": { 218 "end": {
219 "line": 77, 219 "line": 79,
220 "column": 3 220 "column": 3
221 } 221 }
222 }, 222 },
@@ -225,11 +225,11 @@
225 "defaultMessage": "!!!Enter Full Screen", 225 "defaultMessage": "!!!Enter Full Screen",
226 "file": "src/lib/Menu.js", 226 "file": "src/lib/Menu.js",
227 "start": { 227 "start": {
228 "line": 78, 228 "line": 80,
229 "column": 19 229 "column": 19
230 }, 230 },
231 "end": { 231 "end": {
232 "line": 81, 232 "line": 83,
233 "column": 3 233 "column": 3
234 } 234 }
235 }, 235 },
@@ -238,11 +238,11 @@
238 "defaultMessage": "!!!Exit Full Screen", 238 "defaultMessage": "!!!Exit Full Screen",
239 "file": "src/lib/Menu.js", 239 "file": "src/lib/Menu.js",
240 "start": { 240 "start": {
241 "line": 82, 241 "line": 84,
242 "column": 18 242 "column": 18
243 }, 243 },
244 "end": { 244 "end": {
245 "line": 85, 245 "line": 87,
246 "column": 3 246 "column": 3
247 } 247 }
248 }, 248 },
@@ -251,11 +251,11 @@
251 "defaultMessage": "!!!Toggle Full Screen", 251 "defaultMessage": "!!!Toggle Full Screen",
252 "file": "src/lib/Menu.js", 252 "file": "src/lib/Menu.js",
253 "start": { 253 "start": {
254 "line": 86, 254 "line": 88,
255 "column": 20 255 "column": 20
256 }, 256 },
257 "end": { 257 "end": {
258 "line": 89, 258 "line": 91,
259 "column": 3 259 "column": 3
260 } 260 }
261 }, 261 },
@@ -264,11 +264,11 @@
264 "defaultMessage": "!!!Toggle Developer Tools", 264 "defaultMessage": "!!!Toggle Developer Tools",
265 "file": "src/lib/Menu.js", 265 "file": "src/lib/Menu.js",
266 "start": { 266 "start": {
267 "line": 90, 267 "line": 92,
268 "column": 18 268 "column": 18
269 }, 269 },
270 "end": { 270 "end": {
271 "line": 93, 271 "line": 95,
272 "column": 3 272 "column": 3
273 } 273 }
274 }, 274 },
@@ -277,11 +277,11 @@
277 "defaultMessage": "!!!Toggle Service Developer Tools", 277 "defaultMessage": "!!!Toggle Service Developer Tools",
278 "file": "src/lib/Menu.js", 278 "file": "src/lib/Menu.js",
279 "start": { 279 "start": {
280 "line": 94, 280 "line": 96,
281 "column": 25 281 "column": 25
282 }, 282 },
283 "end": { 283 "end": {
284 "line": 97, 284 "line": 99,
285 "column": 3 285 "column": 3
286 } 286 }
287 }, 287 },
@@ -290,11 +290,11 @@
290 "defaultMessage": "!!!Reload Service", 290 "defaultMessage": "!!!Reload Service",
291 "file": "src/lib/Menu.js", 291 "file": "src/lib/Menu.js",
292 "start": { 292 "start": {
293 "line": 98, 293 "line": 100,
294 "column": 17 294 "column": 17
295 }, 295 },
296 "end": { 296 "end": {
297 "line": 101, 297 "line": 103,
298 "column": 3 298 "column": 3
299 } 299 }
300 }, 300 },
@@ -303,11 +303,11 @@
303 "defaultMessage": "!!!Reload Franz", 303 "defaultMessage": "!!!Reload Franz",
304 "file": "src/lib/Menu.js", 304 "file": "src/lib/Menu.js",
305 "start": { 305 "start": {
306 "line": 102, 306 "line": 104,
307 "column": 15 307 "column": 15
308 }, 308 },
309 "end": { 309 "end": {
310 "line": 105, 310 "line": 107,
311 "column": 3 311 "column": 3
312 } 312 }
313 }, 313 },
@@ -316,11 +316,11 @@
316 "defaultMessage": "!!!Minimize", 316 "defaultMessage": "!!!Minimize",
317 "file": "src/lib/Menu.js", 317 "file": "src/lib/Menu.js",
318 "start": { 318 "start": {
319 "line": 106, 319 "line": 108,
320 "column": 12 320 "column": 12
321 }, 321 },
322 "end": { 322 "end": {
323 "line": 109, 323 "line": 111,
324 "column": 3 324 "column": 3
325 } 325 }
326 }, 326 },
@@ -329,11 +329,11 @@
329 "defaultMessage": "!!!Close", 329 "defaultMessage": "!!!Close",
330 "file": "src/lib/Menu.js", 330 "file": "src/lib/Menu.js",
331 "start": { 331 "start": {
332 "line": 110, 332 "line": 112,
333 "column": 9 333 "column": 9
334 }, 334 },
335 "end": { 335 "end": {
336 "line": 113, 336 "line": 115,
337 "column": 3 337 "column": 3
338 } 338 }
339 }, 339 },
@@ -342,11 +342,11 @@
342 "defaultMessage": "!!!Learn More", 342 "defaultMessage": "!!!Learn More",
343 "file": "src/lib/Menu.js", 343 "file": "src/lib/Menu.js",
344 "start": { 344 "start": {
345 "line": 114, 345 "line": 116,
346 "column": 13 346 "column": 13
347 }, 347 },
348 "end": { 348 "end": {
349 "line": 117, 349 "line": 119,
350 "column": 3 350 "column": 3
351 } 351 }
352 }, 352 },
@@ -355,11 +355,11 @@
355 "defaultMessage": "!!!Changelog", 355 "defaultMessage": "!!!Changelog",
356 "file": "src/lib/Menu.js", 356 "file": "src/lib/Menu.js",
357 "start": { 357 "start": {
358 "line": 118, 358 "line": 120,
359 "column": 13 359 "column": 13
360 }, 360 },
361 "end": { 361 "end": {
362 "line": 121, 362 "line": 123,
363 "column": 3 363 "column": 3
364 } 364 }
365 }, 365 },
@@ -368,11 +368,11 @@
368 "defaultMessage": "!!!Support", 368 "defaultMessage": "!!!Support",
369 "file": "src/lib/Menu.js", 369 "file": "src/lib/Menu.js",
370 "start": { 370 "start": {
371 "line": 122, 371 "line": 124,
372 "column": 11 372 "column": 11
373 }, 373 },
374 "end": { 374 "end": {
375 "line": 125, 375 "line": 127,
376 "column": 3 376 "column": 3
377 } 377 }
378 }, 378 },
@@ -381,11 +381,11 @@
381 "defaultMessage": "!!!Terms of Service", 381 "defaultMessage": "!!!Terms of Service",
382 "file": "src/lib/Menu.js", 382 "file": "src/lib/Menu.js",
383 "start": { 383 "start": {
384 "line": 126, 384 "line": 128,
385 "column": 7 385 "column": 7
386 }, 386 },
387 "end": { 387 "end": {
388 "line": 129, 388 "line": 131,
389 "column": 3 389 "column": 3
390 } 390 }
391 }, 391 },
@@ -394,11 +394,11 @@
394 "defaultMessage": "!!!Privacy Statement", 394 "defaultMessage": "!!!Privacy Statement",
395 "file": "src/lib/Menu.js", 395 "file": "src/lib/Menu.js",
396 "start": { 396 "start": {
397 "line": 130, 397 "line": 132,
398 "column": 11 398 "column": 11
399 }, 399 },
400 "end": { 400 "end": {
401 "line": 133, 401 "line": 135,
402 "column": 3 402 "column": 3
403 } 403 }
404 }, 404 },
@@ -407,11 +407,11 @@
407 "defaultMessage": "!!!File", 407 "defaultMessage": "!!!File",
408 "file": "src/lib/Menu.js", 408 "file": "src/lib/Menu.js",
409 "start": { 409 "start": {
410 "line": 134, 410 "line": 136,
411 "column": 8 411 "column": 8
412 }, 412 },
413 "end": { 413 "end": {
414 "line": 137, 414 "line": 139,
415 "column": 3 415 "column": 3
416 } 416 }
417 }, 417 },
@@ -420,11 +420,11 @@
420 "defaultMessage": "!!!View", 420 "defaultMessage": "!!!View",
421 "file": "src/lib/Menu.js", 421 "file": "src/lib/Menu.js",
422 "start": { 422 "start": {
423 "line": 138, 423 "line": 140,
424 "column": 8 424 "column": 8
425 }, 425 },
426 "end": { 426 "end": {
427 "line": 141, 427 "line": 143,
428 "column": 3 428 "column": 3
429 } 429 }
430 }, 430 },
@@ -433,11 +433,11 @@
433 "defaultMessage": "!!!Services", 433 "defaultMessage": "!!!Services",
434 "file": "src/lib/Menu.js", 434 "file": "src/lib/Menu.js",
435 "start": { 435 "start": {
436 "line": 142, 436 "line": 144,
437 "column": 12 437 "column": 12
438 }, 438 },
439 "end": { 439 "end": {
440 "line": 145, 440 "line": 147,
441 "column": 3 441 "column": 3
442 } 442 }
443 }, 443 },
@@ -446,11 +446,11 @@
446 "defaultMessage": "!!!Window", 446 "defaultMessage": "!!!Window",
447 "file": "src/lib/Menu.js", 447 "file": "src/lib/Menu.js",
448 "start": { 448 "start": {
449 "line": 146, 449 "line": 148,
450 "column": 10 450 "column": 10
451 }, 451 },
452 "end": { 452 "end": {
453 "line": 149, 453 "line": 151,
454 "column": 3 454 "column": 3
455 } 455 }
456 }, 456 },
@@ -459,11 +459,11 @@
459 "defaultMessage": "!!!Help", 459 "defaultMessage": "!!!Help",
460 "file": "src/lib/Menu.js", 460 "file": "src/lib/Menu.js",
461 "start": { 461 "start": {
462 "line": 150, 462 "line": 152,
463 "column": 8 463 "column": 8
464 }, 464 },
465 "end": { 465 "end": {
466 "line": 153, 466 "line": 155,
467 "column": 3 467 "column": 3
468 } 468 }
469 }, 469 },
@@ -472,11 +472,11 @@
472 "defaultMessage": "!!!About Franz", 472 "defaultMessage": "!!!About Franz",
473 "file": "src/lib/Menu.js", 473 "file": "src/lib/Menu.js",
474 "start": { 474 "start": {
475 "line": 154, 475 "line": 156,
476 "column": 9 476 "column": 9
477 }, 477 },
478 "end": { 478 "end": {
479 "line": 157, 479 "line": 159,
480 "column": 3 480 "column": 3
481 } 481 }
482 }, 482 },
@@ -485,11 +485,11 @@
485 "defaultMessage": "!!!Settings", 485 "defaultMessage": "!!!Settings",
486 "file": "src/lib/Menu.js", 486 "file": "src/lib/Menu.js",
487 "start": { 487 "start": {
488 "line": 158, 488 "line": 160,
489 "column": 12 489 "column": 12
490 }, 490 },
491 "end": { 491 "end": {
492 "line": 161, 492 "line": 163,
493 "column": 3 493 "column": 3
494 } 494 }
495 }, 495 },
@@ -498,11 +498,11 @@
498 "defaultMessage": "!!!Hide", 498 "defaultMessage": "!!!Hide",
499 "file": "src/lib/Menu.js", 499 "file": "src/lib/Menu.js",
500 "start": { 500 "start": {
501 "line": 162, 501 "line": 164,
502 "column": 8 502 "column": 8
503 }, 503 },
504 "end": { 504 "end": {
505 "line": 165, 505 "line": 167,
506 "column": 3 506 "column": 3
507 } 507 }
508 }, 508 },
@@ -511,11 +511,11 @@
511 "defaultMessage": "!!!Hide Others", 511 "defaultMessage": "!!!Hide Others",
512 "file": "src/lib/Menu.js", 512 "file": "src/lib/Menu.js",
513 "start": { 513 "start": {
514 "line": 166, 514 "line": 168,
515 "column": 14 515 "column": 14
516 }, 516 },
517 "end": { 517 "end": {
518 "line": 169, 518 "line": 171,
519 "column": 3 519 "column": 3
520 } 520 }
521 }, 521 },
@@ -524,11 +524,11 @@
524 "defaultMessage": "!!!Unhide", 524 "defaultMessage": "!!!Unhide",
525 "file": "src/lib/Menu.js", 525 "file": "src/lib/Menu.js",
526 "start": { 526 "start": {
527 "line": 170, 527 "line": 172,
528 "column": 10 528 "column": 10
529 }, 529 },
530 "end": { 530 "end": {
531 "line": 173, 531 "line": 175,
532 "column": 3 532 "column": 3
533 } 533 }
534 }, 534 },
@@ -537,11 +537,11 @@
537 "defaultMessage": "!!!Quit", 537 "defaultMessage": "!!!Quit",
538 "file": "src/lib/Menu.js", 538 "file": "src/lib/Menu.js",
539 "start": { 539 "start": {
540 "line": 174, 540 "line": 176,
541 "column": 8 541 "column": 8
542 }, 542 },
543 "end": { 543 "end": {
544 "line": 177, 544 "line": 179,
545 "column": 3 545 "column": 3
546 } 546 }
547 }, 547 },
@@ -550,11 +550,24 @@
550 "defaultMessage": "!!!Add New Service...", 550 "defaultMessage": "!!!Add New Service...",
551 "file": "src/lib/Menu.js", 551 "file": "src/lib/Menu.js",
552 "start": { 552 "start": {
553 "line": 178, 553 "line": 180,
554 "column": 17 554 "column": 17
555 }, 555 },
556 "end": { 556 "end": {
557 "line": 181, 557 "line": 183,
558 "column": 3
559 }
560 },
561 {
562 "id": "menu.workspaces.addNewWorkspace",
563 "defaultMessage": "!!!Add New Workspace...",
564 "file": "src/lib/Menu.js",
565 "start": {
566 "line": 184,
567 "column": 19
568 },
569 "end": {
570 "line": 187,
558 "column": 3 571 "column": 3
559 } 572 }
560 }, 573 },
@@ -563,11 +576,11 @@
563 "defaultMessage": "!!!Activate next service...", 576 "defaultMessage": "!!!Activate next service...",
564 "file": "src/lib/Menu.js", 577 "file": "src/lib/Menu.js",
565 "start": { 578 "start": {
566 "line": 182, 579 "line": 188,
567 "column": 23 580 "column": 23
568 }, 581 },
569 "end": { 582 "end": {
570 "line": 185, 583 "line": 191,
571 "column": 3 584 "column": 3
572 } 585 }
573 }, 586 },
@@ -576,11 +589,11 @@
576 "defaultMessage": "!!!Activate previous service...", 589 "defaultMessage": "!!!Activate previous service...",
577 "file": "src/lib/Menu.js", 590 "file": "src/lib/Menu.js",
578 "start": { 591 "start": {
579 "line": 186, 592 "line": 192,
580 "column": 27 593 "column": 27
581 }, 594 },
582 "end": { 595 "end": {
583 "line": 189, 596 "line": 195,
584 "column": 3 597 "column": 3
585 } 598 }
586 }, 599 },
@@ -589,11 +602,11 @@
589 "defaultMessage": "!!!Disable notifications & audio", 602 "defaultMessage": "!!!Disable notifications & audio",
590 "file": "src/lib/Menu.js", 603 "file": "src/lib/Menu.js",
591 "start": { 604 "start": {
592 "line": 190, 605 "line": 196,
593 "column": 11 606 "column": 11
594 }, 607 },
595 "end": { 608 "end": {
596 "line": 193, 609 "line": 199,
597 "column": 3 610 "column": 3
598 } 611 }
599 }, 612 },
@@ -602,11 +615,37 @@
602 "defaultMessage": "!!!Enable notifications & audio", 615 "defaultMessage": "!!!Enable notifications & audio",
603 "file": "src/lib/Menu.js", 616 "file": "src/lib/Menu.js",
604 "start": { 617 "start": {
605 "line": 194, 618 "line": 200,
606 "column": 13 619 "column": 13
607 }, 620 },
608 "end": { 621 "end": {
609 "line": 197, 622 "line": 203,
623 "column": 3
624 }
625 },
626 {
627 "id": "menu.workspaces",
628 "defaultMessage": "!!!Workspaces",
629 "file": "src/lib/Menu.js",
630 "start": {
631 "line": 204,
632 "column": 14
633 },
634 "end": {
635 "line": 207,
636 "column": 3
637 }
638 },
639 {
640 "id": "menu.workspaces.defaultWorkspace",
641 "defaultMessage": "!!!Default",
642 "file": "src/lib/Menu.js",
643 "start": {
644 "line": 208,
645 "column": 20
646 },
647 "end": {
648 "line": 211,
610 "column": 3 649 "column": 3
611 } 650 }
612 } 651 }
diff --git a/src/lib/Menu.js b/src/lib/Menu.js
index 7a60c448f..b21a62b4d 100644
--- a/src/lib/Menu.js
+++ b/src/lib/Menu.js
@@ -3,6 +3,8 @@ import { observable, autorun } from 'mobx';
3import { defineMessages } from 'react-intl'; 3import { defineMessages } from 'react-intl';
4 4
5import { isMac, ctrlKey, cmdKey } from '../environment'; 5import { isMac, ctrlKey, cmdKey } from '../environment';
6import { workspacesState } from '../features/workspaces/state';
7import workspaceActions from '../features/workspaces/actions';
6 8
7const { app, Menu, dialog } = remote; 9const { app, Menu, dialog } = remote;
8 10
@@ -179,6 +181,10 @@ const menuItems = defineMessages({
179 id: 'menu.services.addNewService', 181 id: 'menu.services.addNewService',
180 defaultMessage: '!!!Add New Service...', 182 defaultMessage: '!!!Add New Service...',
181 }, 183 },
184 addNewWorkspace: {
185 id: 'menu.workspaces.addNewWorkspace',
186 defaultMessage: '!!!Add New Workspace...',
187 },
182 activateNextService: { 188 activateNextService: {
183 id: 'menu.services.setNextServiceActive', 189 id: 'menu.services.setNextServiceActive',
184 defaultMessage: '!!!Activate next service...', 190 defaultMessage: '!!!Activate next service...',
@@ -195,6 +201,14 @@ const menuItems = defineMessages({
195 id: 'sidebar.unmuteApp', 201 id: 'sidebar.unmuteApp',
196 defaultMessage: '!!!Enable notifications & audio', 202 defaultMessage: '!!!Enable notifications & audio',
197 }, 203 },
204 workspaces: {
205 id: 'menu.workspaces',
206 defaultMessage: '!!!Workspaces',
207 },
208 defaultWorkspace: {
209 id: 'menu.workspaces.defaultWorkspace',
210 defaultMessage: '!!!Default',
211 },
198}); 212});
199 213
200function getActiveWebview() { 214function getActiveWebview() {
@@ -298,6 +312,10 @@ const _templateFactory = intl => [
298 submenu: [], 312 submenu: [],
299 }, 313 },
300 { 314 {
315 label: intl.formatMessage(menuItems.workspaces),
316 submenu: [],
317 },
318 {
301 label: intl.formatMessage(menuItems.window), 319 label: intl.formatMessage(menuItems.window),
302 role: 'window', 320 role: 'window',
303 submenu: [ 321 submenu: [
@@ -537,6 +555,7 @@ export default class FranzMenu {
537 _build() { 555 _build() {
538 // need to clone object so we don't modify computed (cached) object 556 // need to clone object so we don't modify computed (cached) object
539 const serviceTpl = Object.assign([], this.serviceTpl()); 557 const serviceTpl = Object.assign([], this.serviceTpl());
558 const workspacesMenu = Object.assign([], this.workspacesMenu());
540 559
541 if (window.franz === undefined) { 560 if (window.franz === undefined) {
542 return; 561 return;
@@ -669,7 +688,7 @@ export default class FranzMenu {
669 }, 688 },
670 ); 689 );
671 690
672 tpl[4].submenu.unshift(about, { 691 tpl[5].submenu.unshift(about, {
673 type: 'separator', 692 type: 'separator',
674 }); 693 });
675 } else { 694 } else {
@@ -704,6 +723,8 @@ export default class FranzMenu {
704 tpl[3].submenu = serviceTpl; 723 tpl[3].submenu = serviceTpl;
705 } 724 }
706 725
726 tpl[4].submenu = workspacesMenu;
727
707 this.currentTemplate = tpl; 728 this.currentTemplate = tpl;
708 const menu = Menu.buildFromTemplate(tpl); 729 const menu = Menu.buildFromTemplate(tpl);
709 Menu.setApplicationMenu(menu); 730 Menu.setApplicationMenu(menu);
@@ -754,6 +775,50 @@ export default class FranzMenu {
754 return menu; 775 return menu;
755 } 776 }
756 777
778 workspacesMenu() {
779 const { workspaces, activeWorkspace } = workspacesState;
780 const { intl } = window.franz;
781 const menu = [];
782
783 // Add new workspace item:
784 menu.push({
785 label: intl.formatMessage(menuItems.addNewWorkspace),
786 accelerator: `${cmdKey}+Shift+N`,
787 click: () => {
788 this.actions.ui.openSettings({ path: 'workspaces' });
789 },
790 enabled: this.stores.user.isLoggedIn,
791 }, {
792 type: 'separator',
793 });
794
795 // Default workspace
796 menu.push({
797 label: intl.formatMessage(menuItems.defaultWorkspace),
798 accelerator: `${cmdKey}+Alt+1`,
799 type: 'radio',
800 checked: !activeWorkspace,
801 click: () => {
802 workspaceActions.deactivate();
803 },
804 });
805
806 // Workspace items
807 if (this.stores.user.isLoggedIn) {
808 workspaces.forEach((workspace, i) => menu.push({
809 label: workspace.name,
810 accelerator: i < 9 ? `${cmdKey}+Alt+${i + 2}` : null,
811 type: 'radio',
812 checked: activeWorkspace ? workspace.id === activeWorkspace.id : false,
813 click: () => {
814 workspaceActions.activate({ workspace });
815 },
816 }));
817 }
818
819 return menu;
820 }
821
757 _getServiceName(service) { 822 _getServiceName(service) {
758 if (service.name) { 823 if (service.name) {
759 return service.name; 824 return service.name;
diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js
index d2842083c..b7130904b 100644
--- a/src/stores/FeaturesStore.js
+++ b/src/stores/FeaturesStore.js
@@ -7,6 +7,7 @@ import delayApp from '../features/delayApp';
7import spellchecker from '../features/spellchecker'; 7import spellchecker from '../features/spellchecker';
8import serviceProxy from '../features/serviceProxy'; 8import serviceProxy from '../features/serviceProxy';
9import basicAuth from '../features/basicAuth'; 9import basicAuth from '../features/basicAuth';
10import workspaces from '../features/workspaces';
10import shareFranz from '../features/shareFranz'; 11import shareFranz from '../features/shareFranz';
11 12
12import { DEFAULT_FEATURES_CONFIG } from '../config'; 13import { DEFAULT_FEATURES_CONFIG } from '../config';
@@ -38,7 +39,7 @@ export default class FeaturesStore extends Store {
38 39
39 @computed get features() { 40 @computed get features() {
40 if (this.stores.user.isLoggedIn) { 41 if (this.stores.user.isLoggedIn) {
41 return this.featuresRequest.execute().result || DEFAULT_FEATURES_CONFIG; 42 return Object.assign({}, DEFAULT_FEATURES_CONFIG, this.featuresRequest.execute().result);
42 } 43 }
43 44
44 return DEFAULT_FEATURES_CONFIG; 45 return DEFAULT_FEATURES_CONFIG;
@@ -57,6 +58,7 @@ export default class FeaturesStore extends Store {
57 spellchecker(this.stores, this.actions); 58 spellchecker(this.stores, this.actions);
58 serviceProxy(this.stores, this.actions); 59 serviceProxy(this.stores, this.actions);
59 basicAuth(this.stores, this.actions); 60 basicAuth(this.stores, this.actions);
61 workspaces(this.stores, this.actions);
60 shareFranz(this.stores, this.actions); 62 shareFranz(this.stores, this.actions);
61 } 63 }
62} 64}
diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js
index c63bef196..da4b19c0d 100644
--- a/src/stores/ServicesStore.js
+++ b/src/stores/ServicesStore.js
@@ -12,6 +12,7 @@ import Request from './lib/Request';
12import CachedRequest from './lib/CachedRequest'; 12import CachedRequest from './lib/CachedRequest';
13import { matchRoute } from '../helpers/routing-helpers'; 13import { matchRoute } from '../helpers/routing-helpers';
14import { gaEvent } from '../lib/analytics'; 14import { gaEvent } from '../lib/analytics';
15import { filterServicesByActiveWorkspace, getActiveWorkspaceServices } from '../features/workspaces';
15 16
16const debug = require('debug')('Franz:ServiceStore'); 17const debug = require('debug')('Franz:ServiceStore');
17 18
@@ -98,7 +99,6 @@ export default class ServicesStore extends Store {
98 return observable(services.slice().slice().sort((a, b) => a.order - b.order)); 99 return observable(services.slice().slice().sort((a, b) => a.order - b.order));
99 } 100 }
100 } 101 }
101
102 return []; 102 return [];
103 } 103 }
104 104
@@ -107,13 +107,16 @@ export default class ServicesStore extends Store {
107 } 107 }
108 108
109 @computed get allDisplayed() { 109 @computed get allDisplayed() {
110 return this.stores.settings.all.app.showDisabledServices ? this.all : this.enabled; 110 const services = this.stores.settings.all.app.showDisabledServices ? this.all : this.enabled;
111 return filterServicesByActiveWorkspace(services);
111 } 112 }
112 113
113 // This is just used to avoid unnecessary rerendering of resource-heavy webviews 114 // This is just used to avoid unnecessary rerendering of resource-heavy webviews
114 @computed get allDisplayedUnordered() { 115 @computed get allDisplayedUnordered() {
116 const { showDisabledServices } = this.stores.settings.all.app;
115 const services = this.allServicesRequest.execute().result || []; 117 const services = this.allServicesRequest.execute().result || [];
116 return this.stores.settings.all.app.showDisabledServices ? services : services.filter(service => service.isEnabled); 118 const filteredServices = showDisabledServices ? services : services.filter(service => service.isEnabled);
119 return getActiveWorkspaceServices(filteredServices);
117 } 120 }
118 121
119 @computed get filtered() { 122 @computed get filtered() {
diff --git a/src/styles/main.scss b/src/styles/main.scss
index 784a04d3d..9ba7f5827 100644
--- a/src/styles/main.scss
+++ b/src/styles/main.scss
@@ -31,6 +31,9 @@ $mdi-font-path: '../node_modules/mdi/fonts';
31@import './invite.scss'; 31@import './invite.scss';
32@import './title-bar.scss'; 32@import './title-bar.scss';
33 33
34// Workspaces legacy css
35@import '../features/workspaces/styles/workspaces-table';
36
34// form 37// form
35@import './input.scss'; 38@import './input.scss';
36@import './radio.scss'; 39@import './radio.scss';