From bf676f8597e5539c047f42a5716022681e3419c3 Mon Sep 17 00:00:00 2001 From: vantezzen Date: Mon, 16 Sep 2019 12:46:13 +0200 Subject: Implement #37 --- src/config.js | 2 ++ .../workspaces/components/EditWorkspaceForm.js | 24 +++++++++++++++++ .../workspaces/containers/EditWorkspaceScreen.js | 4 ++- src/features/workspaces/models/Workspace.js | 14 +++++++++- src/features/workspaces/store.js | 4 ++- src/i18n/locales/defaultMessages.json | 28 +++++++++---------- src/i18n/locales/en-US.json | 2 ++ .../workspaces/components/EditWorkspaceForm.json | 28 +++++++++---------- src/stores/ServicesStore.js | 31 +++++++++++++++++++++- 9 files changed, 105 insertions(+), 32 deletions(-) (limited to 'src') diff --git a/src/config.js b/src/config.js index 66789f2a4..f9689b3ff 100644 --- a/src/config.js +++ b/src/config.js @@ -31,6 +31,8 @@ export const DEVELOPMENT_TODOS_FRONTEND_URL = 'https://development--franz-todos. export const GA_ID = !isDevMode ? 'UA-74126766-10' : 'UA-74126766-12'; +export const KEEP_WS_LOADED_USID = '0a0aa000-0a0a-49a0-a000-a0a0a0a0a0a0'; + export const DEFAULT_APP_SETTINGS = { autoLaunchInBackground: false, runInBackground: true, diff --git a/src/features/workspaces/components/EditWorkspaceForm.js b/src/features/workspaces/components/EditWorkspaceForm.js index 82ea1b564..b3551a7b9 100644 --- a/src/features/workspaces/components/EditWorkspaceForm.js +++ b/src/features/workspaces/components/EditWorkspaceForm.js @@ -13,6 +13,10 @@ import { required } from '../../../helpers/validation-helpers'; import WorkspaceServiceListItem from './WorkspaceServiceListItem'; import Request from '../../../stores/lib/Request'; +import { KEEP_WS_LOADED_USID } from '../../../config'; + +import Toggle from '../../../components/ui/Toggle'; + const messages = defineMessages({ buttonDelete: { id: 'settings.workspace.form.buttonDelete', @@ -30,6 +34,14 @@ const messages = defineMessages({ id: 'settings.workspace.form.yourWorkspaces', defaultMessage: '!!!Your workspaces', }, + keepLoaded: { + id: 'settings.workspace.form.keepLoaded', + defaultMessage: '!!!Keep this workspace loaded*', + }, + keepLoadedInfo: { + id: 'settings.workspace.form.keepLoadedInfo', + defaultMessage: '!!!*This option will be overwritten by the global "Keep all workspaces loaded" option.', + }, servicesInWorkspaceHeadline: { id: 'settings.workspace.form.servicesInWorkspaceHeadline', defaultMessage: '!!!Services in this Workspace', @@ -51,6 +63,9 @@ const styles = () => ({ serviceList: { height: 'auto', }, + keepLoadedInfo: { + marginBottom: '2rem !important', + }, }); @injectSheet(styles) @observer @@ -88,6 +103,11 @@ class EditWorkspaceForm extends Component { value: workspace.name, validators: [required], }, + keepLoaded: { + label: intl.formatMessage(messages.keepLoaded), + value: workspace.services.includes(KEEP_WS_LOADED_USID), + default: false, + }, services: { value: workspace.services.slice(), }, @@ -151,6 +171,10 @@ class EditWorkspaceForm extends Component {
+ +

+ { intl.formatMessage(messages.keepLoadedInfo) } +

{intl.formatMessage(messages.servicesInWorkspaceHeadline)}

