Skip to content

Commit

Permalink
[1265] Handle Flexbox Container on FormDescriptionEditors
Browse files Browse the repository at this point in the history
Bug: eclipse-sirius#1265
Signed-off-by: Axel RICHARD <axel.richard@obeo.fr>
  • Loading branch information
AxelRICHARD authored and florianbarbin committed Aug 23, 2022
1 parent a982c6c commit fe2f1b7
Show file tree
Hide file tree
Showing 41 changed files with 1,764 additions and 172 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.adoc
Expand Up @@ -36,6 +36,10 @@ https://github.com/eclipse-sirius/sirius-components/issues/1231[#1231] [workbenc
- https://github.com/eclipse-sirius/sirius-components/issues/1231[#1231] [releng] Store code coverage results for the frontend packages just like backend packages
- https://github.com/eclipse-sirius/sirius-components/issues/1231[#1231] [releng] Fix every unit tests provided in the various frontend packages

=== New features

- https://github.com/eclipse-sirius/sirius-components/issues/1265[#1265] [form] Add support for flexbox containers on FormDescriptionEditors

== v2022.7.0

=== Architectural decision records
Expand Down
29 changes: 29 additions & 0 deletions frontend/src/icons/FlexboxContainer.tsx
@@ -0,0 +1,29 @@
/*******************************************************************************
* 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
*******************************************************************************/
import SvgIcon, { SvgIconProps } from '@material-ui/core/SvgIcon';
import React from 'react';

