diff --git a/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/api/IEditingContextActionHandler.java b/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/api/IEditingContextActionHandler.java new file mode 100644 index 0000000000..732daf8578 --- /dev/null +++ b/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/api/IEditingContextActionHandler.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2022 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.collaborative.api; + +import org.eclipse.sirius.components.collaborative.dto.InvokeEditingContextActionInput; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.representations.IStatus; + +/** + * Process the given {@link InvokeEditingContextActionInput}. + * + * @author rpage + */ +public interface IEditingContextActionHandler { + boolean canHandle(IEditingContext editingContext, String actionId); + + IStatus handle(IEditingContext editingContext, String actionId); +} diff --git a/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/api/IEditingContextActionProvider.java b/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/api/IEditingContextActionProvider.java new file mode 100644 index 0000000000..76415e8055 --- /dev/null +++ b/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/api/IEditingContextActionProvider.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2022 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.collaborative.api; + +import java.util.List; + +import org.eclipse.sirius.components.collaborative.dto.EditingContextAction; +import org.eclipse.sirius.components.core.api.IEditingContext; + +/** + * Used to provide the EditingContext Actions of an {@link IEditingContext}. + * + * @author rpage + */ +public interface IEditingContextActionProvider { + List getEditingContextAction(IEditingContext editingContext); +} diff --git a/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextAction.java b/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextAction.java new file mode 100644 index 0000000000..7f5e0a73c9 --- /dev/null +++ b/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/EditingContextAction.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * Copyright (c) 2022 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.collaborative.dto; + +import java.text.MessageFormat; +import java.util.Objects; + +/** + * Details of an EditingContext Action. + * + * @author rpage + */ +public class EditingContextAction { + private final String id; + + private final String label; + + public EditingContextAction(String id, String label) { + this.id = Objects.requireNonNull(id); + this.label = Objects.requireNonNull(label); + } + + public String getId() { + return this.id; + } + + public String getLabel() { + return this.label; + } + + @Override + public String toString() { + String pattern = "{0} '{'id: {1}, label: {2}'}'"; //$NON-NLS-1$ + return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.id, this.label); + } +} diff --git a/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/GetEditingContextActionsInput.java b/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/GetEditingContextActionsInput.java new file mode 100644 index 0000000000..f444e3223b --- /dev/null +++ b/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/GetEditingContextActionsInput.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2022 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.collaborative.dto; + +import java.text.MessageFormat; +import java.util.Objects; +import java.util.UUID; + +import org.eclipse.sirius.components.core.api.IInput; + +/** + * The input object for this query. + * + * @author rpage + */ +public final class GetEditingContextActionsInput implements IInput { + private final UUID id; + + private final String editingContextId; + + public GetEditingContextActionsInput(UUID id, String editingContextId) { + this.id = Objects.requireNonNull(id); + this.editingContextId = Objects.requireNonNull(editingContextId); + } + + @Override + public UUID getId() { + return this.id; + } + + public String getEditingContextId() { + return this.editingContextId; + } + + @Override + public String toString() { + String pattern = "{0} '{'id: {1}, editingContextId: {2}'}'"; //$NON-NLS-1$ + return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.id, this.editingContextId); + } +} diff --git a/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/GetEditingContextActionsSuccessPayload.java b/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/GetEditingContextActionsSuccessPayload.java new file mode 100644 index 0000000000..475503ee4b --- /dev/null +++ b/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/GetEditingContextActionsSuccessPayload.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2022 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.collaborative.dto; + +import java.text.MessageFormat; +import java.util.List; +import java.util.Objects; +import java.util.UUID; + +import org.eclipse.sirius.components.core.api.IPayload; + +/** + * The payload object for this query. + * + * @author rpage + */ +public final class GetEditingContextActionsSuccessPayload implements IPayload { + private final UUID id; + + private final List editingContextActions; + + public GetEditingContextActionsSuccessPayload(UUID id, List editingContextActions) { + this.id = Objects.requireNonNull(id); + this.editingContextActions = Objects.requireNonNull(editingContextActions); + } + + @Override + public UUID getId() { + return this.id; + } + + public List getEditingContextActions() { + return this.editingContextActions; + } + + @Override + public String toString() { + String pattern = "{0} '{'id: {1}, editingContextActions: {2}'}'"; //$NON-NLS-1$ + return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.id, this.editingContextActions); + } +} diff --git a/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/InvokeEditingContextActionInput.java b/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/InvokeEditingContextActionInput.java new file mode 100644 index 0000000000..074b0bb855 --- /dev/null +++ b/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/InvokeEditingContextActionInput.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2022 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.collaborative.dto; + +import java.text.MessageFormat; +import java.util.UUID; + +import org.eclipse.sirius.components.collaborative.handlers.InvokeEditingContextActionEventHandler; +import org.eclipse.sirius.components.core.api.IInput; + +/** + * The input object of the {@link InvokeEditingContextActionEventHandler}. + * + * @author rpage + */ +public final class InvokeEditingContextActionInput implements IInput { + private UUID id; + + private String editingContextId; + + private String actionId; + + @Override + public UUID getId() { + return this.id; + } + + public String getEditingContextId() { + return this.editingContextId; + } + + public String getActionId() { + return this.actionId; + } + + @Override + public String toString() { + String pattern = "{0} '{'id: {1}, editingContextId: {2}, actionId: {3}'}'"; //$NON-NLS-1$ + return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.id, this.editingContextId, this.actionId); + } +} diff --git a/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/InvokeEditingContextActionSuccessPayload.java b/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/InvokeEditingContextActionSuccessPayload.java new file mode 100644 index 0000000000..85e04422e8 --- /dev/null +++ b/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/dto/InvokeEditingContextActionSuccessPayload.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * Copyright (c) 2022 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.collaborative.dto; + +import java.text.MessageFormat; +import java.util.Objects; +import java.util.UUID; + +import org.eclipse.sirius.components.core.api.IPayload; + +/** + * The payload of the Invoke Editing Context Action mutation. + * + * @author rpage + */ +public final class InvokeEditingContextActionSuccessPayload implements IPayload { + private final UUID id; + + public InvokeEditingContextActionSuccessPayload(UUID id) { + this.id = Objects.requireNonNull(id); + } + + @Override + public UUID getId() { + return this.id; + } + + @Override + public String toString() { + String pattern = "{0} '{'id: {1}'}'"; //$NON-NLS-1$ + return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.id); + } +} diff --git a/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/handlers/GetEditingContextActionsEventHandler.java b/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/handlers/GetEditingContextActionsEventHandler.java new file mode 100644 index 0000000000..d63b121824 --- /dev/null +++ b/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/handlers/GetEditingContextActionsEventHandler.java @@ -0,0 +1,94 @@ +/******************************************************************************* + * Copyright (c) 2022 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.collaborative.handlers; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import org.eclipse.sirius.components.collaborative.api.ChangeDescription; +import org.eclipse.sirius.components.collaborative.api.ChangeKind; +import org.eclipse.sirius.components.collaborative.api.IEditingContextActionProvider; +import org.eclipse.sirius.components.collaborative.api.IEditingContextEventHandler; +import org.eclipse.sirius.components.collaborative.api.Monitoring; +import org.eclipse.sirius.components.collaborative.dto.EditingContextAction; +import org.eclipse.sirius.components.collaborative.dto.GetEditingContextActionsInput; +import org.eclipse.sirius.components.collaborative.dto.GetEditingContextActionsSuccessPayload; +import org.eclipse.sirius.components.collaborative.messages.ICollaborativeMessageService; +import org.eclipse.sirius.components.core.api.ErrorPayload; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.core.api.IInput; +import org.eclipse.sirius.components.core.api.IPayload; +import org.springframework.stereotype.Service; + +import io.micrometer.core.instrument.Counter; +import io.micrometer.core.instrument.MeterRegistry; +import reactor.core.publisher.Sinks.Many; +import reactor.core.publisher.Sinks.One; + +/** + * Handler used to access to the EditingContext Actions. + * + * @author rpage + */ +@Service +public class GetEditingContextActionsEventHandler implements IEditingContextEventHandler { + private final ICollaborativeMessageService messageService; + + private final Counter counter; + + private final List editingContextActionProviders; + + public GetEditingContextActionsEventHandler(ICollaborativeMessageService messageService, List editingContextActionProviders, MeterRegistry meterRegistry) { + this.messageService = Objects.requireNonNull(messageService); + this.editingContextActionProviders = Objects.requireNonNull(editingContextActionProviders); + + // @formatter:off + this.counter = Counter.builder(Monitoring.EVENT_HANDLER) + .tag(Monitoring.NAME, this.getClass().getSimpleName()) + .register(meterRegistry); + // @formatter:on + } + + @Override + public boolean canHandle(IEditingContext editingContext, IInput input) { + return input instanceof GetEditingContextActionsInput; + } + + @Override + public void handle(One payloadSink, Many changeDescriptionSink, IEditingContext editingContext, IInput input) { + this.counter.increment(); + + String message = this.messageService.invalidInput(input.getClass().getSimpleName(), GetEditingContextActionsInput.class.getSimpleName()); + IPayload payload = new ErrorPayload(input.getId(), message); + ChangeDescription changeDescription = new ChangeDescription(ChangeKind.NOTHING, editingContext.getId(), input); + + if (input instanceof GetEditingContextActionsInput) { + GetEditingContextActionsInput editingContextActionsInput = (GetEditingContextActionsInput) input; + + // @formatter:off + List editingContextActions = this.editingContextActionProviders.stream() + .flatMap(provider -> provider.getEditingContextAction(editingContext).stream()) + .collect(Collectors.toList()); + // @formatter:on + + editingContextActions.sort((a1, a2) -> a1.getLabel().compareTo(a2.getLabel())); + + payload = new GetEditingContextActionsSuccessPayload(editingContextActionsInput.getId(), editingContextActions); + changeDescription = new ChangeDescription(ChangeKind.NOTHING, editingContext.getId(), input); + } + + payloadSink.tryEmitValue(payload); + changeDescriptionSink.tryEmitNext(changeDescription); + } +} diff --git a/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/handlers/InvokeEditingContextActionEventHandler.java b/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/handlers/InvokeEditingContextActionEventHandler.java new file mode 100644 index 0000000000..27b1d24310 --- /dev/null +++ b/backend/sirius-components-collaborative/src/main/java/org/eclipse/sirius/components/collaborative/handlers/InvokeEditingContextActionEventHandler.java @@ -0,0 +1,105 @@ +/******************************************************************************* + * Copyright (c) 2022 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.collaborative.handlers; + +import java.util.List; +import java.util.Objects; + +import org.eclipse.sirius.components.collaborative.api.ChangeDescription; +import org.eclipse.sirius.components.collaborative.api.ChangeKind; +import org.eclipse.sirius.components.collaborative.api.IEditingContextActionHandler; +import org.eclipse.sirius.components.collaborative.api.IEditingContextEventHandler; +import org.eclipse.sirius.components.collaborative.api.Monitoring; +import org.eclipse.sirius.components.collaborative.dto.InvokeEditingContextActionInput; +import org.eclipse.sirius.components.collaborative.dto.InvokeEditingContextActionSuccessPayload; +import org.eclipse.sirius.components.collaborative.messages.ICollaborativeMessageService; +import org.eclipse.sirius.components.core.api.ErrorPayload; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.core.api.IInput; +import org.eclipse.sirius.components.core.api.IPayload; +import org.eclipse.sirius.components.representations.Failure; +import org.eclipse.sirius.components.representations.IStatus; +import org.eclipse.sirius.components.representations.Success; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import io.micrometer.core.instrument.Counter; +import io.micrometer.core.instrument.MeterRegistry; +import reactor.core.publisher.Sinks.Many; +import reactor.core.publisher.Sinks.One; + +/** + * Handler used to invoke an EditingContext action. + * + * @author rpage + */ +@Service +public class InvokeEditingContextActionEventHandler implements IEditingContextEventHandler { + private final Logger logger = LoggerFactory.getLogger(InvokeEditingContextActionEventHandler.class); + + private final ICollaborativeMessageService messageService; + + private final Counter counter; + + private final List editingContextActionHandlers; + + public InvokeEditingContextActionEventHandler(List editingContextActionHandlers, ICollaborativeMessageService messageService, MeterRegistry meterRegistry) { + this.editingContextActionHandlers = Objects.requireNonNull(editingContextActionHandlers); + + this.messageService = Objects.requireNonNull(messageService); + + // @formatter:off + this.counter = Counter.builder(Monitoring.EVENT_HANDLER) + .tag(Monitoring.NAME, this.getClass().getSimpleName()) + .register(meterRegistry); + // @formatter:on + } + + @Override + public boolean canHandle(IEditingContext editingContext, IInput input) { + return input instanceof InvokeEditingContextActionInput; + } + + @Override + public void handle(One payloadSink, Many changeDescriptionSink, IEditingContext editingContext, IInput input) { + this.counter.increment(); + + String message = this.messageService.invalidInput(input.getClass().getSimpleName(), InvokeEditingContextActionInput.class.getSimpleName()); + IPayload payload = new ErrorPayload(input.getId(), message); + ChangeDescription changeDescription = new ChangeDescription(ChangeKind.NOTHING, editingContext.getId(), input); + + if (input instanceof InvokeEditingContextActionInput) { + InvokeEditingContextActionInput invokeEditingContextActionInput = (InvokeEditingContextActionInput) input; + + // @formatter:off + IStatus status = this.editingContextActionHandlers.stream() + .filter(handler -> handler.canHandle(editingContext, invokeEditingContextActionInput.getActionId())) + .findFirst() + .map(handler -> handler.handle(editingContext, invokeEditingContextActionInput.getActionId())) + .orElse(new Failure("No handler could be found for action with id " + invokeEditingContextActionInput.getActionId())); //$NON-NLS-1$ + // @formatter:on + + if (status instanceof Success) { + payload = new InvokeEditingContextActionSuccessPayload(invokeEditingContextActionInput.getId()); + changeDescription = new ChangeDescription(((Success) status).getChangeKind(), editingContext.getId(), input); + } else if (status instanceof Failure) { + this.logger.warn("The action with id {} could not be executed", invokeEditingContextActionInput.getActionId()); //$NON-NLS-1$ + new ErrorPayload(input.getId(), ((Failure) status).getMessage()); + } + } + + payloadSink.tryEmitValue(payload); + changeDescriptionSink.tryEmitNext(changeDescription); + } +} diff --git a/backend/sirius-components-collaborative/src/main/resources/schema/core.graphqls b/backend/sirius-components-collaborative/src/main/resources/schema/core.graphqls index fe8dd8e4fe..0cb09f3bd3 100644 --- a/backend/sirius-components-collaborative/src/main/resources/schema/core.graphqls +++ b/backend/sirius-components-collaborative/src/main/resources/schema/core.graphqls @@ -25,6 +25,7 @@ type EditingContext { queryBasedBoolean(query: String!): Boolean queryBasedObject(query: String!, variableName: String): Object queryBasedObjects(query: String!, variableName: String): [Object] + actions: EditingContextActionsConnection! } type Domain { @@ -87,6 +88,20 @@ type EditingContextStereotypeDescriptionEdge { node: StereotypeDescription! } +type EditingContextActionsConnection { + edges: [EditingContextActionsEdge!]! + pageInfo: PageInfo! +} + +type EditingContextActionsEdge { + node: EditingContextAction! +} + +type EditingContextAction { + id: ID! + label: String! +} + type SubscribersUpdatedEventPayload { id: ID! subscribers: [Subscriber]! @@ -146,6 +161,7 @@ type Mutation { deleteObject(input: DeleteObjectInput!): DeleteObjectPayload! renameObject(input: RenameObjectInput!): RenameObjectPayload! uploadDocument(input: UploadDocumentInput!): UploadDocumentPayload! + invokeEditingContextAction(input: InvokeEditingContextActionInput!): InvokeEditingContextActionPayload! } type Document { @@ -270,3 +286,14 @@ type WorkbenchSelectionEntry { kind: String! } +input InvokeEditingContextActionInput { + id: ID! + editingContextId: ID! + actionId: String! +} + +union InvokeEditingContextActionPayload = ErrorPayload | InvokeEditingContextActionSuccessPayload + +type InvokeEditingContextActionSuccessPayload { + id: ID! +} \ No newline at end of file diff --git a/frontend/src/onboarding/NewDocumentArea.tsx b/frontend/src/onboarding/NewDocumentArea.tsx index d144cca1ee..58d28f3199 100644 --- a/frontend/src/onboarding/NewDocumentArea.tsx +++ b/frontend/src/onboarding/NewDocumentArea.tsx @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019, 2021 Obeo. + * Copyright (c) 2019, 2022 Obeo. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 * which accompanies this distribution, and is available at @@ -15,7 +15,13 @@ import { LinkButton } from 'core/linkbutton/LinkButton'; import { Select } from 'core/select/Select'; import gql from 'graphql-tag'; import { NewDocument } from 'icons'; -import { NewDocumentAreaProps } from 'onboarding/NewDocumentArea.types'; +import { + GQLCreateDocumentMutationInput, + GQLCreateDocumentMutationVariables, + GQLInvokeEditingContextActionInput, + GQLInvokeEditingContextActionVariables, + NewDocumentAreaProps, +} from 'onboarding/NewDocumentArea.types'; import React, { useEffect, useState } from 'react'; import { v4 as uuid } from 'uuid'; import { AreaContainer } from './AreaContainer'; @@ -32,11 +38,24 @@ const createDocumentMutation = gql` } `; +const invokeEditingContextActionMutation = gql` + mutation invokeEditingContextAction($input: InvokeEditingContextActionInput!) { + invokeEditingContextAction(input: $input) { + __typename + ... on ErrorPayload { + message + } + } + } +`; + const NB_STEREOTYPES_SHOWN = 10; +const NB_EDITING_CONTEXT_ACTIONS_SHOWN = 10; export const NewDocumentArea = ({ editingContextId, stereotypeDescriptions, + editingContextActions, setSelection, readOnly, }: NewDocumentAreaProps) => { @@ -48,15 +67,16 @@ export const NewDocumentArea = ({ // Document creation const [createDocument, { loading, data, error }] = useMutation(createDocumentMutation); - const onCreateDocument = (stereotypeDescriptionId) => { + const onCreateDocument = (stereotypeDescriptionId: string) => { const selected = stereotypeDescriptions.find((candidate) => candidate.id === stereotypeDescriptionId); - const variables = { - input: { - id: uuid(), - editingContextId, - name: selected.documentName, - stereotypeDescriptionId: stereotypeDescriptionId, - }, + const input: GQLCreateDocumentMutationInput = { + id: uuid(), + editingContextId, + name: selected.documentName, + stereotypeDescriptionId, + }; + const variables: GQLCreateDocumentMutationVariables = { + input, }; createDocument({ variables }); }; @@ -73,6 +93,39 @@ export const NewDocumentArea = ({ } }, [loading, data, error, setSelection]); + // EditingContext Action invocation + const [ + invokeEditingContextAction, + { loading: loadingEditingContextAction, data: dataEditingContextAction, error: errorEditingContextAction }, + ] = useMutation(invokeEditingContextActionMutation); + const onInvokeEditingContextAction = (actionId: string) => { + const input: GQLInvokeEditingContextActionInput = { + id: uuid(), + editingContextId, + actionId, + }; + const variables: GQLInvokeEditingContextActionVariables = { + input, + }; + invokeEditingContextAction({ variables }); + }; + useEffect(() => { + if ( + !loadingEditingContextAction && + !errorEditingContextAction && + dataEditingContextAction?.invokeEditingContextAction + ) { + const { invokeEditingContextAction } = dataEditingContextAction; + if (invokeEditingContextAction.__typename === 'ErrorPayload') { + setState((prevState) => { + const newState = { ...prevState }; + newState.message = invokeEditingContextAction.message; + return newState; + }); + } + } + }, [loadingEditingContextAction, dataEditingContextAction, errorEditingContextAction, setSelection]); + // Document stereotypes list let newDocumentButtons = stereotypeDescriptions.length > 0 @@ -92,6 +145,25 @@ export const NewDocumentArea = ({ }) : []; + // EditingContext Actions list + let editingContextActionButtons = + editingContextActions.length > 0 + ? editingContextActions.slice(0, NB_EDITING_CONTEXT_ACTIONS_SHOWN).map((editingContextAction) => { + return ( + { + onInvokeEditingContextAction(editingContextAction.id); + }} + > + + + ); + }) + : []; + // More select const moreName = 'moreStereotypes'; const moreLabel = 'More model types...'; @@ -106,6 +178,24 @@ export const NewDocumentArea = ({ data-testid={moreName} /> ) : null; + + // More EditingContext actions select + const moreEditingContextActionsName = 'moreEditingContextActions'; + const moreEditingContextActionsLabel = 'More EditingContext Actions types...'; + let moreEditingContextActionsSelect = + editingContextActions.length > NB_EDITING_CONTEXT_ACTIONS_SHOWN ? ( +