import { Component, ReactElement } from 'react'; import { observer } from 'mobx-react'; import { defineMessages, injectIntl, WrappedComponentProps } from 'react-intl'; import { Link } from 'react-router-dom'; import withStyles, { WithStylesProps } from 'react-jss'; import { noop } from 'lodash'; import Infobox from '../../../components/ui/infobox/index'; import Input from '../../../components/ui/input'; import Button from '../../../components/ui/button'; import Workspace from '../models/Workspace'; import Service from '../../../models/Service'; import Form from '../../../lib/Form'; 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'; import { H2 } from '../../../components/ui/headline'; const messages = defineMessages({ buttonDelete: { id: 'settings.workspace.form.buttonDelete', defaultMessage: 'Delete workspace', }, buttonSave: { id: 'settings.workspace.form.buttonSave', defaultMessage: 'Save workspace', }, name: { id: 'settings.workspace.form.name', defaultMessage: 'Name', }, yourWorkspaces: { id: 'settings.workspace.form.yourWorkspaces', defaultMessage: 'Your workspaces', }, 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', }, noServicesAdded: { id: 'settings.services.noServicesAdded', defaultMessage: 'Start by adding a service.', }, discoverServices: { id: 'settings.services.discoverServices', defaultMessage: 'Discover services', }, }); const styles = { nameInput: { height: 'auto', }, serviceList: { height: 'auto', }, keepLoadedInfo: { marginBottom: '2rem !important', }, }; interface IProps extends WithStylesProps, WrappedComponentProps { onDelete: () => void; onSave: (...args: any[]) => void; services: Service[]; workspace: Workspace; updateWorkspaceRequest: Request; deleteWorkspaceRequest: Request; } @observer class EditWorkspaceForm extends Component { form: Form; constructor(props: IProps) { super(props); this.form = this.prepareWorkspaceForm(this.props.workspace); } UNSAFE_componentWillReceiveProps(nextProps): void { const { workspace } = this.props; if (workspace.id !== nextProps.workspace.id) { this.form = this.prepareWorkspaceForm(nextProps.workspace); } } prepareWorkspaceForm(workspace: Workspace): Form { const { intl, updateWorkspaceRequest } = this.props; updateWorkspaceRequest.reset(); return new Form({ fields: { name: { label: intl.formatMessage(messages.name), placeholder: intl.formatMessage(messages.name), value: workspace.name, validators: [required], }, keepLoaded: { label: intl.formatMessage(messages.keepLoaded), value: workspace.services.includes(KEEP_WS_LOADED_USID), default: false, type: 'checkbox', }, services: { value: [...workspace.services], }, }, }); } save(form): void { this.props.updateWorkspaceRequest.reset(); form.submit({ onSuccess: async f => { const { onSave } = this.props; const values = f.values(); onSave(values); }, onError: noop, }); } delete(): void { const { onDelete } = this.props; onDelete(); } toggleService(service: Service): void { const servicesField = this.form.$('services'); const serviceIds = servicesField.value; if (serviceIds.includes(service.id)) { serviceIds.splice(serviceIds.indexOf(service.id), 1); } else { serviceIds.push(service.id); } servicesField.set(serviceIds); } render(): ReactElement { const { classes, workspace, services, deleteWorkspaceRequest, updateWorkspaceRequest, intl, } = this.props; const { form } = this; const workspaceServices = form.$('services').value; const isDeleting = deleteWorkspaceRequest.isExecuting; const isSaving = updateWorkspaceRequest.isExecuting; return (
{intl.formatMessage(messages.yourWorkspaces)} {workspace.name}
{updateWorkspaceRequest.error && ( Error while saving workspace )}

{intl.formatMessage(messages.keepLoadedInfo)}

{intl.formatMessage(messages.servicesInWorkspaceHeadline)}

{services.length === 0 ? (
{/* ===== Empty state ===== */}

{intl.formatMessage(messages.noServicesAdded)}

{intl.formatMessage(messages.discoverServices)}
) : ( <> {services.map(service => ( this.toggleService(service)} /> ))} )}
{/* ===== Delete Button ===== */}
); } } export default injectIntl( withStyles(styles, { injectTheme: true })(EditWorkspaceForm), );