export const FlexboxContainer = (props: SvgIconProps) => {
return (
<SvgIcon
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
aria-labelledby="title"
aria-describedby="desc"
role="img"
{...props}
>
<path d="M14.67,5v14H9.33V5H14.67z M15.67,19H21V5h-5.33V19z M8.33,19V5H3v14H8.33z"></path>
</SvgIcon>
);
};
1 change: 1 addition & 0 deletions frontend/src/icons/index.ts
Expand Up @@ -15,6 +15,7 @@ export * from './Danger';
export * from './Delete';
export * from './Edit';
export * from './Exit';
export * from './FlexboxContainer';
export * from './NewDocument';
export * from './NewRepresentation';
export * from './NoIcon';
Expand Down
@@ -0,0 +1,68 @@
/*******************************************************************************
* 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.formdescriptioneditors.handlers;

import static org.assertj.core.api.Assertions.assertThat;

import java.util.UUID;

import org.eclipse.sirius.components.collaborative.api.ChangeDescription;
import org.eclipse.sirius.components.collaborative.api.ChangeKind;
import org.eclipse.sirius.components.collaborative.formdescriptioneditors.FormDescriptionEditorContext;
import org.eclipse.sirius.components.collaborative.formdescriptioneditors.TestFormDescriptionEditorBuilder;
import org.eclipse.sirius.components.collaborative.formdescriptioneditors.api.IFormDescriptionEditorContext;
import org.eclipse.sirius.components.collaborative.formdescriptioneditors.dto.DeleteWidgetInput;
import org.eclipse.sirius.components.collaborative.formdescriptioneditors.dto.DeleteWidgetSuccessPayload;
import org.eclipse.sirius.components.collaborative.formdescriptioneditors.messages.ICollaborativeFormDescriptionEditorMessageService;
import org.eclipse.sirius.components.core.api.IEditService;
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.core.api.IObjectService;
import org.eclipse.sirius.components.core.api.IPayload;
import org.junit.jupiter.api.Test;

import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
import reactor.core.publisher.Sinks;
import reactor.core.publisher.Sinks.Many;
import reactor.core.publisher.Sinks.One;

/**
* Tests of the delete widget event handler.
*
* @author arichard
*/
public class DeleteWidgetEventHandlerTests {
@Test
public void testDeleteWidget() {
var handler = new DeleteWidgetEventHandler(new IObjectService.NoOp(), new IEditService.NoOp(), new ICollaborativeFormDescriptionEditorMessageService.NoOp(), new SimpleMeterRegistry()) {
@Override
protected boolean deleteWidget(IEditingContext editingContext, IFormDescriptionEditorContext formDescriptionEditorContext, String widgetId) {
return true;
}
};
var input = new DeleteWidgetInput(UUID.randomUUID(), "editingContextId", "representationId", "widgetId"); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$

assertThat(handler.canHandle(input)).isTrue();

One<IPayload> payloadSink = Sinks.one();
Many<ChangeDescription> changeDescriptionSink = Sinks.many().unicast().onBackpressureBuffer();
IFormDescriptionEditorContext formDescriptionEditorContext = new FormDescriptionEditorContext(new TestFormDescriptionEditorBuilder().getFormDescriptionEditor(UUID.randomUUID().toString()));

handler.handle(payloadSink, changeDescriptionSink, new IEditingContext.NoOp(), formDescriptionEditorContext, input);

ChangeDescription changeDescription = changeDescriptionSink.asFlux().blockFirst();
assertThat(changeDescription.getKind()).isEqualTo(ChangeKind.SEMANTIC_CHANGE);

IPayload payload = payloadSink.asMono().block();
assertThat(payload).isInstanceOf(DeleteWidgetSuccessPayload.class);
}
}
@@ -0,0 +1,67 @@
/*******************************************************************************
* 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.formdescriptioneditors.handlers;

import static org.assertj.core.api.Assertions.assertThat;

import java.util.UUID;

import org.eclipse.sirius.components.collaborative.api.ChangeDescription;
import org.eclipse.sirius.components.collaborative.api.ChangeKind;
import org.eclipse.sirius.components.collaborative.formdescriptioneditors.FormDescriptionEditorContext;
import org.eclipse.sirius.components.collaborative.formdescriptioneditors.TestFormDescriptionEditorBuilder;
import org.eclipse.sirius.components.collaborative.formdescriptioneditors.api.IFormDescriptionEditorContext;
import org.eclipse.sirius.components.collaborative.formdescriptioneditors.dto.MoveWidgetInput;
import org.eclipse.sirius.components.collaborative.formdescriptioneditors.dto.MoveWidgetSuccessPayload;
import org.eclipse.sirius.components.collaborative.formdescriptioneditors.messages.ICollaborativeFormDescriptionEditorMessageService;
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.core.api.IObjectService;
import org.eclipse.sirius.components.core.api.IPayload;
import org.junit.jupiter.api.Test;

import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
import reactor.core.publisher.Sinks;
import reactor.core.publisher.Sinks.Many;
import reactor.core.publisher.Sinks.One;

/**
* Tests of the move widget event handler.
*
* @author arichard
*/
public class MoveWidgetEventHandlerTests {
@Test
public void testMoveWidget() {
var handler = new MoveWidgetEventHandler(new IObjectService.NoOp(), new ICollaborativeFormDescriptionEditorMessageService.NoOp(), new SimpleMeterRegistry()) {
@Override
protected boolean moveWidget(IEditingContext editingContext, IFormDescriptionEditorContext formDescriptionEditorContext, String containerId, String kind, int index) {
return true;
}
};
var input = new MoveWidgetInput(UUID.randomUUID(), "editingContextId", "representationId", "containerId", "kind", 0); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$

assertThat(handler.canHandle(input)).isTrue();

One<IPayload> payloadSink = Sinks.one();
Many<ChangeDescription> changeDescriptionSink = Sinks.many().unicast().onBackpressureBuffer();
IFormDescriptionEditorContext formDescriptionEditorContext = new FormDescriptionEditorContext(new TestFormDescriptionEditorBuilder().getFormDescriptionEditor(UUID.randomUUID().toString()));

handler.handle(payloadSink, changeDescriptionSink, new IEditingContext.NoOp(), formDescriptionEditorContext, input);

ChangeDescription changeDescription = changeDescriptionSink.asFlux().blockFirst();
assertThat(changeDescription.getKind()).isEqualTo(ChangeKind.SEMANTIC_CHANGE);

IPayload payload = payloadSink.asMono().block();
assertThat(payload).isInstanceOf(MoveWidgetSuccessPayload.class);
}
}
@@ -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.formdescriptioneditors;