diff --git a/src/features/workspaces/containers/EditWorkspaceScreen.js b/src/features/workspaces/containers/EditWorkspaceScreen.js index 248b40131..7eaabc1ea 100644 --- a/src/features/workspaces/containers/EditWorkspaceScreen.js +++ b/src/features/workspaces/containers/EditWorkspaceScreen.js @@ -33,7 +33,9 @@ class EditWorkspaceScreen extends Component { const { workspaceBeingEdited } = workspaceStore; const { actions } = this.props; const workspace = new Workspace( - Object.assign({}, workspaceBeingEdited, values), + Object.assign({ + saving: true, + }, workspaceBeingEdited, values), ); actions.workspaces.update({ workspace }); }; diff --git a/src/features/workspaces/models/Workspace.js b/src/features/workspaces/models/Workspace.js index 6c73d7095..77c4e05f4 100644 --- a/src/features/workspaces/models/Workspace.js +++ b/src/features/workspaces/models/Workspace.js @@ -1,5 +1,7 @@ import { observable } from 'mobx'; +import { KEEP_WS_LOADED_USID } from '../../../config'; + export default class Workspace { id = null; @@ -19,7 +21,17 @@ export default class Workspace { this.id = data.id; this.name = data.name; this.order = data.order; - this.services.replace(data.services); + + let services = data.services; + if (data.saving && data.keepLoaded) { + // Keep workspaces loaded + services.push(KEEP_WS_LOADED_USID); + } else if (data.saving && data.services.includes(KEEP_WS_LOADED_USID)) { + // Don't keep loaded + services = services.filter(e => e !== KEEP_WS_LOADED_USID); + } + this.services.replace(services); + this.userId = data.userId; } } diff --git a/src/features/workspaces/store.js b/src/features/workspaces/store.js index da1582a77..949f8a792 100644 --- a/src/features/workspaces/store.js +++ b/src/features/workspaces/store.js @@ -17,6 +17,8 @@ import { WORKSPACES_ROUTES } from './index'; import { createReactions } from '../../stores/lib/Reaction'; import { createActionBindings } from '../utils/ActionBinding'; +import { KEEP_WS_LOADED_USID } from '../../config'; + const debug = require('debug')('Ferdi:feature:workspaces:store'); export default class WorkspacesStore extends FeatureStore { @@ -327,7 +329,7 @@ export default class WorkspacesStore extends FeatureStore { // Loop through all workspaces and remove invalid service ids (locally) this.workspaces.forEach((workspace) => { workspace.services.forEach((serviceId) => { - if (servicesHaveBeenLoaded && !services.one(serviceId)) { + if (servicesHaveBeenLoaded && !services.one(serviceId) && serviceId !== KEEP_WS_LOADED_USID) { workspace.services.remove(serviceId); } }); diff --git a/src/i18n/locales/defaultMessages.json b/src/i18n/locales/defaultMessages.json index 907f519b0..7fce61486 100644 --- a/src/i18n/locales/defaultMessages.json +++ b/src/i18n/locales/defaultMessages.json @@ -4187,91 +4187,91 @@ "defaultMessage": "!!!Delete workspace", "end": { "column": 3, - "line": 20 + "line": 24 }, "file": "src/features/workspaces/components/EditWorkspaceForm.js", "id": "settings.workspace.form.buttonDelete", "start": { "column": 16, - "line": 17 + "line": 21 } }, { "defaultMessage": "!!!Save workspace", "end": { "column": 3, - "line": 24 + "line": 28 }, "file": "src/features/workspaces/components/EditWorkspaceForm.js", "id": "settings.workspace.form.buttonSave", "start": { "column": 14, - "line": 21 + "line": 25 } }, { "defaultMessage": "!!!Name", "end": { "column": 3, - "line": 28 + "line": 32 }, "file": "src/features/workspaces/components/EditWorkspaceForm.js", "id": "settings.workspace.form.name", "start": { "column": 8, - "line": 25 + "line": 29 } }, { "defaultMessage": "!!!Your workspaces", "end": { "column": 3, - "line": 32 + "line": 36 }, "file": "src/features/workspaces/components/EditWorkspaceForm.js", "id": "settings.workspace.form.yourWorkspaces", "start": { "column": 18, - "line": 29 + "line": 33 } }, { "defaultMessage": "!!!Services in this Workspace", "end": { "column": 3, - "line": 36 + "line": 40 }, "file": "src/features/workspaces/components/EditWorkspaceForm.js", "id": "settings.workspace.form.servicesInWorkspaceHeadline", "start": { "column": 31, - "line": 33 + "line": 37 } }, { "defaultMessage": "!!!You haven't added any services yet.", "end": { "column": 3, - "line": 40 + "line": 44 }, "file": "src/features/workspaces/components/EditWorkspaceForm.js", "id": "settings.services.noServicesAdded", "start": { "column": 19, - "line": 37 + "line": 41 } }, { "defaultMessage": "!!!Discover services", "end": { "column": 3, - "line": 44 + "line": 48 }, "file": "src/features/workspaces/components/EditWorkspaceForm.js", "id": "settings.services.discoverServices", "start": { "column": 20, - "line": 41 + "line": 45 } } ], diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json index 12e2bea88..d19ddff13 100644 --- a/src/i18n/locales/en-US.json +++ b/src/i18n/locales/en-US.json @@ -329,6 +329,8 @@ "settings.workspace.add.form.submitButton": "Create workspace", "settings.workspace.form.buttonDelete": "Delete workspace", "settings.workspace.form.buttonSave": "Save workspace", + "settings.workspace.form.keepLoaded": "Keep this workspace loaded*", + "settings.workspace.form.keepLoadedInfo": "*This option will be overwritten by the global \"Keep all workspaces loaded\" option.", "settings.workspace.form.name": "Name", "settings.workspace.form.servicesInWorkspaceHeadline": "Services in this Workspace", "settings.workspace.form.yourWorkspaces": "Your workspaces", diff --git a/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json b/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json index 61abf8ba0..5bb13a415 100644 --- a/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json +++ b/src/i18n/messages/src/features/workspaces/components/EditWorkspaceForm.json @@ -4,11 +4,11 @@ "defaultMessage": "!!!Delete workspace", "file": "src/features/workspaces/components/EditWorkspaceForm.js", "start": { - "line": 17, + "line": 21, "column": 16 }, "end": { - "line": 20, + "line": 24, "column": 3 } }, @@ -17,11 +17,11 @@ "defaultMessage": "!!!Save workspace", "file": "src/features/workspaces/components/EditWorkspaceForm.js", "start": { - "line": 21, + "line": 25, "column": 14 }, "end": { - "line": 24, + "line": 28, "column": 3 } }, @@ -30,11 +30,11 @@ "defaultMessage": "!!!Name", "file": "src/features/workspaces/components/EditWorkspaceForm.js", "start": { - "line": 25, + "line": 29, "column": 8 }, "end": { - "line": 28, + "line": 32, "column": 3 } }, @@ -43,11 +43,11 @@ "defaultMessage": "!!!Your workspaces", "file": "src/features/workspaces/components/EditWorkspaceForm.js", "start": { - "line": 29, + "line": 33, "column": 18 }, "end": { - "line": 32, + "line": 36, "column": 3 } }, @@ -56,11 +56,11 @@ "defaultMessage": "!!!Services in this Workspace", "file": "src/features/workspaces/components/EditWorkspaceForm.js", "start": { - "line": 33, + "line": 37, "column": 31 }, "end": { - "line": 36, + "line": 40, "column": 3 } }, @@ -69,11 +69,11 @@ "defaultMessage": "!!!You haven't added any services yet.", "file": "src/features/workspaces/components/EditWorkspaceForm.js", "start": { - "line": 37, + "line": 41, "column": 19 }, "end": { - "line": 40, + "line": 44, "column": 3 } }, @@ -82,11 +82,11 @@ "defaultMessage": "!!!Discover services", "file": "src/features/workspaces/components/EditWorkspaceForm.js", "start": { - "line": 41, + "line": 45, "column": 20 }, "end": { - "line": 44, + "line": 48, "column": 3 } } diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js index 374daf333..f88b14983 100644 --- a/src/stores/ServicesStore.js +++ b/src/stores/ServicesStore.js @@ -14,6 +14,7 @@ import { matchRoute } from '../helpers/routing-helpers'; import { workspaceStore } from '../features/workspaces'; import { serviceLimitStore } from '../features/serviceLimit'; import { RESTRICTION_TYPES } from '../models/Service'; +import { KEEP_WS_LOADED_USID } from '../config'; const debug = require('debug')('Ferdi:ServiceStore'); @@ -124,7 +125,35 @@ export default class ServicesStore extends Store { const { keepAllWorkspacesLoaded } = this.stores.workspaces.settings; const services = this.allServicesRequest.execute().result || []; const filteredServices = showDisabledServices ? services : services.filter(service => service.isEnabled); - return keepAllWorkspacesLoaded ? filteredServices : workspaceStore.filterServicesByActiveWorkspace(filteredServices); + + let displayedServices; + if (keepAllWorkspacesLoaded) { + // Keep all enabled services loaded + displayedServices = filteredServices; + } else { + // Keep all services in current workspace loaded + displayedServices = workspaceStore.filterServicesByActiveWorkspace(filteredServices); + + // Keep all services active in workspaces that should be kept loaded + for (const workspace of this.stores.workspaces.workspaces) { + // Check if workspace needs to be kept loaded + if (workspace.services.includes(KEEP_WS_LOADED_USID)) { + // Get services for workspace + const serviceIDs = workspace.services.filter(i => i !== KEEP_WS_LOADED_USID); + const wsServices = filteredServices.filter(service => serviceIDs.includes(service.id)); + + displayedServices = [ + ...displayedServices, + ...wsServices, + ]; + } + } + + // Make sure every service is in the list only once + displayedServices = displayedServices.filter((v, i, a) => a.indexOf(v) === i); + } + + return displayedServices; } @computed get filtered() { -- cgit v1.2.3-54-g00ecf