From 5ae6f2654707e53edbb8567a65a5daa8fa8f4e72 Mon Sep 17 00:00:00 2001 From: Laurent Fasani Date: Fri, 27 Sep 2024 16:33:26 +0200 Subject: [PATCH] [3823] Add support for table widget in form Bug: https://github.com/eclipse-sirius/sirius-web/issues/3823 Signed-off-by: Laurent Fasani --- .github/workflows/build.yml | 1 + CHANGELOG.adoc | 3 +- package-lock.json | 466 +++++++++++++++- .../src/card/DeckCard.tsx | 85 ++- .../src/card/DeckDeleteButton.tsx | 20 +- .../src/card/DeckTag.tsx | 18 +- .../src/styled/DeckCardStyledComponents.tsx | 85 --- .../package.json | 6 + .../pom.xml | 10 +- .../forms/FormEventProcessor.java | 77 ++- .../forms/FormEventProcessorFactory.java | 7 +- .../FormEventProcessorConfiguration.java | 8 +- ...ormEventProcessorFactoryConfiguration.java | 10 +- .../src/main/resources/schema/form.graphqls | 10 + .../forms/FormEventProcessorTests.java | 7 +- .../form/WidgetHasHelpTextDataFetcher.java | 1 + .../backend/sirius-components-forms/pom.xml | 10 +- .../sirius/components/forms/TableWidget.java | 123 +++++ .../components/TableWidgetComponent.java | 81 +++ .../components/TableWidgetComponentProps.java | 44 ++ .../forms/components/WidgetComponent.java | 4 + .../description/TableWidgetDescription.java | 170 ++++++ .../elements/TableWidgetElementProps.java | 144 +++++ .../renderer/FormComponentPropsValidator.java | 22 +- .../forms/renderer/FormElementFactory.java | 44 +- .../renderer/FormInstancePropsValidator.java | 20 +- .../sirius-components-forms/package.json | 6 + .../src/form/FormEventFragments.ts | 49 ++ .../src/form/FormEventFragments.types.ts | 6 + .../DateTimeWidgetPropertySection.tsx | 33 +- .../src/propertysections/PropertySection.tsx | 13 + .../TableWidgetPropertySection.tsx | 42 ++ .../package.json | 6 + packages/pom.xml | 1 + .../sirius-components-test-coverage/pom.xml | 21 +- .../DiagramFilterEventProcessorFactory.java | 17 +- .../PropertiesEventProcessorFactory.java | 11 +- .../RelatedElementsEventProcessorFactory.java | 11 +- .../RepresentationsEventProcessorFactory.java | 11 +- .../backend/sirius-web-starter/pom.xml | 14 +- .../SiriusWebStarterConfiguration.java | 1 + .../backend/sirius-web-tests/pom.xml | 10 +- .../sirius-web/backend/sirius-web/pom.xml | 11 +- .../forms/TableControllerTests.java | 296 ++++++++++ ...ableEditingContextDescriptionProvider.java | 386 +++++++++++++ .../sirius-web-application/package.json | 6 + .../frontend/sirius-web-papaya/package.json | 6 + .../frontend/sirius-web/package.json | 3 + packages/tables/backend/pom.xml | 41 ++ .../.checkstyle | 10 + .../.classpath | 50 ++ .../.project | 34 ++ .../org.eclipse.core.resources.prefs | 5 + .../.settings/org.eclipse.core.runtime.prefs | 3 + .../.settings/org.eclipse.jdt.apt.core.prefs | 2 + .../.settings/org.eclipse.jdt.core.prefs | 505 ++++++++++++++++++ .../.settings/org.eclipse.jdt.ui.prefs | 210 ++++++++ .../.settings/org.eclipse.m2e.core.prefs | 4 + .../org.springframework.ide.eclipse.prefs | 2 + .../README.adoc | 9 + .../pom.xml | 131 +++++ .../tables/TableDeserializer.java | 58 ++ .../collaborative/tables/TableEventInput.java | 25 + .../tables/TableQueryService.java | 55 ++ .../tables/TableRefreshedEventPayload.java | 31 ++ .../tables/api/ITableEventHandler.java | 35 ++ .../tables/api/ITableEventProcessor.java | 31 ++ .../collaborative/tables/api/ITableInput.java | 25 + .../tables/api/ITableQueryService.java | 36 ++ ...tiveTablesMessageServiceConfiguration.java | 35 ++ .../tables/dto/EditCheckboxCellInput.java | 29 + .../tables/dto/EditMultiSelectCellInput.java | 30 ++ .../tables/dto/EditSelectCellInput.java | 29 + .../tables/dto/EditTextfieldCellInput.java | 29 + .../EditCheckboxCellEventHandler.java | 140 +++++ .../EditMultiSelectCellEventHandler.java | 142 +++++ .../handlers/EditSelectCellEventHandler.java | 144 +++++ .../EditTextfieldCellEventHandler.java | 142 +++++ .../CollaborativeTablesMessageService.java | 39 ++ .../ICollaborativeTableMessageService.java | 23 + .../tables/messages/MessageConstants.java | 27 + ...components-collaborative-tables.properties | 16 + .../src/main/resources/schema/table.graphqls | 124 +++++ .../src/test/java/.gitkeep | 0 .../.checkstyle | 10 + .../.classpath | 57 ++ .../sirius-components-tables-graphql/.project | 34 ++ .../org.eclipse.core.resources.prefs | 6 + .../.settings/org.eclipse.core.runtime.prefs | 3 + .../.settings/org.eclipse.jdt.apt.core.prefs | 2 + .../.settings/org.eclipse.jdt.core.prefs | 505 ++++++++++++++++++ .../.settings/org.eclipse.jdt.ui.prefs | 210 ++++++++ .../.settings/org.eclipse.m2e.core.prefs | 4 + .../org.springframework.ide.eclipse.prefs | 2 + .../sirius-components-tables-graphql/pom.xml | 127 +++++ .../MutationEditCheckboxCellDataFetcher.java | 59 ++ ...utationEditMultiSelectCellDataFetcher.java | 59 ++ .../MutationEditSelectCellDataFetcher.java | 59 ++ .../MutationEditTextfieldCellDataFetcher.java | 59 ++ .../src/main/resources/.gitkeep | 0 .../src/test/java/.gitkeep | 0 .../src/test/resources/.gitkeep | 0 .../.checkstyle | 10 + .../sirius-components-tables-tests/.classpath | 50 ++ .../sirius-components-tables-tests/.project | 34 ++ .../org.eclipse.core.resources.prefs | 5 + .../.settings/org.eclipse.core.runtime.prefs | 3 + .../.settings/org.eclipse.jdt.apt.core.prefs | 2 + .../.settings/org.eclipse.jdt.core.prefs | 505 ++++++++++++++++++ .../.settings/org.eclipse.jdt.ui.prefs | 210 ++++++++ .../.settings/org.eclipse.m2e.core.prefs | 4 + ...org.springframework.ide.eclipse.boot.prefs | 2 + .../org.springframework.ide.eclipse.prefs | 2 + .../README.adoc | 12 + .../sirius-components-tables-tests/pom.xml | 130 +++++ .../tests/assertions/CheckboxCellAssert.java | 36 ++ .../assertions/MultiSelectCellAssert.java | 38 ++ .../tests/assertions/SelectCellAssert.java | 36 ++ .../tests/assertions/TablesAssertions.java | 43 ++ .../tests/assertions/TextfieldCellAssert.java | 36 ++ .../EditCheckboxCellMutationRunner.java | 61 +++ .../EditMultiSelectCellMutationRunner.java | 61 +++ .../graphql/EditSelectCellMutationRunner.java | 61 +++ .../EditTextfieldCellMutationRunner.java | 61 +++ .../tests/navigation/LineNavigator.java | 84 +++ .../tests/navigation/TableNavigator.java | 49 ++ .../src/main/resources/.gitkeep | 0 .../src/test/java/.gitkeep | 0 .../sirius-components-tables/.checkstyle | 10 + .../sirius-components-tables/.classpath | 58 ++ .../backend/sirius-components-tables/.project | 34 ++ .../org.eclipse.core.resources.prefs | 6 + .../.settings/org.eclipse.core.runtime.prefs | 3 + .../.settings/org.eclipse.jdt.apt.core.prefs | 2 + .../.settings/org.eclipse.jdt.core.prefs | 505 ++++++++++++++++++ .../.settings/org.eclipse.jdt.ui.prefs | 210 ++++++++ .../.settings/org.eclipse.m2e.core.prefs | 4 + .../org.springframework.ide.eclipse.prefs | 2 + .../sirius-components-tables/README.adoc | 9 + .../backend/sirius-components-tables/pom.xml | 117 ++++ .../components/tables/AbstractCell.java | 47 ++ .../components/tables/CheckboxCell.java | 100 ++++ .../sirius/components/tables/Column.java | 135 +++++ .../sirius/components/tables/Line.java | 133 +++++ .../components/tables/MultiSelectCell.java | 116 ++++ .../sirius/components/tables/SelectCell.java | 116 ++++ .../components/tables/SelectCellOption.java | 80 +++ .../sirius/components/tables/Table.java | 182 +++++++ .../components/tables/TextfieldCell.java | 100 ++++ .../components/CheckboxCellComponent.java | 53 ++ .../CheckboxCellComponentProps.java | 36 ++ .../tables/components/ColumnComponent.java | 78 +++ .../components/ColumnComponentProps.java | 61 +++ .../tables/components/ILinesRequestor.java | 26 + .../components/ITableElementRequestor.java | 36 ++ .../tables/components/LineComponent.java | 143 +++++ .../tables/components/LineComponentProps.java | 74 +++ .../tables/components/LinesRequestor.java | 42 ++ .../components/MultiSelectCellComponent.java | 77 +++ .../MultiSelectCellComponentProps.java | 36 ++ .../components/SelectCellComponent.java | 74 +++ .../components/SelectCellComponentProps.java | 36 ++ .../tables/components/TableComponent.java | 88 +++ .../components/TableComponentProps.java | 55 ++ .../components/TableElementRequestor.java | 60 +++ .../components/TextfieldCellComponent.java | 52 ++ .../TextfieldCellComponentProps.java | 36 ++ .../tables/descriptions/CellDescription.java | 185 +++++++ .../descriptions/ColumnDescription.java | 135 +++++ .../tables/descriptions/LineDescription.java | 110 ++++ .../tables/descriptions/TableDescription.java | 157 ++++++ .../elements/CheckboxCellElementProps.java | 36 ++ .../tables/elements/ColumnElementProps.java | 87 +++ .../tables/elements/LineElementProps.java | 94 ++++ .../elements/MultiSelectCellElementProps.java | 39 ++ .../elements/SelectCellElementProps.java | 41 ++ .../tables/elements/TableElementProps.java | 99 ++++ .../elements/TextfieldCellElementProps.java | 36 ++ .../components/tables/events/ITableEvent.java | 22 + .../TableComponentPropsValidator.java | 63 +++ .../tables/renderer/TableElementFactory.java | 145 +++++ .../renderer/TableInstancePropsValidator.java | 56 ++ .../tables/renderer/TableRenderer.java | 40 ++ .../tables/renderer/TableRenderingCache.java | 37 ++ .../src/main/resources/.gitkeep | 0 .../src/test/java/.gitkeep | 0 .../sirius-components-tables/.prettierrc | 22 + .../sirius-components-tables/package.json | 64 +++ .../src/TableContent.tsx | 174 ++++++ .../src/TableContent.types.ts | 90 ++++ .../src/exportHelper.ts | 33 ++ .../sirius-components-tables/src/index.ts | 14 + .../src/useEditableCheckboxCell.tsx | 96 ++++ .../src/useEditableCheckboxCell.types.ts | 32 ++ .../src/useEditableMultiSelectCell.tsx | 129 +++++ .../src/useEditableMultiSelectCell.types.ts | 31 ++ .../src/useEditableSelectCell.tsx | 116 ++++ .../src/useEditableSelectCell.types.ts | 32 ++ .../src/useEditableTextfieldCell.tsx | 99 ++++ .../src/useEditableTextfieldCell.types.ts | 32 ++ .../sirius-components-tables/tsconfig.json | 10 + .../sirius-components-tables/vite.config.js | 20 + scripts/check-coverage.jsh | 3 + vscode-extension/package.json | 3 + 204 files changed, 12645 insertions(+), 187 deletions(-) delete mode 100644 packages/deck/frontend/sirius-components-deck/src/styled/DeckCardStyledComponents.tsx create mode 100644 packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/TableWidget.java create mode 100644 packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/TableWidgetComponent.java create mode 100644 packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/TableWidgetComponentProps.java create mode 100644 packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/description/TableWidgetDescription.java create mode 100644 packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/elements/TableWidgetElementProps.java create mode 100644 packages/forms/frontend/sirius-components-forms/src/propertysections/TableWidgetPropertySection.tsx create mode 100644 packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/application/controllers/forms/TableControllerTests.java create mode 100644 packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/services/forms/FormWithTableEditingContextDescriptionProvider.java create mode 100644 packages/tables/backend/pom.xml create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/.checkstyle create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/.classpath create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/.project create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.core.resources.prefs create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.core.runtime.prefs create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.apt.core.prefs create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.core.prefs create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.ui.prefs create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.m2e.core.prefs create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/.settings/org.springframework.ide.eclipse.prefs create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/README.adoc create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/pom.xml create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/java/org/eclipse/sirius/components/collaborative/tables/TableDeserializer.java create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/java/org/eclipse/sirius/components/collaborative/tables/TableEventInput.java create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/java/org/eclipse/sirius/components/collaborative/tables/TableQueryService.java create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/java/org/eclipse/sirius/components/collaborative/tables/TableRefreshedEventPayload.java create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/java/org/eclipse/sirius/components/collaborative/tables/api/ITableEventHandler.java create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/java/org/eclipse/sirius/components/collaborative/tables/api/ITableEventProcessor.java create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/java/org/eclipse/sirius/components/collaborative/tables/api/ITableInput.java create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/java/org/eclipse/sirius/components/collaborative/tables/api/ITableQueryService.java create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/java/org/eclipse/sirius/components/collaborative/tables/configuration/CollaborativeTablesMessageServiceConfiguration.java create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/java/org/eclipse/sirius/components/collaborative/tables/dto/EditCheckboxCellInput.java create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/java/org/eclipse/sirius/components/collaborative/tables/dto/EditMultiSelectCellInput.java create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/java/org/eclipse/sirius/components/collaborative/tables/dto/EditSelectCellInput.java create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/java/org/eclipse/sirius/components/collaborative/tables/dto/EditTextfieldCellInput.java create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/java/org/eclipse/sirius/components/collaborative/tables/handlers/EditCheckboxCellEventHandler.java create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/java/org/eclipse/sirius/components/collaborative/tables/handlers/EditMultiSelectCellEventHandler.java create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/java/org/eclipse/sirius/components/collaborative/tables/handlers/EditSelectCellEventHandler.java create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/java/org/eclipse/sirius/components/collaborative/tables/handlers/EditTextfieldCellEventHandler.java create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/java/org/eclipse/sirius/components/collaborative/tables/messages/CollaborativeTablesMessageService.java create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/java/org/eclipse/sirius/components/collaborative/tables/messages/ICollaborativeTableMessageService.java create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/java/org/eclipse/sirius/components/collaborative/tables/messages/MessageConstants.java create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/resources/messages/sirius-components-collaborative-tables.properties create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/main/resources/schema/table.graphqls create mode 100644 packages/tables/backend/sirius-components-collaborative-tables/src/test/java/.gitkeep create mode 100644 packages/tables/backend/sirius-components-tables-graphql/.checkstyle create mode 100644 packages/tables/backend/sirius-components-tables-graphql/.classpath create mode 100644 packages/tables/backend/sirius-components-tables-graphql/.project create mode 100644 packages/tables/backend/sirius-components-tables-graphql/.settings/org.eclipse.core.resources.prefs create mode 100644 packages/tables/backend/sirius-components-tables-graphql/.settings/org.eclipse.core.runtime.prefs create mode 100644 packages/tables/backend/sirius-components-tables-graphql/.settings/org.eclipse.jdt.apt.core.prefs create mode 100644 packages/tables/backend/sirius-components-tables-graphql/.settings/org.eclipse.jdt.core.prefs create mode 100644 packages/tables/backend/sirius-components-tables-graphql/.settings/org.eclipse.jdt.ui.prefs create mode 100644 packages/tables/backend/sirius-components-tables-graphql/.settings/org.eclipse.m2e.core.prefs create mode 100644 packages/tables/backend/sirius-components-tables-graphql/.settings/org.springframework.ide.eclipse.prefs create mode 100644 packages/tables/backend/sirius-components-tables-graphql/pom.xml create mode 100644 packages/tables/backend/sirius-components-tables-graphql/src/main/java/org/eclipse/sirius/components/tables/graphql/datafetchers/mutation/MutationEditCheckboxCellDataFetcher.java create mode 100644 packages/tables/backend/sirius-components-tables-graphql/src/main/java/org/eclipse/sirius/components/tables/graphql/datafetchers/mutation/MutationEditMultiSelectCellDataFetcher.java create mode 100644 packages/tables/backend/sirius-components-tables-graphql/src/main/java/org/eclipse/sirius/components/tables/graphql/datafetchers/mutation/MutationEditSelectCellDataFetcher.java create mode 100644 packages/tables/backend/sirius-components-tables-graphql/src/main/java/org/eclipse/sirius/components/tables/graphql/datafetchers/mutation/MutationEditTextfieldCellDataFetcher.java create mode 100644 packages/tables/backend/sirius-components-tables-graphql/src/main/resources/.gitkeep create mode 100644 packages/tables/backend/sirius-components-tables-graphql/src/test/java/.gitkeep create mode 100644 packages/tables/backend/sirius-components-tables-graphql/src/test/resources/.gitkeep create mode 100644 packages/tables/backend/sirius-components-tables-tests/.checkstyle create mode 100644 packages/tables/backend/sirius-components-tables-tests/.classpath create mode 100644 packages/tables/backend/sirius-components-tables-tests/.project create mode 100644 packages/tables/backend/sirius-components-tables-tests/.settings/org.eclipse.core.resources.prefs create mode 100644 packages/tables/backend/sirius-components-tables-tests/.settings/org.eclipse.core.runtime.prefs create mode 100644 packages/tables/backend/sirius-components-tables-tests/.settings/org.eclipse.jdt.apt.core.prefs create mode 100644 packages/tables/backend/sirius-components-tables-tests/.settings/org.eclipse.jdt.core.prefs create mode 100644 packages/tables/backend/sirius-components-tables-tests/.settings/org.eclipse.jdt.ui.prefs create mode 100644 packages/tables/backend/sirius-components-tables-tests/.settings/org.eclipse.m2e.core.prefs create mode 100644 packages/tables/backend/sirius-components-tables-tests/.settings/org.springframework.ide.eclipse.boot.prefs create mode 100644 packages/tables/backend/sirius-components-tables-tests/.settings/org.springframework.ide.eclipse.prefs create mode 100644 packages/tables/backend/sirius-components-tables-tests/README.adoc create mode 100644 packages/tables/backend/sirius-components-tables-tests/pom.xml create mode 100644 packages/tables/backend/sirius-components-tables-tests/src/main/java/org/eclipse/sirius/components/tables/tests/assertions/CheckboxCellAssert.java create mode 100644 packages/tables/backend/sirius-components-tables-tests/src/main/java/org/eclipse/sirius/components/tables/tests/assertions/MultiSelectCellAssert.java create mode 100644 packages/tables/backend/sirius-components-tables-tests/src/main/java/org/eclipse/sirius/components/tables/tests/assertions/SelectCellAssert.java create mode 100644 packages/tables/backend/sirius-components-tables-tests/src/main/java/org/eclipse/sirius/components/tables/tests/assertions/TablesAssertions.java create mode 100644 packages/tables/backend/sirius-components-tables-tests/src/main/java/org/eclipse/sirius/components/tables/tests/assertions/TextfieldCellAssert.java create mode 100644 packages/tables/backend/sirius-components-tables-tests/src/main/java/org/eclipse/sirius/components/tables/tests/graphql/EditCheckboxCellMutationRunner.java create mode 100644 packages/tables/backend/sirius-components-tables-tests/src/main/java/org/eclipse/sirius/components/tables/tests/graphql/EditMultiSelectCellMutationRunner.java create mode 100644 packages/tables/backend/sirius-components-tables-tests/src/main/java/org/eclipse/sirius/components/tables/tests/graphql/EditSelectCellMutationRunner.java create mode 100644 packages/tables/backend/sirius-components-tables-tests/src/main/java/org/eclipse/sirius/components/tables/tests/graphql/EditTextfieldCellMutationRunner.java create mode 100644 packages/tables/backend/sirius-components-tables-tests/src/main/java/org/eclipse/sirius/components/tables/tests/navigation/LineNavigator.java create mode 100644 packages/tables/backend/sirius-components-tables-tests/src/main/java/org/eclipse/sirius/components/tables/tests/navigation/TableNavigator.java create mode 100644 packages/tables/backend/sirius-components-tables-tests/src/main/resources/.gitkeep create mode 100644 packages/tables/backend/sirius-components-tables-tests/src/test/java/.gitkeep create mode 100644 packages/tables/backend/sirius-components-tables/.checkstyle create mode 100644 packages/tables/backend/sirius-components-tables/.classpath create mode 100644 packages/tables/backend/sirius-components-tables/.project create mode 100644 packages/tables/backend/sirius-components-tables/.settings/org.eclipse.core.resources.prefs create mode 100644 packages/tables/backend/sirius-components-tables/.settings/org.eclipse.core.runtime.prefs create mode 100644 packages/tables/backend/sirius-components-tables/.settings/org.eclipse.jdt.apt.core.prefs create mode 100644 packages/tables/backend/sirius-components-tables/.settings/org.eclipse.jdt.core.prefs create mode 100644 packages/tables/backend/sirius-components-tables/.settings/org.eclipse.jdt.ui.prefs create mode 100644 packages/tables/backend/sirius-components-tables/.settings/org.eclipse.m2e.core.prefs create mode 100644 packages/tables/backend/sirius-components-tables/.settings/org.springframework.ide.eclipse.prefs create mode 100644 packages/tables/backend/sirius-components-tables/README.adoc create mode 100644 packages/tables/backend/sirius-components-tables/pom.xml create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/AbstractCell.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/CheckboxCell.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/Column.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/Line.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/MultiSelectCell.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/SelectCell.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/SelectCellOption.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/Table.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/TextfieldCell.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/CheckboxCellComponent.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/CheckboxCellComponentProps.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/ColumnComponent.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/ColumnComponentProps.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/ILinesRequestor.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/ITableElementRequestor.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/LineComponent.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/LineComponentProps.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/LinesRequestor.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/MultiSelectCellComponent.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/MultiSelectCellComponentProps.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/SelectCellComponent.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/SelectCellComponentProps.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/TableComponent.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/TableComponentProps.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/TableElementRequestor.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/TextfieldCellComponent.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/TextfieldCellComponentProps.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/descriptions/CellDescription.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/descriptions/ColumnDescription.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/descriptions/LineDescription.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/descriptions/TableDescription.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/elements/CheckboxCellElementProps.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/elements/ColumnElementProps.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/elements/LineElementProps.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/elements/MultiSelectCellElementProps.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/elements/SelectCellElementProps.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/elements/TableElementProps.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/elements/TextfieldCellElementProps.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/events/ITableEvent.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/renderer/TableComponentPropsValidator.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/renderer/TableElementFactory.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/renderer/TableInstancePropsValidator.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/renderer/TableRenderer.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/renderer/TableRenderingCache.java create mode 100644 packages/tables/backend/sirius-components-tables/src/main/resources/.gitkeep create mode 100644 packages/tables/backend/sirius-components-tables/src/test/java/.gitkeep create mode 100644 packages/tables/frontend/sirius-components-tables/.prettierrc create mode 100644 packages/tables/frontend/sirius-components-tables/package.json create mode 100644 packages/tables/frontend/sirius-components-tables/src/TableContent.tsx create mode 100644 packages/tables/frontend/sirius-components-tables/src/TableContent.types.ts create mode 100644 packages/tables/frontend/sirius-components-tables/src/exportHelper.ts create mode 100644 packages/tables/frontend/sirius-components-tables/src/index.ts create mode 100644 packages/tables/frontend/sirius-components-tables/src/useEditableCheckboxCell.tsx create mode 100644 packages/tables/frontend/sirius-components-tables/src/useEditableCheckboxCell.types.ts create mode 100644 packages/tables/frontend/sirius-components-tables/src/useEditableMultiSelectCell.tsx create mode 100644 packages/tables/frontend/sirius-components-tables/src/useEditableMultiSelectCell.types.ts create mode 100644 packages/tables/frontend/sirius-components-tables/src/useEditableSelectCell.tsx create mode 100644 packages/tables/frontend/sirius-components-tables/src/useEditableSelectCell.types.ts create mode 100644 packages/tables/frontend/sirius-components-tables/src/useEditableTextfieldCell.tsx create mode 100644 packages/tables/frontend/sirius-components-tables/src/useEditableTextfieldCell.types.ts create mode 100644 packages/tables/frontend/sirius-components-tables/tsconfig.json create mode 100644 packages/tables/frontend/sirius-components-tables/vite.config.js diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4f8731d6f3..43083a0d47 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -101,6 +101,7 @@ jobs: npx yalc add @eclipse-sirius/sirius-components-portals npx yalc add @eclipse-sirius/sirius-components-widget-reference npx yalc add @eclipse-sirius/sirius-components-selection + npx yalc add @eclipse-sirius/sirius-components-tables npx yalc add @eclipse-sirius/sirius-components-trees npx yalc add @eclipse-sirius/sirius-components-validation npx yalc add @eclipse-sirius/sirius-web-application diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 916362ec3b..d2f38a28d8 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -46,6 +46,7 @@ This allows an error to be displayed when there is a problem during uploading - https://github.com/eclipse-sirius/sirius-web/issues/3846[#3846] [core] Migrate the frontend to `react 18.3.1`, `react-dom 18.3.1`, `react-router-dom 6.26.0`, `@xstate/react: 3.0.0` and `@ObeoNetwork/gantt-task-react 0.6.0` - https://github.com/eclipse-sirius/sirius-web/issues/3840[#3840] [diagram] Migrate to ReactFlow 12 - [releng] Switch to the final release version of AQL 8.0.2 +- https://github.com/eclipse-sirius/sirius-web/issues/3823[#3823] [table] Add a dependency to `material-react-table "2.13.3"` and `export-to-csv "1.3.0"` === Bug fixes @@ -79,7 +80,7 @@ description (optional). - https://github.com/eclipse-sirius/sirius-web/issues/3873[#3873] [diagram] Make the Selection Dialog available for the EdgeTool - https://github.com/eclipse-sirius/sirius-web/issues/3950[#3950] [diagram] Have the multiple selection on the Selection Dialog - https://github.com/eclipse-sirius/sirius-web/issues/3982[#3982] [core] Add support for the command palette. - +- https://github.com/eclipse-sirius/sirius-web/issues/3823[#3823] [form][table] Add table widget in form. === Improvements diff --git a/package-lock.json b/package-lock.json index 4303b3765d..9d7734bc85 100644 --- a/package-lock.json +++ b/package-lock.json @@ -426,6 +426,14 @@ "resolved": "packages/tools/frontend/sirius-components-specification-layout", "link": true }, + "node_modules/@eclipse-sirius/sirius-components-tables": { + "resolved": "packages/tables/frontend/sirius-components-tables", + "link": true + }, + "node_modules/@eclipse-sirius/sirius-components-tables": { + "resolved": "packages/tables/frontend/sirius-components-tables", + "link": true + }, "node_modules/@eclipse-sirius/sirius-components-trees": { "resolved": "packages/trees/frontend/sirius-components-trees", "link": true @@ -494,7 +502,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", - "devOptional": true, "peer": true, "dependencies": { "@emotion/memoize": "^0.9.0" @@ -550,7 +557,6 @@ "version": "11.13.0", "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", - "devOptional": true, "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", @@ -1683,6 +1689,178 @@ } } }, + "node_modules/@mui/x-date-pickers": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.19.0.tgz", + "integrity": "sha512-OIQ+IxgL2Si7DP68sw1ImcHXZtAmklHcyo/oqP4HuJZ2lVnP5sJkoXrksfumL1wjWKJkecONFz3unAqViKXzCQ==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.25.6", + "@mui/utils": "^5.16.6", + "@mui/x-internals": "7.18.0", + "@types/react-transition-group": "^4.4.11", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^5.15.14 || ^6.0.0", + "@mui/system": "^5.15.14 || ^6.0.0", + "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", + "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0", + "dayjs": "^1.10.7", + "luxon": "^3.0.2", + "moment": "^2.29.4", + "moment-hijri": "^2.1.2", + "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "date-fns": { + "optional": true + }, + "date-fns-jalali": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + }, + "moment-hijri": { + "optional": true + }, + "moment-jalaali": { + "optional": true + } + } + }, + "node_modules/@mui/x-internals": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.18.0.tgz", + "integrity": "sha512-lzCHOWIR0cAIY1bGrWSprYerahbnH5C31ql/2OWCEjcngL2NAV1M6oKI2Vp4HheqzJ822c60UyWyapvyjSzY/A==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.25.6", + "@mui/utils": "^5.16.6" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@mui/x-date-pickers": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.19.0.tgz", + "integrity": "sha512-OIQ+IxgL2Si7DP68sw1ImcHXZtAmklHcyo/oqP4HuJZ2lVnP5sJkoXrksfumL1wjWKJkecONFz3unAqViKXzCQ==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.25.6", + "@mui/utils": "^5.16.6", + "@mui/x-internals": "7.18.0", + "@types/react-transition-group": "^4.4.11", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^5.15.14 || ^6.0.0", + "@mui/system": "^5.15.14 || ^6.0.0", + "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", + "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0", + "dayjs": "^1.10.7", + "luxon": "^3.0.2", + "moment": "^2.29.4", + "moment-hijri": "^2.1.2", + "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "date-fns": { + "optional": true + }, + "date-fns-jalali": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + }, + "moment-hijri": { + "optional": true + }, + "moment-jalaali": { + "optional": true + } + } + }, + "node_modules/@mui/x-internals": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.18.0.tgz", + "integrity": "sha512-lzCHOWIR0cAIY1bGrWSprYerahbnH5C31ql/2OWCEjcngL2NAV1M6oKI2Vp4HheqzJ822c60UyWyapvyjSzY/A==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.25.6", + "@mui/utils": "^5.16.6" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + } + }, "node_modules/@mui/x-tree-view": { "version": "7.6.1", "resolved": "https://registry.npmjs.org/@mui/x-tree-view/-/x-tree-view-7.6.1.tgz", @@ -2001,6 +2179,77 @@ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, + "node_modules/@tanstack/match-sorter-utils": { + "version": "8.19.4", + "resolved": "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.19.4.tgz", + "integrity": "sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==", + "dependencies": { + "remove-accents": "0.5.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-table": { + "version": "8.20.5", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.5.tgz", + "integrity": "sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==", + "dependencies": { + "@tanstack/table-core": "8.20.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@tanstack/react-virtual": { + "version": "3.10.6", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.6.tgz", + "integrity": "sha512-xaSy6uUxB92O8mngHZ6CvbhGuqxQ5lIZWCBy+FjhrbHmOwc6BnOnKkYm2FsB1/BpKw/+FVctlMbEtI+F6I1aJg==", + "dependencies": { + "@tanstack/virtual-core": "3.10.6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.20.5", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.20.5.tgz", + "integrity": "sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.10.6", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.10.6.tgz", + "integrity": "sha512-1giLc4dzgEKLMx5pgKjL6HlG5fjZMgCjzlKAlpr7yoUtetVPELgER1NtephAI910nMwfPTHNyWKSFmJdHkz2Cw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@testing-library/dom": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", @@ -4473,6 +4722,14 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/export-to-csv": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/export-to-csv/-/export-to-csv-1.3.0.tgz", + "integrity": "sha512-msPjbfozZdYzDghAEKmCVH5veMeKHNacplE6noXvGiA8AeV1qa/SOxp6JXDjF9R8Kf6v3ypI6jskiY19dkhZeA==", + "engines": { + "node": "^v12.20.0 || >=v14.13.0" + } + }, "node_modules/fast-equals": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", @@ -4755,6 +5012,15 @@ "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.5.tgz", "integrity": "sha512-G7HLD+WKcrOyJP5VQwYZNC3Z6FcQ7YYjEFiFoIj8PfEr73mu421o8B1N5DKUcc8K37EsJ2XXWA8DtrDz/2dReg==" }, + "node_modules/highlight-words": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/highlight-words/-/highlight-words-1.2.2.tgz", + "integrity": "sha512-Mf4xfPXYm8Ay1wTibCrHpNWeR2nUMynMVFkXCi4mbl+TEgmNOe+I4hV7W3OCZcSvzGL6kupaqpfHOemliMTGxQ==", + "engines": { + "node": ">= 16", + "npm": ">= 8" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -5620,6 +5886,33 @@ "node": ">=10" } }, + "node_modules/material-react-table": { + "version": "2.13.3", + "resolved": "https://registry.npmjs.org/material-react-table/-/material-react-table-2.13.3.tgz", + "integrity": "sha512-xeyAEG6UYG3qgBIo17epAP5zsWT1pH0uCEkaUxvhki9sGcP35OqfOMSZJNhISvmqEqXKYHdqKbZI6iOwsg1sYA==", + "dependencies": { + "@tanstack/match-sorter-utils": "8.19.4", + "@tanstack/react-table": "8.20.5", + "@tanstack/react-virtual": "3.10.6", + "highlight-words": "1.2.2" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kevinvandy" + }, + "peerDependencies": { + "@emotion/react": ">=11.11", + "@emotion/styled": ">=11.11", + "@mui/icons-material": ">=5.11", + "@mui/material": ">=5.13", + "@mui/x-date-pickers": ">=6.15.0", + "react": ">=17.0", + "react-dom": ">=17.0" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -6450,6 +6743,11 @@ } } }, + "node_modules/remove-accents": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", + "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==" + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -7985,6 +8283,7 @@ "@apollo/client": "3.10.4", "@eclipse-sirius/sirius-components-charts": "*", "@eclipse-sirius/sirius-components-core": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-tsconfig": "*", "@lexical/react": "0.8.1", "@mui/icons-material": "5.15.19", @@ -8013,6 +8312,7 @@ "@apollo/client": "3.10.4", "@eclipse-sirius/sirius-components-charts": "*", "@eclipse-sirius/sirius-components-core": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@lexical/react": "0.8.1", "@mui/icons-material": "5.15.19", "@mui/material": "5.15.19", @@ -8217,6 +8517,7 @@ "@eclipse-sirius/sirius-components-omnibox": "*", "@eclipse-sirius/sirius-components-portals": "*", "@eclipse-sirius/sirius-components-selection": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-trees": "*", "@eclipse-sirius/sirius-components-validation": "*", "@eclipse-sirius/sirius-components-widget-reference": "*", @@ -8230,9 +8531,11 @@ "@xyflow/react": "12.2.1", "d3": "7.0.0", "elkjs": "0.8.2", + "export-to-csv": "1.3.0", "fontsource-roboto": "4.0.0", "graphql": "16.8.1", "html-to-image": "1.11.11", + "material-react-table": "2.13.3", "notistack": "3.0.1", "pathfinding": "0.4.18", "prop-types": "15.8.1", @@ -8275,6 +8578,7 @@ "@eclipse-sirius/sirius-components-gantt": "*", "@eclipse-sirius/sirius-components-omnibox": "*", "@eclipse-sirius/sirius-components-portals": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-trees": "*", "@eclipse-sirius/sirius-components-tsconfig": "*", "@eclipse-sirius/sirius-components-validation": "*", @@ -8282,6 +8586,7 @@ "@types/react": "18.3.3", "@vitejs/plugin-react": "4.3.0", "@xstate/react": "3.0.0", + "export-to-csv": "1.3.0", "graphql": "16.8.1", "jest-junit-reporter": "1.1.0", "prettier": "2.7.1", @@ -8305,6 +8610,7 @@ "@eclipse-sirius/sirius-components-omnibox": "*", "@eclipse-sirius/sirius-components-portals": "*", "@eclipse-sirius/sirius-components-selection": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-trees": "*", "@eclipse-sirius/sirius-components-validation": "*", "@eclipse-sirius/sirius-components-widget-reference": "*", @@ -8312,7 +8618,9 @@ "@mui/material": "5.15.19", "@xstate/react": "3.0.0", "@xyflow/react": "12.2.1", + "export-to-csv": "1.3.0", "graphql": "16.8.1", + "material-react-table": "2.13.3", "notistack": "3.0.1", "react": "18.3.1", "react-dom": "18.3.1", @@ -8381,6 +8689,43 @@ "xstate": "4.32.1" } }, + "packages/tables/frontend/sirius-components-tables": { + "version": "2024.9.8", + "license": "EPL-2.0", + "devDependencies": { + "@apollo/client": "3.10.4", + "@eclipse-sirius/sirius-components-core": "*", + "@eclipse-sirius/sirius-components-tsconfig": "*", + "@mui/icons-material": "5.15.19", + "@mui/material": "5.15.19", + "@types/react": "18.3.3", + "@vitejs/plugin-react": "4.3.0", + "@vitest/coverage-v8": "1.6.0", + "export-to-csv": "1.3.0", + "graphql": "16.8.1", + "jsdom": "16.7.0", + "material-react-table": "2.13.3", + "prettier": "2.7.1", + "react": "18.3.1", + "react-dom": "18.3.1", + "rollup-plugin-peer-deps-external": "2.2.4", + "tss-react": "4.9.7", + "typescript": "5.4.5", + "vite": "5.2.11" + }, + "peerDependencies": { + "@apollo/client": "3.10.4", + "@eclipse-sirius/sirius-components-core": "*", + "@mui/icons-material": "5.15.19", + "@mui/material": "5.15.19", + "export-to-csv": "1.3.0", + "graphql": "16.8.1", + "material-react-table": "2.13.3", + "react": "18.3.1", + "react-dom": "18.3.1", + "tss-react": "4.9.7" + } + }, "packages/tools/frontend/sirius-components-specification-layout": { "name": "@eclipse-sirius/sirius-components-specification-layout", "version": "2024.9.8", @@ -8907,6 +9252,7 @@ "@apollo/client": "3.10.4", "@eclipse-sirius/sirius-components-charts": "*", "@eclipse-sirius/sirius-components-core": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-tsconfig": "*", "@lexical/react": "0.8.1", "@mui/icons-material": "5.15.19", @@ -9040,6 +9386,30 @@ "vite": "5.2.11" } }, + "@eclipse-sirius/sirius-components-tables": { + "version": "file:packages/tables/frontend/sirius-components-tables", + "requires": { + "@apollo/client": "3.10.4", + "@eclipse-sirius/sirius-components-core": "*", + "@eclipse-sirius/sirius-components-tsconfig": "*", + "@mui/icons-material": "5.15.19", + "@mui/material": "5.15.19", + "@types/react": "18.3.3", + "@vitejs/plugin-react": "4.3.0", + "@vitest/coverage-v8": "1.6.0", + "export-to-csv": "1.3.0", + "graphql": "16.8.1", + "jsdom": "16.7.0", + "material-react-table": "2.13.3", + "prettier": "2.7.1", + "react": "18.3.1", + "react-dom": "18.3.1", + "rollup-plugin-peer-deps-external": "2.2.4", + "tss-react": "4.9.7", + "typescript": "5.4.5", + "vite": "5.2.11" + } + }, "@eclipse-sirius/sirius-components-trees": { "version": "file:packages/trees/frontend/sirius-components-trees", "requires": { @@ -9134,6 +9504,7 @@ "@eclipse-sirius/sirius-components-omnibox": "*", "@eclipse-sirius/sirius-components-portals": "*", "@eclipse-sirius/sirius-components-selection": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-trees": "*", "@eclipse-sirius/sirius-components-validation": "*", "@eclipse-sirius/sirius-components-widget-reference": "*", @@ -9157,10 +9528,12 @@ "@xyflow/react": "12.2.1", "d3": "7.0.0", "elkjs": "0.8.2", + "export-to-csv": "1.3.0", "fontsource-roboto": "4.0.0", "graphql": "16.8.1", "html-to-image": "1.11.11", "jest-junit-reporter": "1.1.0", + "material-react-table": "2.13.3", "notistack": "3.0.1", "pathfinding": "0.4.18", "prettier": "2.7.1", @@ -9188,6 +9561,7 @@ "@eclipse-sirius/sirius-components-gantt": "*", "@eclipse-sirius/sirius-components-omnibox": "*", "@eclipse-sirius/sirius-components-portals": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-trees": "*", "@eclipse-sirius/sirius-components-tsconfig": "*", "@eclipse-sirius/sirius-components-validation": "*", @@ -9195,6 +9569,7 @@ "@types/react": "18.3.3", "@vitejs/plugin-react": "4.3.0", "@xstate/react": "3.0.0", + "export-to-csv": "1.3.0", "graphql": "16.8.1", "jest-junit-reporter": "1.1.0", "prettier": "2.7.1", @@ -9281,7 +9656,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", - "devOptional": true, "peer": true, "requires": { "@emotion/memoize": "^0.9.0" @@ -9329,7 +9703,6 @@ "version": "11.13.0", "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", - "devOptional": true, "peer": true, "requires": { "@babel/runtime": "^7.18.3", @@ -9987,6 +10360,31 @@ "react-is": "^18.3.1" } }, + "@mui/x-date-pickers": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.19.0.tgz", + "integrity": "sha512-OIQ+IxgL2Si7DP68sw1ImcHXZtAmklHcyo/oqP4HuJZ2lVnP5sJkoXrksfumL1wjWKJkecONFz3unAqViKXzCQ==", + "peer": true, + "requires": { + "@babel/runtime": "^7.25.6", + "@mui/utils": "^5.16.6", + "@mui/x-internals": "7.18.0", + "@types/react-transition-group": "^4.4.11", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + } + }, + "@mui/x-internals": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.18.0.tgz", + "integrity": "sha512-lzCHOWIR0cAIY1bGrWSprYerahbnH5C31ql/2OWCEjcngL2NAV1M6oKI2Vp4HheqzJ822c60UyWyapvyjSzY/A==", + "peer": true, + "requires": { + "@babel/runtime": "^7.25.6", + "@mui/utils": "^5.16.6" + } + }, "@mui/x-tree-view": { "version": "7.6.1", "resolved": "https://registry.npmjs.org/@mui/x-tree-view/-/x-tree-view-7.6.1.tgz", @@ -10170,6 +10568,40 @@ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, + "@tanstack/match-sorter-utils": { + "version": "8.19.4", + "resolved": "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.19.4.tgz", + "integrity": "sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==", + "requires": { + "remove-accents": "0.5.0" + } + }, + "@tanstack/react-table": { + "version": "8.20.5", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.20.5.tgz", + "integrity": "sha512-WEHopKw3znbUZ61s9i0+i9g8drmDo6asTWbrQh8Us63DAk/M0FkmIqERew6P71HI75ksZ2Pxyuf4vvKh9rAkiA==", + "requires": { + "@tanstack/table-core": "8.20.5" + } + }, + "@tanstack/react-virtual": { + "version": "3.10.6", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.10.6.tgz", + "integrity": "sha512-xaSy6uUxB92O8mngHZ6CvbhGuqxQ5lIZWCBy+FjhrbHmOwc6BnOnKkYm2FsB1/BpKw/+FVctlMbEtI+F6I1aJg==", + "requires": { + "@tanstack/virtual-core": "3.10.6" + } + }, + "@tanstack/table-core": { + "version": "8.20.5", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.20.5.tgz", + "integrity": "sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==" + }, + "@tanstack/virtual-core": { + "version": "3.10.6", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.10.6.tgz", + "integrity": "sha512-1giLc4dzgEKLMx5pgKjL6HlG5fjZMgCjzlKAlpr7yoUtetVPELgER1NtephAI910nMwfPTHNyWKSFmJdHkz2Cw==" + }, "@testing-library/dom": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", @@ -12124,6 +12556,11 @@ "strip-final-newline": "^3.0.0" } }, + "export-to-csv": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/export-to-csv/-/export-to-csv-1.3.0.tgz", + "integrity": "sha512-msPjbfozZdYzDghAEKmCVH5veMeKHNacplE6noXvGiA8AeV1qa/SOxp6JXDjF9R8Kf6v3ypI6jskiY19dkhZeA==" + }, "fast-equals": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", @@ -12317,6 +12754,11 @@ "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.5.tgz", "integrity": "sha512-G7HLD+WKcrOyJP5VQwYZNC3Z6FcQ7YYjEFiFoIj8PfEr73mu421o8B1N5DKUcc8K37EsJ2XXWA8DtrDz/2dReg==" }, + "highlight-words": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/highlight-words/-/highlight-words-1.2.2.tgz", + "integrity": "sha512-Mf4xfPXYm8Ay1wTibCrHpNWeR2nUMynMVFkXCi4mbl+TEgmNOe+I4hV7W3OCZcSvzGL6kupaqpfHOemliMTGxQ==" + }, "hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -12949,6 +13391,17 @@ } } }, + "material-react-table": { + "version": "2.13.3", + "resolved": "https://registry.npmjs.org/material-react-table/-/material-react-table-2.13.3.tgz", + "integrity": "sha512-xeyAEG6UYG3qgBIo17epAP5zsWT1pH0uCEkaUxvhki9sGcP35OqfOMSZJNhISvmqEqXKYHdqKbZI6iOwsg1sYA==", + "requires": { + "@tanstack/match-sorter-utils": "8.19.4", + "@tanstack/react-table": "8.20.5", + "@tanstack/react-virtual": "3.10.6", + "highlight-words": "1.2.2" + } + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -13539,6 +13992,11 @@ "integrity": "sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw==", "requires": {} }, + "remove-accents": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", + "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==" + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", diff --git a/packages/deck/frontend/sirius-components-deck/src/card/DeckCard.tsx b/packages/deck/frontend/sirius-components-deck/src/card/DeckCard.tsx index a7b56563fd..53d9619d1e 100644 --- a/packages/deck/frontend/sirius-components-deck/src/card/DeckCard.tsx +++ b/packages/deck/frontend/sirius-components-deck/src/card/DeckCard.tsx @@ -12,22 +12,64 @@ *******************************************************************************/ import { Theme, useTheme } from '@mui/material/styles'; -import { useRef } from 'react'; +import { CSSProperties, useRef } from 'react'; +import { makeStyles } from 'tss-react/mui'; import { DeckInput } from '../common/DeckInput'; -import { - DeckCardHeader, - DeckCardRightContent, - DeckDraggableCardWrapper, - Detail, - Footer, - cardDetailFontStyle, - cardLabelFontStyle, -} from '../styled/DeckCardStyledComponents'; import { DeckTitle, titleFontStyle } from '../styled/DeckStyledComponents'; import { DeckCardProps, UpdateCardProps } from './DeckCard.types'; import { DeckDeleteButton } from './DeckDeleteButton'; import { DeckTag } from './DeckTag'; +const useStyles = makeStyles()((theme: Theme) => ({ + detail: { + color: theme.palette.text.primary, + whiteSpace: 'pre-wrap', + }, + footer: { + borderTop: `1px solid ${theme.palette.divider}`, + paddingTop: '6px', + textAlign: 'right', + display: 'flex', + justifyContent: 'flex-end', + flexDirection: 'row', + flexWrap: 'wrap', + }, + rightContent: { + width: ' 38%', + paddingRight: '10px', + }, + header: { + marginBottom: '10px', + display: 'flex', + flexDirection: 'row', + alignItems: 'flex-start', + borderBottom: `1px solid ${theme.palette.divider}`, + paddingBottom: '6px', + color: theme.palette.text.primary, + }, + cardWrapper: { + borderRadius: ' 3px', + borderBottom: `1px solid ${theme.palette.divider}`, + backgroundColor: 'white', + position: 'relative', + padding: '10px', + cursor: 'pointer', + maxWidth: '250px', + marginBottom: '7px', + minWidth: '230px', + }, +})); + +const cardLabelFontStyle: CSSProperties = { + fontSize: '10px', + textAlign: 'right', +}; + +const cardDetailFontStyle: CSSProperties = { + fontSize: '12px', + minHeight: '20px', +}; + /** * A specific Card Component to handle selection and direct edit. * Copied and adapted from react-trello Card component. @@ -59,6 +101,7 @@ export const DeckCard = ({ }; const theme: Theme = useTheme(); + const { classes } = useStyles(); const cardStyle: React.CSSProperties = { border: editable ? `2px solid ${theme.palette.selected}` : undefined, @@ -75,16 +118,16 @@ export const DeckCard = ({ } }; return ( - e.preventDefault()}> - +
{editable ? ( - + {editable ? ( + {editable && } - - +
+
{editable ? ( +
{tags && tags.length > 0 && ( -
+
{tags.map((tag) => ( ))} -
+ )} -
+ ); }; diff --git a/packages/deck/frontend/sirius-components-deck/src/card/DeckDeleteButton.tsx b/packages/deck/frontend/sirius-components-deck/src/card/DeckDeleteButton.tsx index 046ab4a6e0..1bc7f365f6 100644 --- a/packages/deck/frontend/sirius-components-deck/src/card/DeckDeleteButton.tsx +++ b/packages/deck/frontend/sirius-components-deck/src/card/DeckDeleteButton.tsx @@ -12,12 +12,26 @@ *******************************************************************************/ import DeleteIcon from '@mui/icons-material/Delete'; -import { CardDeleteIconButton } from '../styled/DeckCardStyledComponents'; +import IconButton from '@mui/material/IconButton'; +import { makeStyles } from 'tss-react/mui'; + +const useStyles = makeStyles()(() => ({ + icon: { + position: 'absolute', + top: '2px', + right: '2px', + padding: '0', + ' & .MuiSvgIcon-fontSizeSmall': { + fontSize: '12px', + }, + }, +})); export const DeckDeleteButton = (props) => { + const { classes } = useStyles(); return ( - + - + ); }; diff --git a/packages/deck/frontend/sirius-components-deck/src/card/DeckTag.tsx b/packages/deck/frontend/sirius-components-deck/src/card/DeckTag.tsx index a3f531b81d..36da158853 100644 --- a/packages/deck/frontend/sirius-components-deck/src/card/DeckTag.tsx +++ b/packages/deck/frontend/sirius-components-deck/src/card/DeckTag.tsx @@ -10,10 +10,24 @@ * Contributors: * Obeo - initial API and implementation *******************************************************************************/ -import { TagSpan } from '../styled/DeckCardStyledComponents'; +import { makeStyles } from 'tss-react/mui'; import { DeckTagProps } from './DeckTag.types'; +const useStyles = makeStyles()(() => ({ + tag: { + padding: '2px 3px', + borderRadius: '3px', + margin: '2px 5px', + fontSize: '70%', + }, +})); + export const DeckTag = ({ title, color, bgcolor, tagStyle }: DeckTagProps) => { + const { classes } = useStyles(); const style = { color: color || 'white', backgroundColor: bgcolor || 'orange', ...tagStyle }; - return {title}; + return ( + + {title} + + ); }; diff --git a/packages/deck/frontend/sirius-components-deck/src/styled/DeckCardStyledComponents.tsx b/packages/deck/frontend/sirius-components-deck/src/styled/DeckCardStyledComponents.tsx deleted file mode 100644 index cc1879ad74..0000000000 --- a/packages/deck/frontend/sirius-components-deck/src/styled/DeckCardStyledComponents.tsx +++ /dev/null @@ -1,85 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2024 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 IconButton from '@mui/material/IconButton'; -import { styled } from '@mui/material/styles'; -import { CSSProperties } from 'react'; - -export const cardLabelFontStyle: CSSProperties = { - fontSize: '10px', - textAlign: 'right', -}; - -export const cardDetailFontStyle: CSSProperties = { - fontSize: '12px', - minHeight: '20px', -}; - -export const DeckDraggableCardWrapper = styled('article')(({ theme }) => ({ - borderRadius: ' 3px', - borderBottom: `1px solid ${theme.palette.divider}`, - backgroundColor: 'white', - position: 'relative', - padding: '10px', - cursor: 'pointer', - maxWidth: '250px', - marginBottom: '7px', - minWidth: '230px', -})); - -export const DeckCardHeader = styled('article')(({ theme }) => ({ - marginBottom: '10px', - display: 'flex', - flexDirection: 'row', - alignItems: 'flex-start', - borderBottom: `1px solid ${theme.palette.divider}`, - paddingBottom: '6px', - color: theme.palette.text.primary, -})); - -export const DeckCardRightContent = styled('span')({ - width: ' 38%', - paddingRight: '10px', -}); - -export const CardDeleteIconButton = styled(IconButton)({ - position: 'absolute', - top: '2px', - right: '2px', - padding: '0', - ' & .MuiSvgIcon-fontSizeSmall': { - fontSize: '12px', - }, -}); - -export const Detail = styled('div')(({ theme }) => ({ - color: theme.palette.text.primary, - whiteSpace: 'pre-wrap', -})); - -export const Footer = styled('div')(({ theme }) => ({ - borderTop: `1px solid ${theme.palette.divider}`, - paddingTop: '6px', - textAlign: 'right', - display: 'flex', - justifyContent: 'flex-end', - flexDirection: 'row', - flexWrap: 'wrap', -})); - -export const TagSpan = styled('span')({ - padding: ' 2px 3px', - borderRadius: '3px', - margin: '2px 5px', - fontSize: '70%', -}); diff --git a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/package.json b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/package.json index 35e7df747d..5f2cd0ffdd 100644 --- a/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/package.json +++ b/packages/formdescriptioneditors/frontend/sirius-components-formdescriptioneditors/package.json @@ -36,11 +36,14 @@ "@eclipse-sirius/sirius-components-core": "*", "@eclipse-sirius/sirius-components-charts": "*", "@eclipse-sirius/sirius-components-forms": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@mui/icons-material": "5.15.19", "@mui/material": "5.15.19", "@mui/x-tree-view": "7.6.1", "@xstate/react": "3.0.0", + "export-to-csv": "1.3.0", "graphql": "16.8.1", + "material-react-table": "2.13.3", "react": "18.3.1", "react-dom": "18.3.1", "tss-react": "4.9.7", @@ -51,6 +54,7 @@ "@eclipse-sirius/sirius-components-core": "*", "@eclipse-sirius/sirius-components-charts": "*", "@eclipse-sirius/sirius-components-forms": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-tsconfig": "*", "@mui/icons-material": "5.15.19", "@mui/material": "5.15.19", @@ -61,7 +65,9 @@ "@vitejs/plugin-react": "4.3.0", "@xstate/react": "3.0.0", "@vitest/coverage-v8": "1.6.0", + "export-to-csv": "1.3.0", "graphql": "16.8.1", + "material-react-table": "2.13.3", "prettier": "2.7.1", "rollup-plugin-peer-deps-external": "2.2.4", "react": "18.3.1", diff --git a/packages/forms/backend/sirius-components-collaborative-forms/pom.xml b/packages/forms/backend/sirius-components-collaborative-forms/pom.xml index 727039efaf..a9a4c9a5c5 100644 --- a/packages/forms/backend/sirius-components-collaborative-forms/pom.xml +++ b/packages/forms/backend/sirius-components-collaborative-forms/pom.xml @@ -63,6 +63,11 @@ sirius-components-collaborative-charts 2024.9.8 + + org.eclipse.sirius + sirius-components-collaborative-tables + 2024.9.8 + org.eclipse.sirius sirius-components-tests @@ -94,7 +99,8 @@ maven-checkstyle-plugin 3.4.0 - ../../../releng/backend/sirius-components-resources/checkstyle/CheckstyleConfiguration.xml + + ../../../releng/backend/sirius-components-resources/checkstyle/CheckstyleConfiguration.xml true true true @@ -142,4 +148,4 @@ - + \ No newline at end of file diff --git a/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessor.java b/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessor.java index c8c3768f79..f5ce861d18 100644 --- a/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessor.java +++ b/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessor.java @@ -23,7 +23,6 @@ import org.eclipse.sirius.components.collaborative.api.IRepresentationRefreshPolicyRegistry; import org.eclipse.sirius.components.collaborative.api.IRepresentationSearchService; import org.eclipse.sirius.components.collaborative.api.ISubscriptionManager; -import org.eclipse.sirius.components.collaborative.dto.RenameRepresentationInput; import org.eclipse.sirius.components.collaborative.forms.api.FormCreationParameters; import org.eclipse.sirius.components.collaborative.forms.api.IFormEventHandler; import org.eclipse.sirius.components.collaborative.forms.api.IFormEventProcessor; @@ -31,23 +30,29 @@ import org.eclipse.sirius.components.collaborative.forms.api.IFormPostProcessor; import org.eclipse.sirius.components.collaborative.forms.configuration.FormEventProcessorConfiguration; import org.eclipse.sirius.components.collaborative.forms.dto.FormRefreshedEventPayload; -import org.eclipse.sirius.components.collaborative.forms.dto.RenameFormInput; import org.eclipse.sirius.components.collaborative.forms.variables.FormVariableProvider; +import org.eclipse.sirius.components.collaborative.tables.api.ITableEventHandler; +import org.eclipse.sirius.components.collaborative.tables.api.ITableInput; import org.eclipse.sirius.components.core.api.IEditingContext; import org.eclipse.sirius.components.core.api.IInput; import org.eclipse.sirius.components.core.api.IObjectService; import org.eclipse.sirius.components.core.api.IPayload; +import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService; import org.eclipse.sirius.components.core.api.IRepresentationInput; import org.eclipse.sirius.components.forms.Form; +import org.eclipse.sirius.components.forms.TableWidget; import org.eclipse.sirius.components.forms.components.FormComponent; import org.eclipse.sirius.components.forms.components.FormComponentProps; import org.eclipse.sirius.components.forms.description.FormDescription; +import org.eclipse.sirius.components.forms.description.TableWidgetDescription; import org.eclipse.sirius.components.forms.renderer.FormRenderer; import org.eclipse.sirius.components.forms.renderer.IWidgetDescriptor; import org.eclipse.sirius.components.representations.Element; import org.eclipse.sirius.components.representations.GetOrCreateRandomIdProvider; import org.eclipse.sirius.components.representations.IRepresentation; import org.eclipse.sirius.components.representations.VariableManager; +import org.eclipse.sirius.components.tables.Table; +import org.eclipse.sirius.components.tables.descriptions.TableDescription; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -78,10 +83,14 @@ public class FormEventProcessor implements IFormEventProcessor { private final List formEventHandlers; + private final List tableEventHandlers; + private final ISubscriptionManager subscriptionManager; private final IRepresentationSearchService representationSearchService; + private final IRepresentationDescriptionSearchService representationDescriptionSearchService; + private final IRepresentationRefreshPolicyRegistry representationRefreshPolicyRegistry; private final Many sink = Sinks.many().multicast().directBestEffort(); @@ -95,6 +104,7 @@ public class FormEventProcessor implements IFormEventProcessor { public FormEventProcessor(FormEventProcessorConfiguration configuration, ISubscriptionManager subscriptionManager, IRepresentationSearchService representationSearchService, + IRepresentationDescriptionSearchService representationDescriptionSearchService, IRepresentationRefreshPolicyRegistry representationRefreshPolicyRegistry, IFormPostProcessor formPostProcessor) { this.logger.trace("Creating the form event processor {}", configuration.formCreationParameters().getId()); this.editingContext = Objects.requireNonNull(configuration.editingContext()); @@ -103,9 +113,11 @@ public FormEventProcessor(FormEventProcessorConfiguration configuration, this.widgetDescriptors = Objects.requireNonNull(configuration.widgetDescriptors()); this.formEventHandlers = Objects.requireNonNull(configuration.formEventHandlers()); this.representationSearchService = Objects.requireNonNull(representationSearchService); + this.representationDescriptionSearchService = Objects.requireNonNull(representationDescriptionSearchService); this.subscriptionManager = Objects.requireNonNull(subscriptionManager); this.representationRefreshPolicyRegistry = Objects.requireNonNull(representationRefreshPolicyRegistry); this.formPostProcessor = Objects.requireNonNull(formPostProcessor); + this.tableEventHandlers = Objects.requireNonNull(configuration.tableEventHandlers()); this.variableManager = this.initializeVariableManager(this.formCreationParameters); @@ -145,12 +157,7 @@ public ISubscriptionManager getSubscriptionManager() { @Override public void handle(One payloadSink, Many changeDescriptionSink, IRepresentationInput representationInput) { - IRepresentationInput effectiveInput = representationInput; - if (representationInput instanceof RenameRepresentationInput renameRepresentationInput) { - effectiveInput = new RenameFormInput(renameRepresentationInput.id(), renameRepresentationInput.editingContextId(), renameRepresentationInput.representationId(), - renameRepresentationInput.newLabel()); - } - if (effectiveInput instanceof IFormInput formInput) { + if (representationInput instanceof IFormInput formInput) { Optional optionalFormEventHandler = this.formEventHandlers.stream().filter(handler -> handler.canHandle(formInput)).findFirst(); @@ -160,9 +167,63 @@ public void handle(One payloadSink, Many changeDesc } else { this.logger.warn("No handler found for event: {}", formInput); } + } else if (representationInput instanceof ITableInput tableInput) { + + Optional optionalTableEventHandler = this.tableEventHandlers.stream().filter(handler -> handler.canHandle(tableInput)).findFirst(); + + if (optionalTableEventHandler.isPresent()) { + ITableEventHandler tableEventHandler = optionalTableEventHandler.get(); + Optional tableOptional = getTable(currentForm.get(), tableInput.getTableId()); + if (tableOptional.isPresent()) { + Optional tableDescriptionOptional = getTableDescription(currentForm.get().getDescriptionId(), tableOptional.get().getDescriptionId()); + if (tableDescriptionOptional.isPresent()) { + tableEventHandler.handle(payloadSink, changeDescriptionSink, this.editingContext, tableOptional.get(), tableDescriptionOptional.get(), tableInput); + } else { + this.logger.warn("No table description found for event: {}", tableInput); + } + } else { + this.logger.warn("No table found for event: {}", tableInput); + } + } else { + this.logger.warn("No handler found for event: {}", tableInput); + } } } + private Optional
getTable(Form form, String tableId) { + return form.getPages().stream() + .flatMap(page -> page.getGroups().stream()) + .flatMap(group -> group.getWidgets().stream()) + .filter(TableWidget.class::isInstance) + .map(TableWidget.class::cast) + .map(TableWidget::getTable) + .filter(table -> tableId.equals(table.getId())) + .findFirst(); + } + + private Optional getTableDescription(String formDescriptionId, String tableDescriptionId) { + return this.representationDescriptionSearchService + .findById(editingContext, formDescriptionId) + .filter(FormDescription.class::isInstance) + .map(FormDescription.class::cast) + .stream() + .flatMap(form -> form.getPageDescriptions().stream()) + .flatMap(page -> page.getGroupDescriptions().stream()) + .flatMap(group -> group.getControlDescriptions().stream()) + .filter(TableWidgetDescription.class::isInstance) + .map(TableWidgetDescription.class::cast) + .map(TableWidgetDescription::getTableDescription) + .filter(tableDescription -> tableDescriptionId.equals(tableDescription.getId())) + .findFirst(); + } + + private Optional findFormDescription(String formDescriptionId) { + return this.representationDescriptionSearchService + .findById(editingContext, formDescriptionId) + .filter(FormDescription.class::isInstance) + .map(FormDescription.class::cast); + } + @Override public void refresh(ChangeDescription changeDescription) { if (this.shouldReload(changeDescription)) { diff --git a/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessorFactory.java b/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessorFactory.java index 9006e0395c..7bbe6d2dcd 100644 --- a/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessorFactory.java +++ b/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessorFactory.java @@ -27,6 +27,7 @@ import org.eclipse.sirius.components.collaborative.forms.api.IFormPostProcessor; import org.eclipse.sirius.components.collaborative.forms.configuration.FormEventProcessorConfiguration; import org.eclipse.sirius.components.collaborative.forms.configuration.FormEventProcessorFactoryConfiguration; +import org.eclipse.sirius.components.collaborative.tables.api.ITableEventHandler; import org.eclipse.sirius.components.core.api.IEditingContext; import org.eclipse.sirius.components.core.api.IObjectService; import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService; @@ -54,6 +55,8 @@ public class FormEventProcessorFactory implements IRepresentationEventProcessorF private final List formEventHandlers; + private final List tableEventHandlers; + private final ISubscriptionManagerFactory subscriptionManagerFactory; private final IRepresentationRefreshPolicyRegistry representationRefreshPolicyRegistry; @@ -67,6 +70,7 @@ public FormEventProcessorFactory(RepresentationEventProcessorFactoryConfiguratio this.objectService = Objects.requireNonNull(formConfiguration.getObjectService()); this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors); this.formEventHandlers = Objects.requireNonNull(formConfiguration.getFormEventHandlers()); + this.tableEventHandlers = Objects.requireNonNull(formConfiguration.getTableEventHandlers()); this.representationRefreshPolicyRegistry = Objects.requireNonNull(configuration.getRepresentationRefreshPolicyRegistry()); this.formPostProcessor = Objects.requireNonNull(formConfiguration.getFormPostProcessor()); } @@ -98,9 +102,10 @@ public Optional createRepresentationEventProcesso .build(); IRepresentationEventProcessor formEventProcessor = new FormEventProcessor( - new FormEventProcessorConfiguration(editingContext, this.objectService, formCreationParameters, this.widgetDescriptors, this.formEventHandlers), + new FormEventProcessorConfiguration(editingContext, this.objectService, formCreationParameters, this.widgetDescriptors, this.formEventHandlers, this.tableEventHandlers), this.subscriptionManagerFactory.create(), this.representationSearchService, + this.representationDescriptionSearchService, this.representationRefreshPolicyRegistry, this.formPostProcessor); diff --git a/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/configuration/FormEventProcessorConfiguration.java b/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/configuration/FormEventProcessorConfiguration.java index 3d61d106cb..7279647bff 100644 --- a/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/configuration/FormEventProcessorConfiguration.java +++ b/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/configuration/FormEventProcessorConfiguration.java @@ -17,17 +17,17 @@ import org.eclipse.sirius.components.collaborative.forms.api.FormCreationParameters; import org.eclipse.sirius.components.collaborative.forms.api.IFormEventHandler; import org.eclipse.sirius.components.collaborative.forms.api.IFormEventProcessor; +import org.eclipse.sirius.components.collaborative.tables.api.ITableEventHandler; import org.eclipse.sirius.components.core.api.IEditingContext; import org.eclipse.sirius.components.core.api.IObjectService; import org.eclipse.sirius.components.forms.renderer.IWidgetDescriptor; /** - * Bundles the common dependencies that {@link IFormEventProcessor} implementations need - * into a single object for convenience. + * Bundles the common dependencies that {@link IFormEventProcessor} implementations need into a single object for convenience. * * @author frouene */ -public record FormEventProcessorConfiguration(IEditingContext editingContext, IObjectService objectService, FormCreationParameters formCreationParameters, - List widgetDescriptors, List formEventHandlers) { +public record FormEventProcessorConfiguration(IEditingContext editingContext, IObjectService objectService, FormCreationParameters formCreationParameters, List widgetDescriptors, + List formEventHandlers, List tableEventHandlers) { } diff --git a/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/configuration/FormEventProcessorFactoryConfiguration.java b/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/configuration/FormEventProcessorFactoryConfiguration.java index 0816f92578..13a05abbc9 100644 --- a/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/configuration/FormEventProcessorFactoryConfiguration.java +++ b/packages/forms/backend/sirius-components-collaborative-forms/src/main/java/org/eclipse/sirius/components/collaborative/forms/configuration/FormEventProcessorFactoryConfiguration.java @@ -19,6 +19,7 @@ import org.eclipse.sirius.components.collaborative.api.IRepresentationEventProcessorFactory; import org.eclipse.sirius.components.collaborative.forms.api.IFormEventHandler; import org.eclipse.sirius.components.collaborative.forms.api.IFormPostProcessor; +import org.eclipse.sirius.components.collaborative.tables.api.ITableEventHandler; import org.eclipse.sirius.components.core.api.IObjectService; import org.springframework.context.annotation.Configuration; @@ -35,11 +36,14 @@ public class FormEventProcessorFactoryConfiguration { private final List formEventHandlers; + private final List tableEventHandlers; + private final Optional optionalFormProcessor; - public FormEventProcessorFactoryConfiguration(IObjectService objectService, List formEventHandlers, Optional optionalFormProcessor) { + public FormEventProcessorFactoryConfiguration(IObjectService objectService, List formEventHandlers, List tableEventHandlers, Optional optionalFormProcessor) { this.objectService = Objects.requireNonNull(objectService); this.formEventHandlers = Objects.requireNonNull(formEventHandlers); + this.tableEventHandlers = Objects.requireNonNull(tableEventHandlers); this.optionalFormProcessor = Objects.requireNonNull(optionalFormProcessor); } @@ -54,4 +58,8 @@ public List getFormEventHandlers() { public IFormPostProcessor getFormPostProcessor() { return this.optionalFormProcessor.orElse(new IFormPostProcessor.NoOp()); } + + public List getTableEventHandlers() { + return tableEventHandlers; + } } diff --git a/packages/forms/backend/sirius-components-collaborative-forms/src/main/resources/schema/form.graphqls b/packages/forms/backend/sirius-components-collaborative-forms/src/main/resources/schema/form.graphqls index 2c68f4ebe4..de1cfd1a0b 100644 --- a/packages/forms/backend/sirius-components-collaborative-forms/src/main/resources/schema/form.graphqls +++ b/packages/forms/backend/sirius-components-collaborative-forms/src/main/resources/schema/form.graphqls @@ -420,6 +420,16 @@ type DateTimeStyle { bold: Boolean } +type TableWidget implements Widget { + id: ID! + label: String! + iconURL: [String!]! + diagnostics: [Diagnostic!]! + hasHelpText: Boolean! + readOnly: Boolean! + table: Table +} + type FormDescription implements RepresentationDescription { id: ID! label: String! diff --git a/packages/forms/backend/sirius-components-collaborative-forms/src/test/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessorTests.java b/packages/forms/backend/sirius-components-collaborative-forms/src/test/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessorTests.java index 7ca5baa06a..569befb33a 100644 --- a/packages/forms/backend/sirius-components-collaborative-forms/src/test/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessorTests.java +++ b/packages/forms/backend/sirius-components-collaborative-forms/src/test/java/org/eclipse/sirius/components/collaborative/forms/FormEventProcessorTests.java @@ -30,12 +30,12 @@ import org.eclipse.sirius.components.core.api.IInput; import org.eclipse.sirius.components.core.api.IObjectService; import org.eclipse.sirius.components.core.api.IPayload; +import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService; import org.eclipse.sirius.components.forms.description.FormDescription; +import org.junit.jupiter.api.Test; import reactor.test.StepVerifier; -import org.junit.jupiter.api.Test; - /** * Unit tests of the form event processor. * @@ -116,9 +116,10 @@ private FormEventProcessor createFormEventProcessor() { .build(); FormEventProcessor formEventProcessor = new FormEventProcessor( - new FormEventProcessorConfiguration(editingContext, new IObjectService.NoOp(), formCreationParameters, List.of(), List.of()), + new FormEventProcessorConfiguration(editingContext, new IObjectService.NoOp(), formCreationParameters, List.of(), List.of(), List.of()), new SubscriptionManager(), new IRepresentationSearchService.NoOp(), + new IRepresentationDescriptionSearchService.NoOp(), new RepresentationRefreshPolicyRegistry(List.of()), new IFormPostProcessor.NoOp()); return formEventProcessor; diff --git a/packages/forms/backend/sirius-components-forms-graphql/src/main/java/org/eclipse/sirius/components/forms/graphql/datafetchers/form/WidgetHasHelpTextDataFetcher.java b/packages/forms/backend/sirius-components-forms-graphql/src/main/java/org/eclipse/sirius/components/forms/graphql/datafetchers/form/WidgetHasHelpTextDataFetcher.java index 37516d6298..0af98fffc8 100644 --- a/packages/forms/backend/sirius-components-forms-graphql/src/main/java/org/eclipse/sirius/components/forms/graphql/datafetchers/form/WidgetHasHelpTextDataFetcher.java +++ b/packages/forms/backend/sirius-components-forms-graphql/src/main/java/org/eclipse/sirius/components/forms/graphql/datafetchers/form/WidgetHasHelpTextDataFetcher.java @@ -49,6 +49,7 @@ public class WidgetHasHelpTextDataFetcher implements IDataFetcherWithFieldCoord "Select", "Slider", "SplitButton", + "TableWidget", "Textarea", "Textfield", "ToolbarAction", diff --git a/packages/forms/backend/sirius-components-forms/pom.xml b/packages/forms/backend/sirius-components-forms/pom.xml index 6d2f6a924b..f6b94da3cd 100644 --- a/packages/forms/backend/sirius-components-forms/pom.xml +++ b/packages/forms/backend/sirius-components-forms/pom.xml @@ -54,6 +54,11 @@ sirius-components-charts 2024.9.8 + + org.eclipse.sirius + sirius-components-tables + 2024.9.8 + org.springframework.boot spring-boot-starter-test @@ -78,7 +83,8 @@ maven-checkstyle-plugin 3.4.0 - ../../../releng/backend/sirius-components-resources/checkstyle/CheckstyleConfiguration.xml + + ../../../releng/backend/sirius-components-resources/checkstyle/CheckstyleConfiguration.xml true true true @@ -126,4 +132,4 @@ - + \ No newline at end of file diff --git a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/TableWidget.java b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/TableWidget.java new file mode 100644 index 0000000000..9582de8d96 --- /dev/null +++ b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/TableWidget.java @@ -0,0 +1,123 @@ +/******************************************************************************* + * Copyright (c) 2024 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.forms; + +import java.text.MessageFormat; +import java.util.List; +import java.util.Objects; +import java.util.function.Supplier; + +import org.eclipse.sirius.components.annotations.Immutable; +import org.eclipse.sirius.components.forms.validation.Diagnostic; +import org.eclipse.sirius.components.representations.IRepresentation; +import org.eclipse.sirius.components.tables.Table; + +/** + * Root concept of the table widget. + * + * @author lfasani + */ +@Immutable +public final class TableWidget extends AbstractWidget { + + public static final String KIND = IRepresentation.KIND_PREFIX + "?type=Table"; + + private Table table; + + private TableWidget() { + // Prevent instantiation + } + + public Table getTable() { + return this.table; + } + + public static Builder newTableWidget(String id) { + return new Builder(id); + } + + @Override + public String toString() { + String pattern = "{0} '{'id: {1}, label: {2}'}'"; + return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.getId(), this.label); + } + + /** + * The builder used to create the table widget. + * + * @author lfasani + */ + @SuppressWarnings("checkstyle:HiddenField") + public static final class Builder { + + private final String id; + + private String label; + + private List iconURL = List.of(); + + private List diagnostics; + + private Supplier helpTextProvider; + + private boolean readOnly; + + private Table table; + + private Builder(String id) { + this.id = Objects.requireNonNull(id); + } + + public TableWidget.Builder iconURL(List iconURL) { + this.iconURL = Objects.requireNonNull(iconURL); + return this; + } + + public TableWidget.Builder label(String label) { + this.label = Objects.requireNonNull(label); + return this; + } + + public TableWidget.Builder diagnostics(List diagnostics) { + this.diagnostics = Objects.requireNonNull(diagnostics); + return this; + } + + public TableWidget.Builder helpTextProvider(Supplier helpTextProvider) { + this.helpTextProvider = Objects.requireNonNull(helpTextProvider); + return this; + } + + public TableWidget.Builder readOnly(boolean readOnly) { + this.readOnly = readOnly; + return this; + } + + public Builder table(Table table) { + this.table = Objects.requireNonNull(table); + return this; + } + + public TableWidget build() { + TableWidget table = new TableWidget(); + table.id = Objects.requireNonNull(this.id); + table.label = Objects.requireNonNull(this.label); + table.iconURL = Objects.requireNonNull(this.iconURL); + table.diagnostics = Objects.requireNonNull(this.diagnostics); + table.table = Objects.requireNonNull(this.table); + table.helpTextProvider = this.helpTextProvider; // Optional on purpose + table.readOnly = this.readOnly; + return table; + } + } +} diff --git a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/TableWidgetComponent.java b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/TableWidgetComponent.java new file mode 100644 index 0000000000..3da6385d06 --- /dev/null +++ b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/TableWidgetComponent.java @@ -0,0 +1,81 @@ +/******************************************************************************* + * Copyright (c) 2024 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.forms.components; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +import org.eclipse.sirius.components.forms.description.TableWidgetDescription; +import org.eclipse.sirius.components.forms.elements.TableWidgetElementProps; +import org.eclipse.sirius.components.representations.Element; +import org.eclipse.sirius.components.representations.IComponent; +import org.eclipse.sirius.components.representations.VariableManager; +import org.eclipse.sirius.components.tables.components.TableComponent; +import org.eclipse.sirius.components.tables.components.TableComponentProps; + +/** + * The component used to render the table widget. + * + * @author lfasani + */ +public class TableWidgetComponent implements IComponent { + + private final TableWidgetComponentProps props; + + public TableWidgetComponent(TableWidgetComponentProps props) { + this.props = Objects.requireNonNull(props); + } + + @Override + public Element render() { + VariableManager variableManager = this.props.getVariableManager(); + TableWidgetDescription tableWidgetDescription = this.props.getTableDescription(); + + String label = tableWidgetDescription.getLabelProvider().apply(variableManager); + + VariableManager idVariableManager = variableManager.createChild(); + idVariableManager.put(FormComponent.TARGET_OBJECT_ID, tableWidgetDescription.getTargetObjectIdProvider().apply(variableManager)); + idVariableManager.put(FormComponent.CONTROL_DESCRIPTION_ID, tableWidgetDescription.getId()); + idVariableManager.put(FormComponent.WIDGET_LABEL, label); + String id = tableWidgetDescription.getIdProvider().apply(idVariableManager); + + List iconURL = tableWidgetDescription.getIconURLProvider().apply(variableManager); + Boolean readOnly = tableWidgetDescription.getIsReadOnlyProvider().apply(variableManager); + + Element tableElement = new Element(TableComponent.class, + new TableComponentProps(variableManager, tableWidgetDescription.getTableDescription(), Optional.empty())); + + List children = new ArrayList<>(); + children.add(tableElement); + + TableWidgetElementProps.Builder tableElementPropsBuilder = TableWidgetElementProps.newTableWidgetElementProps(id) + .label(label) + .children(children); + + if (iconURL != null) { + tableElementPropsBuilder.iconURL(iconURL); + } + if (tableWidgetDescription.getHelpTextProvider() != null) { + tableElementPropsBuilder.helpTextProvider(() -> tableWidgetDescription.getHelpTextProvider().apply(variableManager)); + } + if (readOnly != null) { + tableElementPropsBuilder.readOnly(readOnly); + } + + TableWidgetElementProps tableWidgetElementProps = tableElementPropsBuilder.build(); + return new Element(TableWidgetElementProps.TYPE, tableWidgetElementProps); + } + +} diff --git a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/TableWidgetComponentProps.java b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/TableWidgetComponentProps.java new file mode 100644 index 0000000000..078b0e5a3b --- /dev/null +++ b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/TableWidgetComponentProps.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2024 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.forms.components; + +import java.util.Objects; + +import org.eclipse.sirius.components.forms.description.TableWidgetDescription; +import org.eclipse.sirius.components.representations.IProps; +import org.eclipse.sirius.components.representations.VariableManager; + +/** + * The props of the table component. + * + * @author lfasani + */ +public class TableWidgetComponentProps implements IProps { + + private final VariableManager variableManager; + + private final TableWidgetDescription tableWidgetDescription; + + public TableWidgetComponentProps(VariableManager variableManager, TableWidgetDescription tableWidgetDescription) { + this.variableManager = Objects.requireNonNull(variableManager); + this.tableWidgetDescription = Objects.requireNonNull(tableWidgetDescription); + } + + public VariableManager getVariableManager() { + return this.variableManager; + } + + public TableWidgetDescription getTableDescription() { + return this.tableWidgetDescription; + } +} diff --git a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/WidgetComponent.java b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/WidgetComponent.java index 5aea42b11d..e71c89265d 100644 --- a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/WidgetComponent.java +++ b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/components/WidgetComponent.java @@ -31,6 +31,7 @@ import org.eclipse.sirius.components.forms.description.SelectDescription; import org.eclipse.sirius.components.forms.description.SliderDescription; import org.eclipse.sirius.components.forms.description.SplitButtonDescription; +import org.eclipse.sirius.components.forms.description.TableWidgetDescription; import org.eclipse.sirius.components.forms.description.TextareaDescription; import org.eclipse.sirius.components.forms.description.TextfieldDescription; import org.eclipse.sirius.components.forms.description.TreeDescription; @@ -116,6 +117,9 @@ public Element render() { } else if (widgetDescription instanceof DateTimeDescription) { DateTimeComponentProps dateTimeComponentProps = new DateTimeComponentProps(variableManager, (DateTimeDescription) widgetDescription); element = new Element(DateTimeComponent.class, dateTimeComponentProps); + } else if (widgetDescription instanceof TableWidgetDescription) { + TableWidgetComponentProps tableWidgetComponentProps = new TableWidgetComponentProps(variableManager, (TableWidgetDescription) widgetDescription); + element = new Element(TableWidgetComponent.class, tableWidgetComponentProps); } else { element = this.props.getWidgetDescriptors().stream() .map(widgetDescriptor -> widgetDescriptor.createElement(variableManager, widgetDescription)) diff --git a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/description/TableWidgetDescription.java b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/description/TableWidgetDescription.java new file mode 100644 index 0000000000..bd480af72d --- /dev/null +++ b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/description/TableWidgetDescription.java @@ -0,0 +1,170 @@ +/******************************************************************************* + * Copyright (c) 2024 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.forms.description; + +import java.text.MessageFormat; +import java.util.List; +import java.util.Objects; +import java.util.function.Function; + +import org.eclipse.sirius.components.annotations.Immutable; +import org.eclipse.sirius.components.representations.VariableManager; +import org.eclipse.sirius.components.tables.descriptions.TableDescription; + +/** + * The root concept of the description of a table representation. + * + * @author lfasani + */ +@Immutable +public final class TableWidgetDescription extends AbstractWidgetDescription { + private Function idProvider; + + private Function labelProvider; + + private Function> iconURLProvider; + + private TableDescription tableDescription; + + private TableWidgetDescription() { + // Prevent instantiation + } + + public Function getIdProvider() { + return this.idProvider; + } + + public Function getLabelProvider() { + return this.labelProvider; + } + + public Function> getIconURLProvider() { + return this.iconURLProvider; + } + + public TableDescription getTableDescription() { + return this.tableDescription; + } + + public static Builder newTableWidgetDescription(String id) { + return new Builder(id); + } + + @Override + public String toString() { + String pattern = "{0} '{'id: {1}'}'"; + return MessageFormat.format(pattern, this.getClass().getSimpleName(), this.getId()); + } + + + /** + * Builder used to create the table description. + * + * @author lfasani + */ + @SuppressWarnings("checkstyle:HiddenField") + public static final class Builder { + + private final String id; + + private Function idProvider; + + private Function labelProvider; + + private Function> iconURLProvider = variableManager -> List.of();; + + private Function targetObjectIdProvider; + + private Function isReadOnlyProvider = variableManager -> false; + + private Function> diagnosticsProvider; + + private Function kindProvider; + + private Function messageProvider; + + private Function helpTextProvider; + + private TableDescription tableDescription; + + private Builder(String id) { + this.id = Objects.requireNonNull(id); + } + + public TableWidgetDescription.Builder idProvider(Function idProvider) { + this.idProvider = Objects.requireNonNull(idProvider); + return this; + } + + public TableWidgetDescription.Builder labelProvider(Function labelProvider) { + this.labelProvider = Objects.requireNonNull(labelProvider); + return this; + } + + public TableWidgetDescription.Builder targetObjectIdProvider(Function targetObjectIdProvider) { + this.targetObjectIdProvider = Objects.requireNonNull(targetObjectIdProvider); + return this; + } + + public TableWidgetDescription.Builder isReadOnlyProvider(Function isReadOnlyProvider) { + this.isReadOnlyProvider = Objects.requireNonNull(isReadOnlyProvider); + return this; + } + + public TableWidgetDescription.Builder diagnosticsProvider(Function> diagnosticsProvider) { + this.diagnosticsProvider = Objects.requireNonNull(diagnosticsProvider); + return this; + } + + public TableWidgetDescription.Builder iconURLProvider(Function> iconURLProvider) { + this.iconURLProvider = Objects.requireNonNull(iconURLProvider); + return this; + } + + public TableWidgetDescription.Builder kindProvider(Function kindProvider) { + this.kindProvider = Objects.requireNonNull(kindProvider); + return this; + } + + public TableWidgetDescription.Builder messageProvider(Function messageProvider) { + this.messageProvider = Objects.requireNonNull(messageProvider); + return this; + } + + public TableWidgetDescription.Builder helpTextProvider(Function helpTextProvider) { + this.helpTextProvider = Objects.requireNonNull(helpTextProvider); + return this; + } + + public TableWidgetDescription.Builder tableDescription(TableDescription tableDescription) { + this.tableDescription = Objects.requireNonNull(tableDescription); + return this; + } + + public TableWidgetDescription build() { + TableWidgetDescription tableWidgetDescription = new TableWidgetDescription(); + tableWidgetDescription.id = Objects.requireNonNull(this.id); + tableWidgetDescription.targetObjectIdProvider = Objects.requireNonNull(this.targetObjectIdProvider); + tableWidgetDescription.idProvider = Objects.requireNonNull(this.idProvider); + tableWidgetDescription.labelProvider = Objects.requireNonNull(this.labelProvider); + tableWidgetDescription.iconURLProvider = Objects.requireNonNull(this.iconURLProvider); + tableWidgetDescription.isReadOnlyProvider = Objects.requireNonNull(this.isReadOnlyProvider); + tableWidgetDescription.diagnosticsProvider = Objects.requireNonNull(this.diagnosticsProvider); + tableWidgetDescription.kindProvider = Objects.requireNonNull(this.kindProvider); + tableWidgetDescription.messageProvider = Objects.requireNonNull(this.messageProvider); + tableWidgetDescription.helpTextProvider = this.helpTextProvider; // Optional on purpose + tableWidgetDescription.tableDescription = Objects.requireNonNull(this.tableDescription); + return tableWidgetDescription; + } + } +} diff --git a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/elements/TableWidgetElementProps.java b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/elements/TableWidgetElementProps.java new file mode 100644 index 0000000000..3439a064b6 --- /dev/null +++ b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/elements/TableWidgetElementProps.java @@ -0,0 +1,144 @@ +/******************************************************************************* + * Copyright (c) 2024 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.forms.elements; + +import java.text.MessageFormat; +import java.util.List; +import java.util.Objects; +import java.util.function.Supplier; + +import org.eclipse.sirius.components.annotations.Immutable; +import org.eclipse.sirius.components.representations.Element; +import org.eclipse.sirius.components.representations.IProps; + +/** + * Properties of the table element. + * + * @author lfasani + */ +@Immutable +public final class TableWidgetElementProps implements IProps { + + public static final String TYPE = "TableWidget"; + + private String id; + + private String label; + + private List iconURL; + + private Supplier helpTextProvider; + + private boolean readOnly; + + private List children; + + private TableWidgetElementProps() { + // Prevent instantiation + } + + public String getId() { + return this.id; + } + + public String getLabel() { + return this.label; + } + + public List getIconURL() { + return this.iconURL; + } + + public Supplier getHelpTextProvider() { + return this.helpTextProvider; + } + + public boolean isReadOnly() { + return this.readOnly; + } + + @Override + public List getChildren() { + return this.children; + } + + public static Builder newTableWidgetElementProps(String id) { + return new Builder(id); + } + + @Override + public String toString() { + String pattern = "{0} '{'id: {1}'}'"; + return MessageFormat.format(pattern, this.getClass(), this.id); + } + + /** + * The builder of the table element props. + * + * @author arichard + */ + @SuppressWarnings("checkstyle:HiddenField") + public static final class Builder { + private String id; + + private String label; + + private List iconURL; + + private Supplier helpTextProvider; + + private boolean readOnly; + + private List children; + + private Builder(String id) { + this.id = Objects.requireNonNull(id); + } + + public TableWidgetElementProps.Builder label(String label) { + this.label = Objects.requireNonNull(label); + return this; + } + + public TableWidgetElementProps.Builder iconURL(List iconURL) { + this.iconURL = Objects.requireNonNull(iconURL); + return this; + } + + public TableWidgetElementProps.Builder readOnly(boolean readOnly) { + this.readOnly = readOnly; + return this; + } + + public TableWidgetElementProps.Builder helpTextProvider(Supplier helpTextProvider) { + this.helpTextProvider = Objects.requireNonNull(helpTextProvider); + return this; + } + + public TableWidgetElementProps.Builder children(List children) { + this.children = Objects.requireNonNull(children); + return this; + } + + public TableWidgetElementProps build() { + TableWidgetElementProps tableWidgetElementProps = new TableWidgetElementProps(); + tableWidgetElementProps.id = Objects.requireNonNull(this.id); + tableWidgetElementProps.label = Objects.requireNonNull(this.label); + tableWidgetElementProps.iconURL = this.iconURL; + tableWidgetElementProps.readOnly = this.readOnly; + tableWidgetElementProps.helpTextProvider = this.helpTextProvider; + tableWidgetElementProps.children = Objects.requireNonNull(this.children); + return tableWidgetElementProps; + } + } +} diff --git a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormComponentPropsValidator.java b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormComponentPropsValidator.java index 25414bcaab..99269a1365 100644 --- a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormComponentPropsValidator.java +++ b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormComponentPropsValidator.java @@ -60,6 +60,8 @@ import org.eclipse.sirius.components.forms.components.SliderComponentProps; import org.eclipse.sirius.components.forms.components.SplitButtonComponent; import org.eclipse.sirius.components.forms.components.SplitButtonComponentProps; +import org.eclipse.sirius.components.forms.components.TableWidgetComponent; +import org.eclipse.sirius.components.forms.components.TableWidgetComponentProps; import org.eclipse.sirius.components.forms.components.TextareaComponent; import org.eclipse.sirius.components.forms.components.TextareaComponentProps; import org.eclipse.sirius.components.forms.components.TextfieldComponent; @@ -74,6 +76,7 @@ import org.eclipse.sirius.components.forms.validation.DiagnosticComponentProps; import org.eclipse.sirius.components.representations.IComponentPropsValidator; import org.eclipse.sirius.components.representations.IProps; +import org.eclipse.sirius.components.tables.renderer.TableComponentPropsValidator; /** * Used to validate the properties of a component. @@ -83,6 +86,8 @@ public class FormComponentPropsValidator implements IComponentPropsValidator { private final List widgetDescriptors; + private final TableComponentPropsValidator tableComponentPropsValidator = new TableComponentPropsValidator(); + public FormComponentPropsValidator(List widgetDescriptors) { this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors); } @@ -148,13 +153,18 @@ public boolean validateComponentProps(Class componentType, IProps props) { checkValidProps = props instanceof SliderComponentProps; } else if (DateTimeComponent.class.equals(componentType)) { checkValidProps = props instanceof DateTimeComponentProps; + } else if (TableWidgetComponent.class.equals(componentType)) { + checkValidProps = props instanceof TableWidgetComponentProps; } else { - checkValidProps = this.widgetDescriptors.stream() - .map(widgetDescriptor -> widgetDescriptor.validateComponentProps(componentType, props)) - .filter(Optional::isPresent) - .findFirst() - .map(Optional::get) - .orElse(false); + checkValidProps = tableComponentPropsValidator.validateComponentProps(componentType, props); + if (!checkValidProps) { + checkValidProps = this.widgetDescriptors.stream() + .map(widgetDescriptor -> widgetDescriptor.validateComponentProps(componentType, props)) + .filter(Optional::isPresent) + .findFirst() + .map(Optional::get) + .orElse(false); + } } return checkValidProps; } diff --git a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormElementFactory.java b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormElementFactory.java index 923c0af535..4638874f71 100644 --- a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormElementFactory.java +++ b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormElementFactory.java @@ -43,6 +43,7 @@ import org.eclipse.sirius.components.forms.Select; import org.eclipse.sirius.components.forms.Slider; import org.eclipse.sirius.components.forms.SplitButton; +import org.eclipse.sirius.components.forms.TableWidget; import org.eclipse.sirius.components.forms.Textarea; import org.eclipse.sirius.components.forms.Textfield; import org.eclipse.sirius.components.forms.ToolbarAction; @@ -65,6 +66,7 @@ import org.eclipse.sirius.components.forms.elements.SelectElementProps; import org.eclipse.sirius.components.forms.elements.SliderElementProps; import org.eclipse.sirius.components.forms.elements.SplitButtonElementProps; +import org.eclipse.sirius.components.forms.elements.TableWidgetElementProps; import org.eclipse.sirius.components.forms.elements.TextareaElementProps; import org.eclipse.sirius.components.forms.elements.TextfieldElementProps; import org.eclipse.sirius.components.forms.elements.ToolbarActionElementProps; @@ -73,6 +75,8 @@ import org.eclipse.sirius.components.forms.validation.DiagnosticElementProps; import org.eclipse.sirius.components.representations.IElementFactory; import org.eclipse.sirius.components.representations.IProps; +import org.eclipse.sirius.components.tables.Table; +import org.eclipse.sirius.components.tables.renderer.TableElementFactory; /** * Used to instantiate the elements of the form. @@ -82,6 +86,8 @@ public class FormElementFactory implements IElementFactory { private final List widgetDescriptors; + private final TableElementFactory tableElementFactory = new TableElementFactory(); + public FormElementFactory(List widgetDescriptors) { this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors); } @@ -140,13 +146,18 @@ public Object instantiateElement(String type, IProps props, List childre object = this.instantiateSlider((SliderElementProps) props, children); } else if (DateTimeElementProps.TYPE.equals(type) && props instanceof DateTimeElementProps) { object = this.instantiateDateTime((DateTimeElementProps) props, children); + } else if (TableWidgetElementProps.TYPE.equals(type) && props instanceof TableWidgetElementProps) { + object = this.instantiateTableWidget((TableWidgetElementProps) props, children); } else { - object = this.widgetDescriptors.stream() - .map(widgetDescriptor -> widgetDescriptor.instanciate(type, props, children)) - .filter(Optional::isPresent) - .findFirst() - .map(Optional::get) - .orElse(null); + object = tableElementFactory.instantiateElement(type, props, children); + if (object == null) { + object = this.widgetDescriptors.stream() + .map(widgetDescriptor -> widgetDescriptor.instanciate(type, props, children)) + .filter(Optional::isPresent) + .findFirst() + .map(Optional::get) + .orElse(null); + } } return object; @@ -693,4 +704,25 @@ private List getDiagnosticsFromChildren(List children) { .toList(); } + private TableWidget instantiateTableWidget(TableWidgetElementProps props, List children) { + Optional
table = children.stream() + .filter(Table.class::isInstance) + .map(Table.class::cast) + .findFirst(); + + List diagnostics = this.getDiagnosticsFromChildren(children); + + TableWidget.Builder tableBuilder = TableWidget.newTableWidget(props.getId()) + .label(props.getLabel()) + .iconURL(props.getIconURL()) + .diagnostics(diagnostics) + .readOnly(props.isReadOnly()) + .table(table.get()); + + if (props.getHelpTextProvider() != null) { + tableBuilder.helpTextProvider(props.getHelpTextProvider()); + } + + return tableBuilder.build(); + } } diff --git a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormInstancePropsValidator.java b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormInstancePropsValidator.java index e6a4e4b1c2..aea3d7e24e 100644 --- a/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormInstancePropsValidator.java +++ b/packages/forms/backend/sirius-components-forms/src/main/java/org/eclipse/sirius/components/forms/renderer/FormInstancePropsValidator.java @@ -36,6 +36,7 @@ import org.eclipse.sirius.components.forms.elements.SelectElementProps; import org.eclipse.sirius.components.forms.elements.SliderElementProps; import org.eclipse.sirius.components.forms.elements.SplitButtonElementProps; +import org.eclipse.sirius.components.forms.elements.TableWidgetElementProps; import org.eclipse.sirius.components.forms.elements.TextareaElementProps; import org.eclipse.sirius.components.forms.elements.TextfieldElementProps; import org.eclipse.sirius.components.forms.elements.ToolbarActionElementProps; @@ -43,6 +44,7 @@ import org.eclipse.sirius.components.forms.validation.DiagnosticElementProps; import org.eclipse.sirius.components.representations.IInstancePropsValidator; import org.eclipse.sirius.components.representations.IProps; +import org.eclipse.sirius.components.tables.renderer.TableInstancePropsValidator; /** * Used to validate the instance props. @@ -50,6 +52,7 @@ * @author sbegaudeau */ public class FormInstancePropsValidator implements IInstancePropsValidator { + private final TableInstancePropsValidator tableInstancePropsValidator = new TableInstancePropsValidator(); private final List widgetDescriptors; @@ -112,13 +115,18 @@ public boolean validateInstanceProps(String type, IProps props) { checkValidProps = props instanceof SliderElementProps; } else if (DateTimeElementProps.TYPE.equals(type)) { checkValidProps = props instanceof DateTimeElementProps; + } else if (TableWidgetElementProps.TYPE.equals(type)) { + checkValidProps = props instanceof TableWidgetElementProps; } else { - checkValidProps = this.widgetDescriptors.stream() - .map(widgetDescriptor -> widgetDescriptor.validateInstanceProps(type, props)) - .filter(Optional::isPresent) - .findFirst() - .map(Optional::get) - .orElse(false); + checkValidProps = tableInstancePropsValidator.validateInstanceProps(type, props); + if (!checkValidProps) { + checkValidProps = this.widgetDescriptors.stream() + .map(widgetDescriptor -> widgetDescriptor.validateInstanceProps(type, props)) + .filter(Optional::isPresent) + .findFirst() + .map(Optional::get) + .orElse(false); + } } return checkValidProps; diff --git a/packages/forms/frontend/sirius-components-forms/package.json b/packages/forms/frontend/sirius-components-forms/package.json index ce4a71348a..0216a84879 100644 --- a/packages/forms/frontend/sirius-components-forms/package.json +++ b/packages/forms/frontend/sirius-components-forms/package.json @@ -35,13 +35,16 @@ "@apollo/client": "3.10.4", "@eclipse-sirius/sirius-components-core": "*", "@eclipse-sirius/sirius-components-charts": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@lexical/react": "0.8.1", "@mui/material": "5.15.19", "@mui/icons-material": "5.15.19", "@xstate/react": "3.0.0", "d3": "7.0.0", + "export-to-csv": "1.3.0", "graphql": "16.8.1", "lexical": "0.8.1", + "material-react-table": "2.13.3", "react": "18.3.1", "react-dom": "18.3.1", "tss-react": "4.9.7", @@ -51,6 +54,7 @@ "@apollo/client": "3.10.4", "@eclipse-sirius/sirius-components-core": "*", "@eclipse-sirius/sirius-components-charts": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-tsconfig": "*", "@lexical/react": "0.8.1", "@mui/material": "5.15.19", @@ -63,9 +67,11 @@ "@vitest/coverage-v8": "1.6.0", "jsdom": "16.7.0", "d3": "7.0.0", + "export-to-csv": "1.3.0", "graphql": "16.8.1", "prettier": "2.7.1", "lexical": "0.8.1", + "material-react-table": "2.13.3", "rollup-plugin-peer-deps-external": "2.2.4", "react": "18.3.1", "react-dom": "18.3.1", diff --git a/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.ts b/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.ts index c9dac697ac..daeb0019d2 100644 --- a/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.ts +++ b/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.ts @@ -304,6 +304,52 @@ export const widgetFields = ` } } + fragment tableWidgetFields on TableWidget { + label + iconURL + table { + id + columns { + id + label + targetObjectId + targetObjectKind + } + lines { + id + targetObjectId + targetObjectKind + cells { + __typename + id + targetObjectId + targetObjectKind + columnId + ... on CheckboxCell { + booleanValue: value + } + ... on SelectCell { + value + options { + id + label + } + } + ... on MultiSelectCell { + values + options { + id + label + } + } + ... on TextfieldCell { + stringValue: value + } + } + } + } + } + fragment widgetFields on Widget { ...commonFields ... on Textfield { @@ -359,6 +405,9 @@ export const widgetFields = ` } ... on DateTime { ...dateTimeFields + } + ... on TableWidget { + ...tableWidgetFields } } `; diff --git a/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.types.ts b/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.types.ts index 4ca6e5c861..09241afd18 100644 --- a/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.types.ts +++ b/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.types.ts @@ -11,6 +11,8 @@ * Obeo - initial API and implementation *******************************************************************************/ +import { GQLTable } from '@eclipse-sirius/sirius-components-tables'; + export interface GQLFormEventSubscription { formEvent: GQLFormEventPayload; } @@ -392,3 +394,7 @@ export interface GQLDateTimeStyle { italic: boolean | null; bold: boolean | null; } + +export interface GQLTableWidget extends GQLWidget { + table: GQLTable; +} diff --git a/packages/forms/frontend/sirius-components-forms/src/propertysections/DateTimeWidgetPropertySection.tsx b/packages/forms/frontend/sirius-components-forms/src/propertysections/DateTimeWidgetPropertySection.tsx index 9ab9f22634..e610513c34 100644 --- a/packages/forms/frontend/sirius-components-forms/src/propertysections/DateTimeWidgetPropertySection.tsx +++ b/packages/forms/frontend/sirius-components-forms/src/propertysections/DateTimeWidgetPropertySection.tsx @@ -161,21 +161,26 @@ export const DateTimeWidgetPropertySection: PropertySectionComponent { - const dateTime = new Date(dateTimeString); - - // Get the local date and time components - const year = String(dateTime.getFullYear()).padStart(4, '0'); - const month = String(dateTime.getMonth() + 1).padStart(2, '0'); - const day = String(dateTime.getDate()).padStart(2, '0'); - const hours = String(dateTime.getHours()).padStart(2, '0'); - const minutes = String(dateTime.getMinutes()).padStart(2, '0'); - - if (dateTimeType === 'DATE') { - return `${year}-${month}-${day}`; - } else if (dateTimeType === 'TIME') { - return `${hours}:${minutes}`; + let formattedDateTimeString = ''; + if (dateTimeString) { + const dateTime = new Date(dateTimeString); + + // Get the local date and time components + const year = String(dateTime.getFullYear()).padStart(4, '0'); + const month = String(dateTime.getMonth() + 1).padStart(2, '0'); + const day = String(dateTime.getDate()).padStart(2, '0'); + const hours = String(dateTime.getHours()).padStart(2, '0'); + const minutes = String(dateTime.getMinutes()).padStart(2, '0'); + + if (dateTimeType === 'DATE') { + formattedDateTimeString = `${year}-${month}-${day}`; + } else if (dateTimeType === 'TIME') { + formattedDateTimeString = `${hours}:${minutes}`; + } else { + formattedDateTimeString = `${year}-${month}-${day}T${hours}:${minutes}`; + } } - return `${year}-${month}-${day}T${hours}:${minutes}`; + return formattedDateTimeString; }; const convertToUTCDateTimeString = (dateTimeType: string, dateTimeString: string): string => { diff --git a/packages/forms/frontend/sirius-components-forms/src/propertysections/PropertySection.tsx b/packages/forms/frontend/sirius-components-forms/src/propertysections/PropertySection.tsx index 2b608daf67..469ee53695 100644 --- a/packages/forms/frontend/sirius-components-forms/src/propertysections/PropertySection.tsx +++ b/packages/forms/frontend/sirius-components-forms/src/propertysections/PropertySection.tsx @@ -27,6 +27,7 @@ import { GQLSelect, GQLSlider, GQLSplitButton, + GQLTableWidget, GQLTextarea, GQLTextfield, GQLTree, @@ -49,6 +50,7 @@ import { RichTextPropertySection } from './RichTextPropertySection'; import { SelectPropertySection } from './SelectPropertySection'; import { SliderPropertySection } from './SliderPropertySection'; import { SplitButtonPropertySection } from './SplitButtonPropertySection'; +import { TableWidgetPropertySection } from './TableWidgetPropertySection'; import { TextfieldPropertySection } from './TextfieldPropertySection'; import { TreePropertySection } from './TreePropertySection'; @@ -71,6 +73,7 @@ const isFlexboxContainer = (widget: GQLWidget): widget is GQLFlexboxContainer => const isTree = (widget: GQLWidget): widget is GQLTree => widget.__typename === 'TreeWidget'; const isImage = (widget: GQLWidget): widget is GQLImage => widget.__typename === 'Image'; const isRichText = (widget: GQLWidget): widget is GQLRichText => widget.__typename === 'RichText'; +const isTableWidget = (widget: GQLWidget): widget is GQLTableWidget => widget.__typename === 'TableWidget'; export const PropertySection = ({ editingContextId, formId, widget, readOnly }: PropertySectionProps) => { const { data: widgetContributions } = useData(widgetContributionExtensionPoint); @@ -246,6 +249,16 @@ export const PropertySection = ({ editingContextId, formId, widget, readOnly }: readOnly={readOnly} /> ); + } else if (isTableWidget(widget)) { + propertySection = ( + + ); } else { const CustomWidgetComponent = widgetContributions .map((widgetContribution) => widgetContribution.component(widget)) diff --git a/packages/forms/frontend/sirius-components-forms/src/propertysections/TableWidgetPropertySection.tsx b/packages/forms/frontend/sirius-components-forms/src/propertysections/TableWidgetPropertySection.tsx new file mode 100644 index 0000000000..4e5dda2457 --- /dev/null +++ b/packages/forms/frontend/sirius-components-forms/src/propertysections/TableWidgetPropertySection.tsx @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2024 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 { TableContent } from '@eclipse-sirius/sirius-components-tables'; +import { makeStyles } from 'tss-react/mui'; +import { PropertySectionComponent, PropertySectionComponentProps } from '../form/Form.types'; +import { GQLTableWidget } from '../form/FormEventFragments.types'; +import { PropertySectionLabel } from './PropertySectionLabel'; + +const useStyle = makeStyles()(() => ({ + main: { + display: 'grid', + }, +})); + +export const TableWidgetPropertySection: PropertySectionComponent = ({ + editingContextId, + formId, + widget, +}: PropertySectionComponentProps) => { + const { classes } = useStyle(); + + return ( +
+ + +
+ ); +}; diff --git a/packages/forms/frontend/sirius-components-widget-reference/package.json b/packages/forms/frontend/sirius-components-widget-reference/package.json index dbf4f31711..b3c2eba527 100644 --- a/packages/forms/frontend/sirius-components-widget-reference/package.json +++ b/packages/forms/frontend/sirius-components-widget-reference/package.json @@ -35,14 +35,17 @@ "@apollo/client": "3.10.4", "@eclipse-sirius/sirius-components-core": "*", "@eclipse-sirius/sirius-components-forms": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-trees": "*", "@lexical/react": "0.8.1", "@mui/material": "5.15.19", "@mui/icons-material": "5.15.19", "@xstate/react": "3.0.0", "d3": "7.0.0", + "export-to-csv": "1.3.0", "graphql": "16.8.1", "lexical": "0.8.1", + "material-react-table": "2.13.3", "react": "18.3.1", "react-dom": "18.3.1", "tss-react": "4.9.7", @@ -52,6 +55,7 @@ "@apollo/client": "3.10.4", "@eclipse-sirius/sirius-components-core": "*", "@eclipse-sirius/sirius-components-forms": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-trees": "*", "@eclipse-sirius/sirius-components-tsconfig": "*", "@lexical/react": "0.8.1", @@ -65,9 +69,11 @@ "@vitest/coverage-v8": "1.6.0", "jsdom": "16.7.0", "d3": "7.0.0", + "export-to-csv": "1.3.0", "graphql": "16.8.1", "prettier": "2.7.1", "lexical": "0.8.1", + "material-react-table": "2.13.3", "rollup-plugin-peer-deps-external": "2.2.4", "react": "18.3.1", "react-dom": "18.3.1", diff --git a/packages/pom.xml b/packages/pom.xml index e519946cae..111a9761c8 100644 --- a/packages/pom.xml +++ b/packages/pom.xml @@ -50,6 +50,7 @@ deck/backend formdescriptioneditors/backend forms/backend + tables/backend selection/backend trees/backend validation/backend diff --git a/packages/releng/backend/sirius-components-test-coverage/pom.xml b/packages/releng/backend/sirius-components-test-coverage/pom.xml index 725f6567c0..04143062a0 100644 --- a/packages/releng/backend/sirius-components-test-coverage/pom.xml +++ b/packages/releng/backend/sirius-components-test-coverage/pom.xml @@ -12,8 +12,8 @@ Obeo - initial API and implementation --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.springframework.boot @@ -150,6 +150,11 @@ sirius-components-representations 2024.9.8 + + org.eclipse.sirius + sirius-components-tables + 2024.9.8 + org.eclipse.sirius sirius-components-selection @@ -205,6 +210,11 @@ sirius-components-collaborative-selection 2024.9.8 + + org.eclipse.sirius + sirius-components-collaborative-tables + 2024.9.8 + org.eclipse.sirius sirius-components-collaborative-trees @@ -255,6 +265,11 @@ sirius-components-portals-graphql 2024.9.8 + + org.eclipse.sirius + sirius-components-tables-graphql + 2024.9.8 + org.eclipse.sirius sirius-components-trees-graphql @@ -455,4 +470,4 @@ - + \ No newline at end of file diff --git a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/diagram/services/filter/DiagramFilterEventProcessorFactory.java b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/diagram/services/filter/DiagramFilterEventProcessorFactory.java index 192fd48bf9..c0e855834d 100644 --- a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/diagram/services/filter/DiagramFilterEventProcessorFactory.java +++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/diagram/services/filter/DiagramFilterEventProcessorFactory.java @@ -29,9 +29,11 @@ import org.eclipse.sirius.components.collaborative.forms.api.IFormPostProcessor; import org.eclipse.sirius.components.collaborative.forms.configuration.FormEventProcessorConfiguration; import org.eclipse.sirius.components.collaborative.forms.configuration.FormEventProcessorFactoryConfiguration; +import org.eclipse.sirius.components.collaborative.tables.api.ITableEventHandler; import org.eclipse.sirius.components.core.URLParser; import org.eclipse.sirius.components.core.api.IEditingContext; import org.eclipse.sirius.components.core.api.IObjectService; +import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService; import org.eclipse.sirius.components.forms.description.FormDescription; import org.eclipse.sirius.components.forms.renderer.IWidgetDescriptor; import org.eclipse.sirius.web.application.diagram.services.filter.api.IDiagramFilterDescriptionProvider; @@ -51,24 +53,30 @@ public class DiagramFilterEventProcessorFactory implements IRepresentationEventP private final IRepresentationSearchService representationSearchService; + private final IRepresentationDescriptionSearchService representationDescriptionSearchService; + private final List widgetDescriptors; private final List formEventHandlers; + private final List tableEventHandlers; + private final ISubscriptionManagerFactory subscriptionManagerFactory; private final IRepresentationRefreshPolicyRegistry representationRefreshPolicyRegistry; private final IFormPostProcessor formPostProcessor; - public DiagramFilterEventProcessorFactory(RepresentationEventProcessorFactoryConfiguration configuration, IRepresentationSearchService representationSearchService, + public DiagramFilterEventProcessorFactory(RepresentationEventProcessorFactoryConfiguration configuration, IDiagramFilterDescriptionProvider diagramFilterDescriptionProvider, List widgetDescriptors, FormEventProcessorFactoryConfiguration formConfiguration) { this.diagramFilterDescriptionProvider = Objects.requireNonNull(diagramFilterDescriptionProvider); this.objectService = Objects.requireNonNull(formConfiguration.getObjectService()); - this.representationSearchService = Objects.requireNonNull(representationSearchService); + this.representationSearchService = Objects.requireNonNull(configuration.getRepresentationSearchService()); + this.representationDescriptionSearchService = Objects.requireNonNull(configuration.getRepresentationDescriptionSearchService()); this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors); this.formEventHandlers = Objects.requireNonNull(formConfiguration.getFormEventHandlers()); + this.tableEventHandlers = Objects.requireNonNull(formConfiguration.getTableEventHandlers()); this.subscriptionManagerFactory = Objects.requireNonNull(configuration.getSubscriptionManagerFactory()); this.representationRefreshPolicyRegistry = Objects.requireNonNull(configuration.getRepresentationRefreshPolicyRegistry()); this.formPostProcessor = Objects.requireNonNull(formConfiguration.getFormPostProcessor()); @@ -100,8 +108,9 @@ public Optional createRepresentationEventProcesso .selection(objects) .build(); - var formEventProcessorConfiguration = new FormEventProcessorConfiguration(editingContext, this.objectService, formCreationParameters, this.widgetDescriptors, this.formEventHandlers); - IRepresentationEventProcessor formEventProcessor = new FormEventProcessor(formEventProcessorConfiguration, this.subscriptionManagerFactory.create(), this.representationSearchService, this.representationRefreshPolicyRegistry, this.formPostProcessor); + var formEventProcessorConfiguration = new FormEventProcessorConfiguration(editingContext, this.objectService, formCreationParameters, this.widgetDescriptors, this.formEventHandlers, this.tableEventHandlers); + IRepresentationEventProcessor formEventProcessor = new FormEventProcessor(formEventProcessorConfiguration, this.subscriptionManagerFactory.create(), this.representationSearchService, + this.representationDescriptionSearchService, this.representationRefreshPolicyRegistry, this.formPostProcessor); return Optional.of(formEventProcessor); } diff --git a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/details/services/PropertiesEventProcessorFactory.java b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/details/services/PropertiesEventProcessorFactory.java index cc10ec2a11..7a1e4d348f 100644 --- a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/details/services/PropertiesEventProcessorFactory.java +++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/details/services/PropertiesEventProcessorFactory.java @@ -32,9 +32,11 @@ import org.eclipse.sirius.components.collaborative.forms.api.IPropertiesDescriptionService; import org.eclipse.sirius.components.collaborative.forms.configuration.FormEventProcessorConfiguration; import org.eclipse.sirius.components.collaborative.forms.configuration.FormEventProcessorFactoryConfiguration; +import org.eclipse.sirius.components.collaborative.tables.api.ITableEventHandler; import org.eclipse.sirius.components.core.URLParser; import org.eclipse.sirius.components.core.api.IEditingContext; import org.eclipse.sirius.components.core.api.IObjectService; +import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService; import org.eclipse.sirius.components.forms.description.FormDescription; import org.eclipse.sirius.components.forms.description.PageDescription; import org.eclipse.sirius.components.forms.renderer.IWidgetDescriptor; @@ -62,20 +64,26 @@ public class PropertiesEventProcessorFactory implements IRepresentationEventProc private final List formEventHandlers; + private final List tableEventHandlers; + private final ISubscriptionManagerFactory subscriptionManagerFactory; private final IRepresentationRefreshPolicyRegistry representationRefreshPolicyRegistry; private final IFormPostProcessor formPostProcessor; + private final IRepresentationDescriptionSearchService representationDescriptionSearchService; + public PropertiesEventProcessorFactory(IPropertiesDescriptionService propertiesDescriptionService, IPropertiesDefaultDescriptionProvider propertiesDefaultDescriptionProvider, List widgetDescriptors, RepresentationEventProcessorFactoryConfiguration configuration, FormEventProcessorFactoryConfiguration formConfiguration) { this.propertiesDescriptionService = Objects.requireNonNull(propertiesDescriptionService); this.propertiesDefaultDescriptionProvider = Objects.requireNonNull(propertiesDefaultDescriptionProvider); this.objectService = Objects.requireNonNull(formConfiguration.getObjectService()); this.representationSearchService = Objects.requireNonNull(configuration.getRepresentationSearchService()); + this.representationDescriptionSearchService = Objects.requireNonNull(configuration.getRepresentationDescriptionSearchService()); this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors); this.formEventHandlers = Objects.requireNonNull(formConfiguration.getFormEventHandlers()); + this.tableEventHandlers = Objects.requireNonNull(formConfiguration.getTableEventHandlers()); this.subscriptionManagerFactory = Objects.requireNonNull(configuration.getSubscriptionManagerFactory()); this.representationRefreshPolicyRegistry = Objects.requireNonNull(configuration.getRepresentationRefreshPolicyRegistry()); this.formPostProcessor = Objects.requireNonNull(formConfiguration.getFormPostProcessor()); @@ -114,9 +122,10 @@ public Optional createRepresentationEventProcesso .build(); IRepresentationEventProcessor formEventProcessor = new FormEventProcessor( - new FormEventProcessorConfiguration(editingContext, this.objectService, formCreationParameters, this.widgetDescriptors, this.formEventHandlers), + new FormEventProcessorConfiguration(editingContext, this.objectService, formCreationParameters, this.widgetDescriptors, this.formEventHandlers, this.tableEventHandlers), this.subscriptionManagerFactory.create(), this.representationSearchService, + this.representationDescriptionSearchService, this.representationRefreshPolicyRegistry, this.formPostProcessor); diff --git a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/relatedelements/services/RelatedElementsEventProcessorFactory.java b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/relatedelements/services/RelatedElementsEventProcessorFactory.java index 7b32ebcb4b..025695e5d4 100644 --- a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/relatedelements/services/RelatedElementsEventProcessorFactory.java +++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/relatedelements/services/RelatedElementsEventProcessorFactory.java @@ -30,9 +30,11 @@ import org.eclipse.sirius.components.collaborative.forms.api.IRelatedElementsDescriptionProvider; import org.eclipse.sirius.components.collaborative.forms.configuration.FormEventProcessorConfiguration; import org.eclipse.sirius.components.collaborative.forms.configuration.FormEventProcessorFactoryConfiguration; +import org.eclipse.sirius.components.collaborative.tables.api.ITableEventHandler; import org.eclipse.sirius.components.core.URLParser; import org.eclipse.sirius.components.core.api.IEditingContext; import org.eclipse.sirius.components.core.api.IObjectService; +import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService; import org.eclipse.sirius.components.forms.description.FormDescription; import org.eclipse.sirius.components.forms.renderer.IWidgetDescriptor; import org.springframework.stereotype.Service; @@ -51,10 +53,14 @@ public class RelatedElementsEventProcessorFactory implements IRepresentationEven private final IRepresentationSearchService representationSearchService; + private final IRepresentationDescriptionSearchService representationDescriptionSearchService; + private final List widgetDescriptors; private final List formEventHandlers; + private final List tableEventHandlers; + private final ISubscriptionManagerFactory subscriptionManagerFactory; private final IRepresentationRefreshPolicyRegistry representationRefreshPolicyRegistry; @@ -66,8 +72,10 @@ public RelatedElementsEventProcessorFactory(RepresentationEventProcessorFactoryC this.relatedElementsDescriptionProvider = Objects.requireNonNull(relatedElementsDescriptionProvider); this.objectService = Objects.requireNonNull(formConfiguration.getObjectService()); this.representationSearchService = Objects.requireNonNull(configuration.getRepresentationSearchService()); + this.representationDescriptionSearchService = Objects.requireNonNull(configuration.getRepresentationDescriptionSearchService()); this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors); this.formEventHandlers = Objects.requireNonNull(formConfiguration.getFormEventHandlers()); + this.tableEventHandlers = Objects.requireNonNull(formConfiguration.getTableEventHandlers()); this.subscriptionManagerFactory = Objects.requireNonNull(configuration.getSubscriptionManagerFactory()); this.representationRefreshPolicyRegistry = Objects.requireNonNull(configuration.getRepresentationRefreshPolicyRegistry()); this.formPostProcessor = Objects.requireNonNull(formConfiguration.getFormPostProcessor()); @@ -99,9 +107,10 @@ public Optional createRepresentationEventProcesso .build(); IRepresentationEventProcessor formEventProcessor = new FormEventProcessor( - new FormEventProcessorConfiguration(editingContext, this.objectService, formCreationParameters, this.widgetDescriptors, this.formEventHandlers), + new FormEventProcessorConfiguration(editingContext, this.objectService, formCreationParameters, this.widgetDescriptors, this.formEventHandlers, this.tableEventHandlers), this.subscriptionManagerFactory.create(), this.representationSearchService, + this.representationDescriptionSearchService, this.representationRefreshPolicyRegistry, this.formPostProcessor); diff --git a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/representations/services/RepresentationsEventProcessorFactory.java b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/representations/services/RepresentationsEventProcessorFactory.java index 1d827555db..d19da4eb5a 100644 --- a/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/representations/services/RepresentationsEventProcessorFactory.java +++ b/packages/sirius-web/backend/sirius-web-application/src/main/java/org/eclipse/sirius/web/application/views/representations/services/RepresentationsEventProcessorFactory.java @@ -30,9 +30,11 @@ import org.eclipse.sirius.components.collaborative.forms.api.IRepresentationsDescriptionProvider; import org.eclipse.sirius.components.collaborative.forms.configuration.FormEventProcessorConfiguration; import org.eclipse.sirius.components.collaborative.forms.configuration.FormEventProcessorFactoryConfiguration; +import org.eclipse.sirius.components.collaborative.tables.api.ITableEventHandler; import org.eclipse.sirius.components.core.URLParser; import org.eclipse.sirius.components.core.api.IEditingContext; import org.eclipse.sirius.components.core.api.IObjectService; +import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService; import org.eclipse.sirius.components.forms.description.FormDescription; import org.eclipse.sirius.components.forms.renderer.IWidgetDescriptor; import org.springframework.stereotype.Service; @@ -51,10 +53,14 @@ public class RepresentationsEventProcessorFactory implements IRepresentationEven private final IRepresentationSearchService representationSearchService; + private final IRepresentationDescriptionSearchService representationDescriptionSearchService; + private final List widgetDescriptors; private final List formEventHandlers; + private final List tableEventHandlers; + private final ISubscriptionManagerFactory subscriptionManagerFactory; private final IRepresentationRefreshPolicyRegistry representationRefreshPolicyRegistry; @@ -66,8 +72,10 @@ public RepresentationsEventProcessorFactory(IRepresentationsDescriptionProvider this.representationsDescriptionProvider = Objects.requireNonNull(representationsDescriptionProvider); this.objectService = Objects.requireNonNull(formConfiguration.getObjectService()); this.representationSearchService = Objects.requireNonNull(configuration.getRepresentationSearchService()); + this.representationDescriptionSearchService = Objects.requireNonNull(configuration.getRepresentationDescriptionSearchService()); this.widgetDescriptors = Objects.requireNonNull(widgetDescriptors); this.formEventHandlers = Objects.requireNonNull(formConfiguration.getFormEventHandlers()); + this.tableEventHandlers = Objects.requireNonNull(formConfiguration.getTableEventHandlers()); this.subscriptionManagerFactory = Objects.requireNonNull(subscriptionManagerFactory); this.representationRefreshPolicyRegistry = Objects.requireNonNull(representationRefreshPolicyRegistry); this.formPostProcessor = Objects.requireNonNull(formConfiguration.getFormPostProcessor()); @@ -99,9 +107,10 @@ public Optional createRepresentationEventProcesso .build(); IRepresentationEventProcessor formEventProcessor = new FormEventProcessor( - new FormEventProcessorConfiguration(editingContext, this.objectService, formCreationParameters, this.widgetDescriptors, this.formEventHandlers), + new FormEventProcessorConfiguration(editingContext, this.objectService, formCreationParameters, this.widgetDescriptors, this.formEventHandlers, this.tableEventHandlers), this.subscriptionManagerFactory.create(), this.representationSearchService, + this.representationDescriptionSearchService, this.representationRefreshPolicyRegistry, this.formPostProcessor); diff --git a/packages/sirius-web/backend/sirius-web-starter/pom.xml b/packages/sirius-web/backend/sirius-web-starter/pom.xml index 6ccd6566c5..ef45daf711 100644 --- a/packages/sirius-web/backend/sirius-web-starter/pom.xml +++ b/packages/sirius-web/backend/sirius-web-starter/pom.xml @@ -12,8 +12,8 @@ Obeo - initial API and implementation --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.springframework.boot @@ -99,6 +99,11 @@ sirius-components-selection-graphql 2024.9.8 + + org.eclipse.sirius + sirius-components-tables-graphql + 2024.9.8 + org.eclipse.sirius sirius-components-trees-graphql @@ -218,7 +223,8 @@ maven-checkstyle-plugin 3.4.0 - ../../../releng/backend/sirius-components-resources/checkstyle/CheckstyleConfiguration.xml + + ../../../releng/backend/sirius-components-resources/checkstyle/CheckstyleConfiguration.xml true true true @@ -266,4 +272,4 @@ - + \ No newline at end of file diff --git a/packages/sirius-web/backend/sirius-web-starter/src/main/java/org/eclipse/sirius/web/starter/SiriusWebStarterConfiguration.java b/packages/sirius-web/backend/sirius-web-starter/src/main/java/org/eclipse/sirius/web/starter/SiriusWebStarterConfiguration.java index 4a5cb3ce01..b4541b1f1a 100644 --- a/packages/sirius-web/backend/sirius-web-starter/src/main/java/org/eclipse/sirius/web/starter/SiriusWebStarterConfiguration.java +++ b/packages/sirius-web/backend/sirius-web-starter/src/main/java/org/eclipse/sirius/web/starter/SiriusWebStarterConfiguration.java @@ -62,6 +62,7 @@ "org.eclipse.sirius.components.gantt", "org.eclipse.sirius.components.portals", "org.eclipse.sirius.components.selection", + "org.eclipse.sirius.components.tables", "org.eclipse.sirius.components.trees", "org.eclipse.sirius.components.validation", "org.eclipse.sirius.components.view.emf", diff --git a/packages/sirius-web/backend/sirius-web-tests/pom.xml b/packages/sirius-web/backend/sirius-web-tests/pom.xml index 208b89036d..602cb10a6a 100644 --- a/packages/sirius-web/backend/sirius-web-tests/pom.xml +++ b/packages/sirius-web/backend/sirius-web-tests/pom.xml @@ -65,6 +65,11 @@ sirius-components-forms-tests 2024.9.8 + + org.eclipse.sirius + sirius-components-tables-tests + 2024.9.8 + org.eclipse.sirius sirius-components-collaborative-formdescriptioneditors @@ -89,7 +94,8 @@ maven-checkstyle-plugin 3.4.0 - ../../../releng/backend/sirius-components-resources/checkstyle/CheckstyleConfiguration.xml + + ../../../releng/backend/sirius-components-resources/checkstyle/CheckstyleConfiguration.xml true true true @@ -137,4 +143,4 @@ - + \ No newline at end of file diff --git a/packages/sirius-web/backend/sirius-web/pom.xml b/packages/sirius-web/backend/sirius-web/pom.xml index c28f2727a4..24a0b0f143 100644 --- a/packages/sirius-web/backend/sirius-web/pom.xml +++ b/packages/sirius-web/backend/sirius-web/pom.xml @@ -145,6 +145,12 @@ 2024.9.8 test + + org.eclipse.sirius + sirius-components-tables-tests + 2024.9.8 + test + @@ -169,7 +175,8 @@ maven-checkstyle-plugin 3.4.0 - ../../../releng/backend/sirius-components-resources/checkstyle/CheckstyleConfiguration.xml + + ../../../releng/backend/sirius-components-resources/checkstyle/CheckstyleConfiguration.xml true true true @@ -217,4 +224,4 @@ - + \ No newline at end of file diff --git a/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/application/controllers/forms/TableControllerTests.java b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/application/controllers/forms/TableControllerTests.java new file mode 100644 index 0000000000..59e40925c3 --- /dev/null +++ b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/application/controllers/forms/TableControllerTests.java @@ -0,0 +1,296 @@ +/******************************************************************************* + * Copyright (c) 2024 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.web.application.controllers.forms; + +import static org.assertj.core.api.Assertions.fail; +import static org.eclipse.sirius.components.tables.tests.assertions.TablesAssertions.assertThat; + +import com.jayway.jsonpath.JsonPath; + +import java.time.Duration; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Consumer; + +import org.eclipse.sirius.components.collaborative.dto.CreateRepresentationInput; +import org.eclipse.sirius.components.collaborative.forms.dto.FormRefreshedEventPayload; +import org.eclipse.sirius.components.collaborative.tables.dto.EditCheckboxCellInput; +import org.eclipse.sirius.components.collaborative.tables.dto.EditMultiSelectCellInput; +import org.eclipse.sirius.components.collaborative.tables.dto.EditSelectCellInput; +import org.eclipse.sirius.components.collaborative.tables.dto.EditTextfieldCellInput; +import org.eclipse.sirius.components.core.api.SuccessPayload; +import org.eclipse.sirius.components.forms.Form; +import org.eclipse.sirius.components.forms.TableWidget; +import org.eclipse.sirius.components.forms.tests.navigation.FormNavigator; +import org.eclipse.sirius.components.tables.Line; +import org.eclipse.sirius.components.tables.Table; +import org.eclipse.sirius.components.tables.tests.graphql.EditCheckboxCellMutationRunner; +import org.eclipse.sirius.components.tables.tests.graphql.EditMultiSelectCellMutationRunner; +import org.eclipse.sirius.components.tables.tests.graphql.EditSelectCellMutationRunner; +import org.eclipse.sirius.components.tables.tests.graphql.EditTextfieldCellMutationRunner; +import org.eclipse.sirius.components.tables.tests.navigation.LineNavigator; +import org.eclipse.sirius.components.tables.tests.navigation.TableNavigator; +import org.eclipse.sirius.web.AbstractIntegrationTests; +import org.eclipse.sirius.web.data.PapayaIdentifiers; +import org.eclipse.sirius.web.services.forms.FormWithTableEditingContextDescriptionProvider; +import org.eclipse.sirius.web.tests.services.api.IGivenCreatedFormSubscription; +import org.eclipse.sirius.web.tests.services.api.IGivenInitialServerState; +import org.jetbrains.annotations.NotNull; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.jdbc.SqlConfig; +import org.springframework.transaction.annotation.Transactional; + +import reactor.core.publisher.Flux; +import reactor.test.StepVerifier; + +/** + * Integration tests of the table widget. + * + * @author lfasani + */ +@Transactional +@SuppressWarnings("checkstyle:MultipleStringLiterals") +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = { "sirius.web.test.enabled=studio" }) +public class TableControllerTests extends AbstractIntegrationTests { + + @Autowired + private IGivenInitialServerState givenInitialServerState; + + @Autowired + private IGivenCreatedFormSubscription givenCreatedFormSubscription; + + @Autowired + private EditTextfieldCellMutationRunner editTextfieldCellMutationRunner; + + @Autowired + private EditSelectCellMutationRunner editSelectCellMutationRunner; + + @Autowired + private EditCheckboxCellMutationRunner editCheckboxCellMutationRunner; + + @Autowired + private EditMultiSelectCellMutationRunner editMultiSelectCellMutationRunner; + + @BeforeEach + public void beforeEach() { + this.givenInitialServerState.initialize(); + } + + private Flux givenSubscriptionToFormWithTableWidget() { + var input = new CreateRepresentationInput(UUID.randomUUID(), PapayaIdentifiers.PAPAYA_PROJECT.toString(), FormWithTableEditingContextDescriptionProvider.TASK_FORM_ID, + PapayaIdentifiers.FIRST_ITERATION_OBJECT.toString(), "FormWithTable"); + return this.givenCreatedFormSubscription.createAndSubscribe(input); + } + + @Test + @DisplayName("Given a table widget, when it is displayed, then it is properly initialized") + @Sql(scripts = { "/scripts/papaya.sql" }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + public void givenTableWidgetWhenItIsDisplayedThenItIsProperlyInitialized() { + var flux = this.givenSubscriptionToFormWithTableWidget(); + + Consumer initialFormContentConsumer = payload -> Optional.of(payload).filter(FormRefreshedEventPayload.class::isInstance).map(FormRefreshedEventPayload.class::cast) + .map(FormRefreshedEventPayload::form).ifPresentOrElse(form -> { + var tableWidget = new FormNavigator(form).page("Iteration Page").group("Iteration Group").findWidget("Tasks", TableWidget.class); + assertThat(tableWidget.getTable().getColumns()).hasSize(9); + assertThat(tableWidget.getTable().getLines()).hasSize(3); + assertThat(tableWidget.getTable()).hasFieldOrPropertyWithValue("label", "Iteration 2024.3.0"); + assertThat(tableWidget.getTable().getLines().stream().flatMap(line -> line.getCells().stream()).toList()).hasSize(9 * 3); + Line line = tableWidget.getTable().getLines().get(0); + LineNavigator lineNavigator = new LineNavigator(line); + + TableNavigator tableNavigator = new TableNavigator(tableWidget.getTable()); + assertThat(lineNavigator.textfieldCellByColumnId(tableNavigator.column("Name").getId())).hasValue("Improve some features of the deck"); + assertThat(lineNavigator.checkboxCellByColumnId(tableNavigator.column("Done").getId())).hasValue(false); + assertThat(lineNavigator.selectCellByColumnId(tableNavigator.column("Priority").getId())).hasValue("P1"); + assertThat(lineNavigator.multiSelectCellByColumnId(tableNavigator.column("Dependencies").getId())).hasValues(List.of()); + + }, () -> fail("Missing form")); + + StepVerifier.create(flux).consumeNextWith(initialFormContentConsumer).thenCancel().verify(Duration.ofSeconds(10)); + } + + @Test + @DisplayName("Given a table widget, when the cells are edited, then the values are updated") + @Sql(scripts = { "/scripts/papaya.sql" }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) + public void givenTableWidgetWhenValuesAreEditedThenValuesAreUpdated() { + var flux = this.givenSubscriptionToFormWithTableWidget(); + + var formId = new AtomicReference(); + var tableId = new AtomicReference(); + var lineId = new AtomicReference(); + var textfieldCellId = new AtomicReference(); + var checkboxCellId = new AtomicReference(); + var selectCellId = new AtomicReference(); + var multiSelectCellId = new AtomicReference(); + + Consumer initialFormContentConsumer = payload -> Optional.of(payload).filter(FormRefreshedEventPayload.class::isInstance).map(FormRefreshedEventPayload.class::cast) + .map(FormRefreshedEventPayload::form).ifPresentOrElse(form -> { + formId.set(form.getId()); + + var table = getTable(form); + tableId.set(table.getId()); + Line line = table.getLines().get(0); + LineNavigator lineNavigator = new LineNavigator(line); + lineId.set(line.getId()); + + TableNavigator tableNavigator = new TableNavigator(table); + textfieldCellId.set(lineNavigator.textfieldCellByColumnId(tableNavigator.column("Name").getId()).getId()); + + }, () -> fail("Missing form")); + + Runnable editNameTextfieldCell = () -> { + var input = new EditTextfieldCellInput(UUID.randomUUID(), PapayaIdentifiers.PAPAYA_PROJECT.toString(), formId.get(), tableId.get(), textfieldCellId.get().toString(), "newName"); + var result = this.editTextfieldCellMutationRunner.run(input); + + String typename = JsonPath.read(result, "$.data.editTextfieldCell.__typename"); + assertThat(typename).isEqualTo(SuccessPayload.class.getSimpleName()); + }; + + Consumer editNameConsumer = getEditNameConsumer(tableId, selectCellId); + + Runnable editPrioritySelectCell = () -> { + var input = new EditSelectCellInput(UUID.randomUUID(), PapayaIdentifiers.PAPAYA_PROJECT.toString(), formId.get(), tableId.get(), selectCellId.get().toString(), "P2"); + var result = this.editSelectCellMutationRunner.run(input); + + String typename = JsonPath.read(result, "$.data.editSelectCell.__typename"); + assertThat(typename).isEqualTo(SuccessPayload.class.getSimpleName()); + }; + + Consumer editPriorityConsumer = getEditPriorityConsumer(tableId, multiSelectCellId); + + Runnable editDependenciesMultiSelectCell = () -> { + var input = new EditMultiSelectCellInput(UUID.randomUUID(), PapayaIdentifiers.PAPAYA_PROJECT.toString(), formId.get(), tableId.get(), multiSelectCellId.get().toString(), List.of("e6e8f081-27f5-40e3-a8ab-1e6f0f13df12", "e1c5bd66-54c2-45f1-ae3a-99d3f039affd")); + var result = this.editMultiSelectCellMutationRunner.run(input); + + String typename = JsonPath.read(result, "$.data.editMultiSelectCell.__typename"); + assertThat(typename).isEqualTo(SuccessPayload.class.getSimpleName()); + }; + + Consumer editDependenciesConsumer = getEditDependenciesConsumer(tableId, checkboxCellId); + + Runnable editIsDoneCheckboxCell = () -> { + var input = new EditCheckboxCellInput(UUID.randomUUID(), PapayaIdentifiers.PAPAYA_PROJECT.toString(), formId.get(), tableId.get(), checkboxCellId.get().toString(), true); + var result = this.editCheckboxCellMutationRunner.run(input); + + String typename = JsonPath.read(result, "$.data.editCheckboxCell.__typename"); + assertThat(typename).isEqualTo(SuccessPayload.class.getSimpleName()); + }; + + Consumer editIsDoneConsumer = getEditIsDoneConsumer(); + + StepVerifier.create(flux) + .consumeNextWith(initialFormContentConsumer) + .then(editNameTextfieldCell) + .consumeNextWith(editNameConsumer) + .then(editPrioritySelectCell) + .consumeNextWith(editPriorityConsumer) + .then(editDependenciesMultiSelectCell) + .consumeNextWith(editDependenciesConsumer) + .then(editIsDoneCheckboxCell) + .consumeNextWith(editIsDoneConsumer) + .thenCancel() + .verify(Duration.ofSeconds(10)); + } + + @NotNull + private Consumer getEditIsDoneConsumer() { + Consumer editIsDoneConsumer = payload -> Optional.of(payload) + .filter(FormRefreshedEventPayload.class::isInstance) + .map(FormRefreshedEventPayload.class::cast) + .map(FormRefreshedEventPayload::form) + .ifPresentOrElse(form -> { + var table = getTable(form); + TableNavigator tableNavigator = new TableNavigator(table); + Line line = table.getLines().get(0); + LineNavigator lineNavigator = new LineNavigator(line); + + assertThat(lineNavigator.checkboxCellByColumnId(tableNavigator.column("Done").getId())).hasValue(true); + + }, () -> fail("Missing form")); + return editIsDoneConsumer; + } + + @NotNull + private Consumer getEditDependenciesConsumer(AtomicReference tableId, AtomicReference checkboxCellId) { + Consumer editDependenciesConsumer = payload -> Optional.of(payload) + .filter(FormRefreshedEventPayload.class::isInstance) + .map(FormRefreshedEventPayload.class::cast) + .map(FormRefreshedEventPayload::form) + .ifPresentOrElse(form -> { + var table = getTable(form); + tableId.set(table.getId()); + TableNavigator tableNavigator = new TableNavigator(table); + Line line = table.getLines().get(0); + LineNavigator lineNavigator = new LineNavigator(line); + checkboxCellId.set(lineNavigator.checkboxCellByColumnId(tableNavigator.column("Done").getId()).getId()); + + assertThat(lineNavigator.multiSelectCellByColumnId(tableNavigator.column("Dependencies").getId())).hasValues(List.of("e6e8f081-27f5-40e3-a8ab-1e6f0f13df12", "e1c5bd66-54c2-45f1-ae3a-99d3f039affd")); + + }, () -> fail("Missing form")); + return editDependenciesConsumer; + } + + @NotNull + private Consumer getEditPriorityConsumer(AtomicReference tableId, AtomicReference multiSelectCellId) { + Consumer editPriorityConsumer = payload -> Optional.of(payload) + .filter(FormRefreshedEventPayload.class::isInstance) + .map(FormRefreshedEventPayload.class::cast) + .map(FormRefreshedEventPayload::form) + .ifPresentOrElse(form -> { + var table = getTable(form); + tableId.set(table.getId()); + TableNavigator tableNavigator = new TableNavigator(table); + Line line = table.getLines().get(0); + LineNavigator lineNavigator = new LineNavigator(line); + multiSelectCellId.set(lineNavigator.multiSelectCellByColumnId(tableNavigator.column("Dependencies").getId()).getId()); + + assertThat(lineNavigator.selectCellByColumnId(tableNavigator.column("Priority").getId())).hasValue("P2"); + + }, () -> fail("Missing form")); + return editPriorityConsumer; + } + + @NotNull + private Consumer getEditNameConsumer(AtomicReference tableId, AtomicReference selectCellId) { + Consumer editNameConsumer = payload -> Optional.of(payload) + .filter(FormRefreshedEventPayload.class::isInstance) + .map(FormRefreshedEventPayload.class::cast) + .map(FormRefreshedEventPayload::form) + .ifPresentOrElse(form -> { + var table = getTable(form); + tableId.set(table.getId()); + TableNavigator tableNavigator = new TableNavigator(table); + Line line = table.getLines().get(0); + LineNavigator lineNavigator = new LineNavigator(line); + + selectCellId.set(lineNavigator.selectCellByColumnId(tableNavigator.column("Priority").getId()).getId()); + + assertThat(lineNavigator.textfieldCellByColumnId(tableNavigator.column("Name").getId())).hasValue("newName"); + + }, () -> fail("Missing form")); + return editNameConsumer; + } + + private Table getTable(Form form) { + return new FormNavigator(form).page("Iteration Page").group("Iteration Group").findWidget("Tasks", TableWidget.class).getTable(); + } +} diff --git a/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/services/forms/FormWithTableEditingContextDescriptionProvider.java b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/services/forms/FormWithTableEditingContextDescriptionProvider.java new file mode 100644 index 0000000000..29e92f8e8e --- /dev/null +++ b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/services/forms/FormWithTableEditingContextDescriptionProvider.java @@ -0,0 +1,386 @@ +/******************************************************************************* + * Copyright (c) 2024 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.web.services.forms; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.eclipse.emf.common.notify.Adapter; +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.ecore.EAttribute; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EClassifier; +import org.eclipse.emf.ecore.EDataType; +import org.eclipse.emf.ecore.EEnum; +import org.eclipse.emf.ecore.EEnumLiteral; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.ecore.EcorePackage; +import org.eclipse.emf.ecore.util.EcoreUtil; +import org.eclipse.emf.edit.provider.ComposedAdapterFactory; +import org.eclipse.emf.edit.provider.IItemPropertyDescriptor; +import org.eclipse.emf.edit.provider.IItemPropertySource; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.core.api.IEditingContextRepresentationDescriptionProvider; +import org.eclipse.sirius.components.core.api.IIdentityService; +import org.eclipse.sirius.components.core.api.IObjectService; +import org.eclipse.sirius.components.forms.WidgetIdProvider; +import org.eclipse.sirius.components.forms.description.FormDescription; +import org.eclipse.sirius.components.forms.description.GroupDescription; +import org.eclipse.sirius.components.forms.description.PageDescription; +import org.eclipse.sirius.components.forms.description.TableWidgetDescription; +import org.eclipse.sirius.components.papaya.Iteration; +import org.eclipse.sirius.components.papaya.PapayaFactory; +import org.eclipse.sirius.components.papaya.PapayaPackage; +import org.eclipse.sirius.components.representations.Failure; +import org.eclipse.sirius.components.representations.GetOrCreateRandomIdProvider; +import org.eclipse.sirius.components.representations.IRepresentationDescription; +import org.eclipse.sirius.components.representations.IStatus; +import org.eclipse.sirius.components.representations.Success; +import org.eclipse.sirius.components.representations.VariableManager; +import org.eclipse.sirius.components.tables.components.SelectCellComponent; +import org.eclipse.sirius.components.tables.descriptions.CellDescription; +import org.eclipse.sirius.components.tables.descriptions.ColumnDescription; +import org.eclipse.sirius.components.tables.descriptions.LineDescription; +import org.eclipse.sirius.components.tables.descriptions.TableDescription; +import org.eclipse.sirius.components.tables.elements.CheckboxCellElementProps; +import org.eclipse.sirius.components.tables.elements.MultiSelectCellElementProps; +import org.eclipse.sirius.components.tables.elements.SelectCellElementProps; +import org.eclipse.sirius.components.tables.elements.TextfieldCellElementProps; +import org.springframework.stereotype.Service; + +/** + * This class is used to provide the description for the project management concepts. + * + * @author lfasani + */ +@Service +public class FormWithTableEditingContextDescriptionProvider implements IEditingContextRepresentationDescriptionProvider { + + public static final String TASK_FORM_ID = "taskFormDescription"; + + private final ComposedAdapterFactory composedAdapterFactory; + + private final IIdentityService identityService; + + private final IObjectService objectService; + + public FormWithTableEditingContextDescriptionProvider(ComposedAdapterFactory composedAdapterFactory, IIdentityService identityService, IObjectService objectService) { + this.identityService = Objects.requireNonNull(identityService); + this.objectService = Objects.requireNonNull(objectService); + this.composedAdapterFactory = Objects.requireNonNull(composedAdapterFactory); + } + + @Override + public List getRepresentationDescriptions(IEditingContext editingContext) { + + TableWidgetDescription tableWidgetDescription = getTableWidgetDescription(); + + GroupDescription taskGroup = GroupDescription.newGroupDescription("iterationGroupId") + .idProvider(variableManager -> "iterationGroupId") + .labelProvider(variableManager -> "Iteration Group") + .semanticElementsProvider(variableManager -> Collections.singletonList(variableManager.getVariables().get(VariableManager.SELF))) + .controlDescriptions(List.of(tableWidgetDescription)) + .build(); + + PageDescription pageDescription = PageDescription.newPageDescription("iterationPageId") + .idProvider(variableManager -> "iterationPageId") + .labelProvider(variableManager -> "Iteration Page") + .semanticElementsProvider(variableManager -> Collections.singletonList(variableManager.getVariables().get(VariableManager.SELF))) + .groupDescriptions(List.of(taskGroup)) + .canCreatePredicate(variableManager -> true) + .build(); + + FormDescription formDescription = FormDescription.newFormDescription(TASK_FORM_ID) + .label("Iteration form description") + .idProvider(new GetOrCreateRandomIdProvider()) + .labelProvider(variableManager -> "Iteration Form") + .targetObjectIdProvider(this::getTargetObjectId) + .canCreatePredicate(this::canCreate) + .pageDescriptions(List.of(pageDescription)) + .build(); + return List.of(formDescription); + } + + private TableWidgetDescription getTableWidgetDescription() { + Function> semanticElementsProvider = variableManager -> variableManager.get(VariableManager.SELF, Iteration.class) + .map(eObject -> { + List objects = new ArrayList<>(); + objects.addAll(eObject.getTasks()); + return objects; + }) + .orElse(List.of()); + + Function labelProvider = variableManager -> variableManager.get(VariableManager.SELF, Object.class) + .map(this.objectService::getLabel) + .orElse(null); + + List lineDescriptions = new ArrayList<>(); + LineDescription lineDescription = LineDescription.newLineDescription(UUID.nameUUIDFromBytes("Table - Line".getBytes())) + .targetObjectIdProvider(this::getTargetObjectId) + .targetObjectKindProvider(this::getTargetObjectKind) + .semanticElementsProvider(semanticElementsProvider) + .build(); + lineDescriptions.add(lineDescription); + + TableDescription tableDescription = TableDescription.newTableDescription("tasksTableId") + .targetObjectIdProvider(this::getTargetObjectId) + .targetObjectKindProvider(this::getTargetObjectKind) + .labelProvider(labelProvider) + .lineDescriptions(lineDescriptions) + .columnDescriptions(getColumnDescriptions()) + .cellDescription(getCellDescription()) + .build(); + + return TableWidgetDescription.newTableWidgetDescription("tasksTableWidgetId") + .idProvider(new WidgetIdProvider()) + .labelProvider(variableManager -> "Tasks") + .targetObjectIdProvider(this::getTargetObjectId) + .diagnosticsProvider(variableManager -> List.of()) + .kindProvider(object -> "") + .messageProvider(object -> "") + .tableDescription(tableDescription) + .build(); + } + + private CellDescription getCellDescription() { + return CellDescription.newCellDescription("cells") + .targetObjectIdProvider(vm-> "") + .targetObjectKindProvider(vm-> "") + .cellTypeProvider(this.getCellTypeProvider()) + .cellValueProvider(this.getCellValueProvider()) + .cellOptionsIdProvider(this.getCellOptionsIdProvider()) + .cellOptionsLabelProvider(this.getCellOptionsLabelProvider()) + .cellOptionsProvider(this.getCellOptionsProvider()) + .newCellValueHandler(getNewCellValueHandler()) + .build(); + } + + private String getTargetObjectId(VariableManager variableManager) { + return variableManager.get(VariableManager.SELF, Object.class) + .map(this.identityService::getId) + .orElse(null); + } + + private String getTargetObjectKind(VariableManager variableManager) { + return variableManager.get(VariableManager.SELF, Object.class) + .map(this.identityService::getKind) + .orElse(null); + } + + private boolean canCreate(VariableManager variableManager) { + return variableManager.get(VariableManager.SELF, EObject.class) + .filter(Iteration.class::isInstance) + .isPresent(); + } + + private List getColumnDescriptions() { + Map featureToDisplayName = this.getColumnsStructuralFeaturesDisplayName(PapayaFactory.eINSTANCE.createTask(), PapayaPackage.eINSTANCE.getTask()); + + ColumnDescription columnDescription = ColumnDescription.newColumnDescription(UUID.nameUUIDFromBytes("features".getBytes())) + .semanticElementsProvider(vm -> featureToDisplayName.keySet().stream().map(Object.class::cast).toList()) + .labelProvider(vm -> vm.get(VariableManager.SELF, EStructuralFeature.class).map(featureToDisplayName::get).orElse("")) + .targetObjectIdProvider(vm -> vm.get(VariableManager.SELF, EStructuralFeature.class).map(EStructuralFeature::getName).orElse("")) + .targetObjectKindProvider(vm -> "") + .build(); + return List.of(columnDescription); + } + + private BiFunction getCellValueProvider() { + return (variableManager, columnTargetObject) -> { + Object value = ""; + Optional optionalEObject = variableManager.get(VariableManager.SELF, EObject.class); + if (optionalEObject.isPresent() && columnTargetObject instanceof EStructuralFeature eStructuralFeature) { + EObject eObject = optionalEObject.get(); + Object objectValue = eObject.eGet(eStructuralFeature); + if (eStructuralFeature instanceof EReference) { + EReference eReference = (EReference) eStructuralFeature; + if (eReference.isMany() && !eReference.isContainment() && objectValue instanceof EList) { + value = ((EList) objectValue).stream().map(this.objectService::getId).collect(Collectors.toList()); + } else if (!eReference.isMany() && !eReference.isContainment()) { + value = this.objectService.getId(objectValue); + } + } else if (objectValue != null) { + value = objectValue.toString(); + } + } + return value; + }; + } + + private BiFunction getCellTypeProvider() { + return (variableManager, columnTargetObject) -> { + String type = ""; + Optional optionalEObject = variableManager.get(VariableManager.SELF, EObject.class); + if (optionalEObject.isPresent() && columnTargetObject instanceof EStructuralFeature eStructuralFeature) { + EClassifier eType = eStructuralFeature.getEType(); + if (eStructuralFeature instanceof EAttribute) { + if (EcorePackage.Literals.EBOOLEAN.equals(eType) || EcorePackage.Literals.EBOOLEAN_OBJECT.equals(eType)) { + type = CheckboxCellElementProps.TYPE; + } else if (eType instanceof EEnum) { + type = SelectCellElementProps.TYPE; + } + } else { + EReference eReference = (EReference) eStructuralFeature; + if (eReference.isMany() && !eReference.isContainment()) { + type = MultiSelectCellElementProps.TYPE; + } + if (!eReference.isMany() && !eReference.isContainment()) { + type = SelectCellElementProps.TYPE; + } + } + if (type.isEmpty()) { + type = TextfieldCellElementProps.TYPE; + } + } + return type; + }; + } + + private Function getCellOptionsIdProvider() { + return variableManager -> { + Object candidate = variableManager.getVariables().get(SelectCellComponent.CANDIDATE_VARIABLE); + if (candidate instanceof EEnumLiteral) { + return this.objectService.getLabel(candidate); + } + return this.objectService.getId(candidate); + }; + } + + private Function getCellOptionsLabelProvider() { + return variableManager -> { + Object candidate = variableManager.getVariables().get(SelectCellComponent.CANDIDATE_VARIABLE); + if (candidate instanceof EEnumLiteral) { + return this.objectService.getLabel(candidate); + } + return this.objectService.getFullLabel(candidate); + }; + } + + private BiFunction> getCellOptionsProvider() { + return (variableManager, columnTargetObject) -> { + List options = new ArrayList<>(); + Optional optionalEObject = variableManager.get(VariableManager.SELF, EObject.class); + if (optionalEObject.isPresent() && columnTargetObject instanceof EStructuralFeature eStructuralFeature) { + EObject eObject = optionalEObject.get(); + EClassifier eType = eStructuralFeature.getEType(); + if (eType instanceof EEnum) { + options.addAll(((EEnum) eType).getELiterals()); + } else { + Object adapter = this.composedAdapterFactory.adapt(eObject, IItemPropertySource.class); + if (adapter instanceof IItemPropertySource) { + IItemPropertySource itemPropertySource = (IItemPropertySource) adapter; + IItemPropertyDescriptor descriptor = itemPropertySource.getPropertyDescriptor(eObject, eStructuralFeature); + if (descriptor != null) { + List choiceOfValues = descriptor.getChoiceOfValues(eObject).stream() + .filter(Objects::nonNull) + .collect(Collectors.toList()); + return choiceOfValues; + } + } + } + } + return options; + }; + } + + private Map getColumnsStructuralFeaturesDisplayName(EObject eObject, EClass eClass) { + Map featureToDisplayName = new LinkedHashMap<>(); + EList eAllStructuralFeatures = eClass.getEAllStructuralFeatures(); + for (EStructuralFeature eSF : eAllStructuralFeatures) { + if (eSF instanceof EAttribute && !eSF.isMany() && !eSF.isDerived()) { + featureToDisplayName.put(eSF, this.getDisplayName(eObject, eSF)); + } else if (eSF instanceof EReference ref && !eSF.isDerived() && !ref.isContainment()) { + featureToDisplayName.put(eSF, this.getDisplayName(eObject, eSF)); + } + } + return featureToDisplayName; + } + + private String getDisplayName(EObject eObject, EStructuralFeature eStructuralFeature) { + Adapter adapter = this.composedAdapterFactory.adapt(eObject, IItemPropertySource.class); + if (adapter instanceof IItemPropertySource) { + IItemPropertySource itemPropertySource = (IItemPropertySource) adapter; + IItemPropertyDescriptor descriptor = itemPropertySource.getPropertyDescriptor(eObject, eStructuralFeature); + if (descriptor != null) { + String displayName = descriptor.getDisplayName(eStructuralFeature); + return displayName; + } + } + return eStructuralFeature.getName(); + } + + private BiFunction getNewCellValueHandler() { + BiFunction newCellValueHandler = (variableManager, newValue) -> { + IStatus status = new Failure(""); + var optionalEObject = variableManager.get(VariableManager.SELF, EObject.class); + var optionalEditingContext = variableManager.get(IEditingContext.EDITING_CONTEXT, IEditingContext.class); + var optionalFeatureName = variableManager.get(ColumnDescription.COLUMN_TARGET_OBJECT_ID, String.class); + if (optionalEObject.isPresent() && optionalFeatureName.isPresent()) { + EObject eObject = optionalEObject.get(); + String featureName = optionalFeatureName.get(); + EStructuralFeature eStructuralFeature = eObject.eClass().getEStructuralFeature(featureName); + if (eStructuralFeature != null) { + EClassifier eType = eStructuralFeature.getEType(); + if (eStructuralFeature.isMany() && eType instanceof EClass && newValue instanceof Collection) { + EList refElements = (EList) eObject.eGet(eStructuralFeature); + List newValuesToSet = new ArrayList<>(); + List newValues = ((Collection) newValue).stream().map(elt -> elt.toString()).collect(Collectors.toList()); + for (String newStringValue : newValues) { + var optionalNewValueToSet = this.objectService.getObject(optionalEditingContext.get(), newStringValue); + if (optionalNewValueToSet.isEmpty()) { + continue; + } + EObject newValueToSet = (EObject) optionalNewValueToSet.get(); + newValuesToSet.add(newValueToSet); + try { + if (!refElements.contains(newValueToSet)) { + refElements.add(newValueToSet); + } + } catch (IllegalArgumentException | ClassCastException | ArrayStoreException exception) { + return new Failure(""); + } + } + refElements.removeIf(refElt -> !newValuesToSet.contains(refElt)); + } else if (!eStructuralFeature.isMany() && eType instanceof EClass && newValue instanceof String newStringValue) { + var optionalNewValueToSet = this.objectService.getObject(optionalEditingContext.get(), newStringValue); + if (optionalNewValueToSet.isPresent()) { + eObject.eSet(eStructuralFeature, optionalNewValueToSet.get()); + } + } else if (eType instanceof EEnum && newValue instanceof String) { + EEnumLiteral eEnumLiteral = ((EEnum) eType).getEEnumLiteral((String) newValue); + eObject.eSet(eStructuralFeature, eEnumLiteral.getInstance()); + } else if (eType instanceof EDataType) { + String newValueAsString = EcoreUtil.convertToString((EDataType) eStructuralFeature.getEType(), newValue); + Object value = EcoreUtil.createFromString((EDataType) eStructuralFeature.getEType(), newValueAsString); + eObject.eSet(eStructuralFeature, value); + } + status = new Success(); + } + } + return status; + }; + return newCellValueHandler; + } +} diff --git a/packages/sirius-web/frontend/sirius-web-application/package.json b/packages/sirius-web/frontend/sirius-web-application/package.json index 1901da2679..08acc32e78 100644 --- a/packages/sirius-web/frontend/sirius-web-application/package.json +++ b/packages/sirius-web/frontend/sirius-web-application/package.json @@ -40,13 +40,16 @@ "@eclipse-sirius/sirius-components-gantt": "*", "@eclipse-sirius/sirius-components-omnibox": "*", "@eclipse-sirius/sirius-components-portals": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-trees": "*", "@eclipse-sirius/sirius-components-widget-reference": "*", "@eclipse-sirius/sirius-components-validation": "*", "@mui/icons-material": "5.15.19", "@mui/material": "5.15.19", "@xstate/react": "3.0.0", + "export-to-csv": "1.3.0", "graphql": "16.8.1", + "material-react-table": "2.13.3", "notistack": "3.0.1", "react": "18.3.1", "react-dom": "18.3.1", @@ -65,6 +68,7 @@ "@eclipse-sirius/sirius-components-gantt": "*", "@eclipse-sirius/sirius-components-omnibox": "*", "@eclipse-sirius/sirius-components-portals": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-trees": "*", "@eclipse-sirius/sirius-components-tsconfig": "*", "@eclipse-sirius/sirius-components-validation": "*", @@ -72,8 +76,10 @@ "@types/react": "18.3.3", "@vitejs/plugin-react": "4.3.0", "@xstate/react": "3.0.0", + "export-to-csv": "1.3.0", "jest-junit-reporter": "1.1.0", "graphql": "16.8.1", + "material-react-table": "2.13.3", "prettier": "2.7.1", "react": "18.3.1", "react-dom": "18.3.1", diff --git a/packages/sirius-web/frontend/sirius-web-papaya/package.json b/packages/sirius-web/frontend/sirius-web-papaya/package.json index fbbda81754..abdb2bcd10 100644 --- a/packages/sirius-web/frontend/sirius-web-papaya/package.json +++ b/packages/sirius-web/frontend/sirius-web-papaya/package.json @@ -39,13 +39,16 @@ "@eclipse-sirius/sirius-components-deck": "*", "@eclipse-sirius/sirius-components-portals": "*", "@eclipse-sirius/sirius-components-omnibox": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-trees": "*", "@eclipse-sirius/sirius-components-widget-reference": "*", "@eclipse-sirius/sirius-web-application": "*", "@mui/material": "5.15.19", "@mui/icons-material": "5.15.19", "@xstate/react": "3.0.0", + "export-to-csv": "1.3.0", "graphql": "16.8.1", + "material-react-table": "2.13.3", "notistack": "3.0.1", "react": "18.3.1", "react-dom": "18.3.1", @@ -65,6 +68,7 @@ "@eclipse-sirius/sirius-components-deck": "*", "@eclipse-sirius/sirius-components-omnibox": "*", "@eclipse-sirius/sirius-components-portals": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-trees": "*", "@eclipse-sirius/sirius-components-tsconfig": "*", "@eclipse-sirius/sirius-web-application": "*", @@ -72,8 +76,10 @@ "@types/react": "18.3.3", "@vitejs/plugin-react": "4.3.0", "@xstate/react": "3.0.0", + "export-to-csv": "1.3.0", "jest-junit-reporter": "1.1.0", "graphql": "16.8.1", + "material-react-table": "2.13.3", "prettier": "2.7.1", "react": "18.3.1", "react-dom": "18.3.1", diff --git a/packages/sirius-web/frontend/sirius-web/package.json b/packages/sirius-web/frontend/sirius-web/package.json index 1b39fe85bb..32e1dea183 100644 --- a/packages/sirius-web/frontend/sirius-web/package.json +++ b/packages/sirius-web/frontend/sirius-web/package.json @@ -24,6 +24,7 @@ "@eclipse-sirius/sirius-components-portals": "*", "@eclipse-sirius/sirius-components-widget-reference": "*", "@eclipse-sirius/sirius-components-selection": "*", + "@eclipse-sirius/sirius-components-tables": "*", "@eclipse-sirius/sirius-components-trees": "*", "@eclipse-sirius/sirius-components-validation": "*", "@eclipse-sirius/sirius-web-application": "*", @@ -35,10 +36,12 @@ "@xstate/react": "3.0.0", "d3": "7.0.0", "elkjs": "0.8.2", + "export-to-csv": "1.3.0", "fontsource-roboto": "4.0.0", "graphql": "16.8.1", "html-to-image": "1.11.11", "notistack": "3.0.1", + "material-react-table": "2.13.3", "pathfinding": "0.4.18", "prop-types": "15.8.1", "react": "18.3.1", diff --git a/packages/tables/backend/pom.xml b/packages/tables/backend/pom.xml new file mode 100644 index 0000000000..ee0889e8ea --- /dev/null +++ b/packages/tables/backend/pom.xml @@ -0,0 +1,41 @@ + + + + 4.0.0 + + org.eclipse.sirius + sirius-components-tables-parent + 2024.9.8 + + sirius-components-tables-parent + Sirius Components Tables Parent + pom + + + + github + Apache Maven Packages + https://maven.pkg.github.com/eclipse-sirius/sirius-web + + + + + sirius-components-tables + sirius-components-collaborative-tables + sirius-components-tables-graphql + sirius-components-tables-tests + + \ No newline at end of file diff --git a/packages/tables/backend/sirius-components-collaborative-tables/.checkstyle b/packages/tables/backend/sirius-components-collaborative-tables/.checkstyle new file mode 100644 index 0000000000..f62c550f18 --- /dev/null +++ b/packages/tables/backend/sirius-components-collaborative-tables/.checkstyle @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/packages/tables/backend/sirius-components-collaborative-tables/.classpath b/packages/tables/backend/sirius-components-collaborative-tables/.classpath new file mode 100644 index 0000000000..f9e5560b99 --- /dev/null +++ b/packages/tables/backend/sirius-components-collaborative-tables/.classpath @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/tables/backend/sirius-components-collaborative-tables/.project b/packages/tables/backend/sirius-components-collaborative-tables/.project new file mode 100644 index 0000000000..cde1aa9764 --- /dev/null +++ b/packages/tables/backend/sirius-components-collaborative-tables/.project @@ -0,0 +1,34 @@ + + + sirius-components-collaborative-tables + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.springframework.ide.eclipse.boot.validation.springbootbuilder + + + + + net.sf.eclipsecs.core.CheckstyleBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + net.sf.eclipsecs.core.CheckstyleNature + + diff --git a/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.core.resources.prefs b/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..839d647eef --- /dev/null +++ b/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 +encoding/=UTF-8 diff --git a/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.core.runtime.prefs b/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.core.runtime.prefs new file mode 100644 index 0000000000..a287fefdba --- /dev/null +++ b/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.core.runtime.prefs @@ -0,0 +1,3 @@ +#Mon Sep 24 15:04:19 CEST 2007 +eclipse.preferences.version=1 +line.separator=\n diff --git a/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.apt.core.prefs b/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.apt.core.prefs new file mode 100644 index 0000000000..d4313d4b25 --- /dev/null +++ b/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.apt.core.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.apt.aptEnabled=false diff --git a/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.core.prefs b/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..2ab93cd0a5 --- /dev/null +++ b/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,505 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.builder.annotationPath.allLocations=disabled +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.APILeak=warning +org.eclipse.jdt.core.compiler.problem.annotatedTypeArgumentToUnannotated=info +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore +org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=warning +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.suppressWarningsNotFullyAnalysed=info +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=ignore +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.processAnnotations=disabled +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=17 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false +org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false +org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_annotations_on_enum_constant=0 +org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field=49 +org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable=49 +org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method=49 +org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package=49 +org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter=0 +org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type=49 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 +org.eclipse.jdt.core.formatter.alignment_for_assertion_message=0 +org.eclipse.jdt.core.formatter.alignment_for_assignment=0 +org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0 +org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_module_statements=16 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16 +org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_record_components=16 +org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16 +org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0 +org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 +org.eclipse.jdt.core.formatter.alignment_for_type_annotations=0 +org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0 +org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=1 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch=0 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_record_constructor=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_record_declaration=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=false +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=true +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false +org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=false +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.indent_tag_description=false +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags=do not insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert +org.eclipse.jdt.core.formatter.comment.line_length=120 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=2 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=false +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_not_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert +org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_if_empty +org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_if_empty +org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false +org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_if_empty +org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_if_empty +org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never +org.eclipse.jdt.core.formatter.lineSplit=200 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines +org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=false +org.eclipse.jdt.core.formatter.tabulation.char=space +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.text_block_indentation=0 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assertion_message_operator=true +org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false +org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true +org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true +org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true +org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true +org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true +org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true +org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter diff --git a/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.ui.prefs b/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 0000000000..f789e687ad --- /dev/null +++ b/packages/tables/backend/sirius-components-collaborative-tables/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,210 @@ +cleanup.add_default_serial_version_id=true +cleanup.add_generated_serial_version_id=false +cleanup.add_missing_annotations=true +cleanup.add_missing_deprecated_annotations=true +cleanup.add_missing_methods=false +cleanup.add_missing_nls_tags=false +cleanup.add_missing_override_annotations=true +cleanup.add_missing_override_annotations_interface_methods=true +cleanup.add_serial_version_id=false +cleanup.always_use_blocks=true +cleanup.always_use_parentheses_in_expressions=false +cleanup.always_use_this_for_non_static_field_access=true +cleanup.always_use_this_for_non_static_method_access=true +cleanup.convert_functional_interfaces=false +cleanup.convert_to_enhanced_for_loop=false +cleanup.correct_indentation=true +cleanup.format_source_code=true +cleanup.format_source_code_changes_only=false +cleanup.insert_inferred_type_arguments=false +cleanup.make_local_variable_final=true +cleanup.make_parameters_final=false +cleanup.make_private_fields_final=true +cleanup.make_type_abstract_if_missing_method=false +cleanup.make_variable_declarations_final=false +cleanup.never_use_blocks=false +cleanup.never_use_parentheses_in_expressions=true +cleanup.organize_imports=true +cleanup.qualify_static_field_accesses_with_declaring_class=true +cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +cleanup.qualify_static_member_accesses_with_declaring_class=false +cleanup.qualify_static_method_accesses_with_declaring_class=true +cleanup.remove_private_constructors=true +cleanup.remove_redundant_modifiers=false +cleanup.remove_redundant_semicolons=false +cleanup.remove_redundant_type_arguments=true +cleanup.remove_trailing_whitespaces=true +cleanup.remove_trailing_whitespaces_all=true +cleanup.remove_trailing_whitespaces_ignore_empty=false +cleanup.remove_unnecessary_casts=true +cleanup.remove_unnecessary_nls_tags=true +cleanup.remove_unused_imports=true +cleanup.remove_unused_local_variables=false +cleanup.remove_unused_private_fields=true +cleanup.remove_unused_private_members=false +cleanup.remove_unused_private_methods=true +cleanup.remove_unused_private_types=true +cleanup.sort_members=false +cleanup.sort_members_all=false +cleanup.use_anonymous_class_creation=false +cleanup.use_blocks=false +cleanup.use_blocks_only_for_return_and_throw=false +cleanup.use_lambda=true +cleanup.use_parentheses_in_expressions=false +cleanup.use_this_for_non_static_field_access=true +cleanup.use_this_for_non_static_field_access_only_if_necessary=false +cleanup.use_this_for_non_static_method_access=true +cleanup.use_this_for_non_static_method_access_only_if_necessary=false +cleanup_profile=_Sirius +cleanup_settings_version=2 +eclipse.preferences.version=1 +editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true +formatter_profile=_Sirius +formatter_settings_version=21 +org.eclipse.jdt.ui.ignorelowercasenames=true +org.eclipse.jdt.ui.importorder=com;fr;java;javax;org; +org.eclipse.jdt.ui.javadoc=true +org.eclipse.jdt.ui.ondemandthreshold=99 +org.eclipse.jdt.ui.staticondemandthreshold=99 +org.eclipse.jdt.ui.text.custom_code_templates=