/**
* Abstract class to be extended by all the widgets of the form-description-editor representation.
*
* @author arichard
*/
public class AbstractFormDescriptionEditorWidget implements IFormDescriptionEditorWidget {

protected String id;

protected String kind;

protected String label;

@Override
public String getId() {
return this.id;
}

@Override
public String getKind() {
return this.kind;
}

@Override
public String getLabel() {
return this.label;
}

}
@@ -0,0 +1,134 @@
/*******************************************************************************
* 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.formdescriptioneditors;

import java.text.MessageFormat;
import java.util.List;
import java.util.Objects;

import org.eclipse.sirius.components.annotations.Immutable;

/**
* Any widget contained in the form description editor flexbox container.
*
* @author arichard
*/
@Immutable
public final class FormDescriptionEditorFlexboxContainer extends AbstractFormDescriptionEditorWidget {

private String flexDirection;

private String flexWrap;

private int flexGrow;

private List<AbstractFormDescriptionEditorWidget> children;

private FormDescriptionEditorFlexboxContainer() {
// Prevent instantiation
}

public String getFlexDirection() {
return this.flexDirection;
}

public String getFlexWrap() {
return this.flexWrap;
}

public int getFlexGrow() {
return this.flexGrow;
}

public List<AbstractFormDescriptionEditorWidget> getChildren() {
return this.children;
}

public static Builder newFormDescriptionEditorFlexboxContainer(String id) {
return new Builder(id);
}

@Override
public String toString() {
String pattern = "{0} '{'id: {1}, kind: {2}, label: {3}, flexDirection: {4}, flexWrap: {5}, flexGrow: {6}'}'"; //$NON-NLS-1$
return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.id, this.kind, this.label, this.flexDirection, this.flexWrap, this.flexGrow);
}

/**
* The builder used to create the form description editor flexbox container.
*
* @author arichard
*/
@SuppressWarnings("checkstyle:HiddenField")
public static final class Builder {
private String id;

private String kind;

private String label;

private String flexDirection;

private String flexWrap;

private int flexGrow;

private List<AbstractFormDescriptionEditorWidget> children;

private Builder(String id) {
this.id = Objects.requireNonNull(id);
}

public Builder kind(String kind) {
this.kind = Objects.requireNonNull(kind);
return this;
}

public Builder label(String label) {
this.label = Objects.requireNonNull(label);
return this;
}

public Builder flexDirection(String flexDirection) {
this.flexDirection = Objects.requireNonNull(flexDirection);
return this;
}

public Builder flexWrap(String flexWrap) {
this.flexWrap = Objects.requireNonNull(flexWrap);
return this;
}

public Builder flexGrow(int flexGrow) {
this.flexGrow = Objects.requireNonNull(flexGrow);
return this;
}

public Builder children(List<AbstractFormDescriptionEditorWidget> children) {
this.children = Objects.requireNonNull(children);
return this;
}

public FormDescriptionEditorFlexboxContainer build() {
FormDescriptionEditorFlexboxContainer fdeFlexboxContainer = new FormDescriptionEditorFlexboxContainer();
fdeFlexboxContainer.id = Objects.requireNonNull(this.id);
fdeFlexboxContainer.kind = Objects.requireNonNull(this.kind);
fdeFlexboxContainer.label = Objects.requireNonNull(this.label);
fdeFlexboxContainer.flexDirection = Objects.requireNonNull(this.flexDirection);
fdeFlexboxContainer.flexWrap = Objects.requireNonNull(this.flexWrap);
fdeFlexboxContainer.flexGrow = Objects.requireNonNull(this.flexGrow);
fdeFlexboxContainer.children = Objects.requireNonNull(this.children);
return fdeFlexboxContainer;
}
}
}

0 comments on commit fe2f1b7

Please sign in to comment.