diff --git a/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors-widget-table/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/widget/table/TableWidgetPreviewConverterProvider.java b/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors-widget-table/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/widget/table/TableWidgetPreviewConverterProvider.java index 59208289a6..53f53df944 100644 --- a/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors-widget-table/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/widget/table/TableWidgetPreviewConverterProvider.java +++ b/packages/formdescriptioneditors/backend/sirius-components-collaborative-formdescriptioneditors-widget-table/src/main/java/org/eclipse/sirius/components/formdescriptioneditors/widget/table/TableWidgetPreviewConverterProvider.java @@ -43,43 +43,46 @@ public AbstractWidgetDescription caseTableWidgetDescription(org.eclipse.sirius.c VariableManager childVariableManager = variableManager.createChild(); childVariableManager.put(VariableManager.SELF, viewTableDescription); String id = formDescriptionEditorDescription.getTargetObjectIdProvider().apply(childVariableManager); - var lineDescription = LineDescription.newLineDescription(UUID.randomUUID().toString()) - .targetObjectIdProvider(vm -> "") - .targetObjectKindProvider(vm -> "") - .semanticElementsProvider(vm -> new PaginatedData(List.of(), false, false, 0)) - .headerLabelProvider(vm -> "") - .headerIconURLsProvider(vm -> List.of()) - .headerIndexLabelProvider(vm -> "") - .isResizablePredicate(vm -> false) - .initialHeightProvider(vm -> -1) - .depthLevelProvider(vm -> 0) - .build(); - var tableDescription = TableDescription.newTableDescription(UUID.randomUUID().toString()) - .label("") - .labelProvider(vm -> TableWidgetPreviewConverterProvider.this.getWidgetLabel(viewTableDescription, "Table")) - .canCreatePredicate(vm -> true) - .targetObjectIdProvider(vm -> "") - .targetObjectKindProvider(vm -> "") - .isStripeRowPredicate(vm -> false) - .iconURLsProvider(vm -> List.of()) - .columnDescriptions(List.of()) - .cellDescriptions(List.of()) - .lineDescription(lineDescription) - .build(); - return TableWidgetDescription.newTableWidgetDescription(UUID.randomUUID().toString()) - .idProvider(vm -> id) - .targetObjectIdProvider(vm -> "") - .labelProvider(vm -> TableWidgetPreviewConverterProvider.this.getWidgetLabel(viewTableDescription, "Table")) - .diagnosticsProvider(vm -> List.of()) - .kindProvider(object -> "") - .messageProvider(object -> "") - .helpTextProvider(vm -> "") - .tableDescription(tableDescription) - .build(); + return TableWidgetPreviewConverterProvider.this.getTableWidgetDescription(viewTableDescription, id); } }; } + private TableWidgetDescription getTableWidgetDescription(org.eclipse.sirius.components.view.widget.tablewidget.TableWidgetDescription viewTableDescription, String id) { + var lineDescription = LineDescription.newLineDescription(UUID.randomUUID().toString()) + .targetObjectIdProvider(vm -> "") + .targetObjectKindProvider(vm -> "") + .semanticElementsProvider(vm -> new PaginatedData(List.of(), false, false, 0)) + .headerLabelProvider(vm -> "") + .headerIconURLsProvider(vm -> List.of()) + .headerIndexLabelProvider(vm -> "") + .isResizablePredicate(vm -> false) + .initialHeightProvider(vm -> -1) + .depthLevelProvider(vm -> 0) + .build(); + var tableDescription = TableDescription.newTableDescription(UUID.randomUUID().toString()) + .label("") + .labelProvider(vm -> this.getWidgetLabel(viewTableDescription, "Table")) + .canCreatePredicate(vm -> true) + .targetObjectIdProvider(vm -> "") + .targetObjectKindProvider(vm -> "") + .isStripeRowPredicate(vm -> false) + .iconURLsProvider(vm -> List.of()) + .columnDescriptions(List.of()) + .cellDescriptions(List.of()) + .lineDescription(lineDescription) + .build(); + return TableWidgetDescription.newTableWidgetDescription(UUID.randomUUID().toString()) + .idProvider(vm -> id) + .targetObjectIdProvider(vm -> "") + .labelProvider(vm -> this.getWidgetLabel(viewTableDescription, "Table")) + .diagnosticsProvider(vm -> List.of()) + .kindProvider(object -> "") + .messageProvider(object -> "") + .helpTextProvider(vm -> "") + .tableDescription(tableDescription) + .build(); + } public String getWidgetLabel(org.eclipse.sirius.components.view.form.WidgetDescription widgetDescription, String defaultLabel) { String widgetLabel = defaultLabel; @@ -92,5 +95,4 @@ public String getWidgetLabel(org.eclipse.sirius.components.view.form.WidgetDescr } return widgetLabel; } - } 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 10d8c1a56f..9c7ceeb207 100644 --- a/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.ts +++ b/packages/forms/frontend/sirius-components-forms/src/form/FormEventFragments.ts @@ -332,6 +332,7 @@ export const widgetFields = ` totalRowCount } stripeRow + enableSubRows globalFilter columnFilters { id diff --git a/packages/sirius-web/backend/sirius-web-papaya/src/main/java/org/eclipse/sirius/web/papaya/representations/table/PackageTableRepresentationDescriptionProvider.java b/packages/sirius-web/backend/sirius-web-papaya/src/main/java/org/eclipse/sirius/web/papaya/representations/table/PackageTableRepresentationDescriptionProvider.java index f650e7088e..084d4a00d7 100644 --- a/packages/sirius-web/backend/sirius-web-papaya/src/main/java/org/eclipse/sirius/web/papaya/representations/table/PackageTableRepresentationDescriptionProvider.java +++ b/packages/sirius-web/backend/sirius-web-papaya/src/main/java/org/eclipse/sirius/web/papaya/representations/table/PackageTableRepresentationDescriptionProvider.java @@ -118,6 +118,7 @@ public List getRepresentationDescriptions(IEditingCo .cellDescriptions(this.getCellDescriptions()) .iconURLsProvider(variableManager -> List.of("/papaya-representations/package-table.svg")) .isStripeRowPredicate(variableManager -> true) + .enableSubRows(true) .build(); return List.of(tableDescription); diff --git a/packages/sirius-web/backend/sirius-web-papaya/src/main/java/org/eclipse/sirius/web/papaya/representations/table/ProjectTableRepresentationDescriptionProvider.java b/packages/sirius-web/backend/sirius-web-papaya/src/main/java/org/eclipse/sirius/web/papaya/representations/table/ProjectTableRepresentationDescriptionProvider.java index a3705beee1..8895c7c354 100644 --- a/packages/sirius-web/backend/sirius-web-papaya/src/main/java/org/eclipse/sirius/web/papaya/representations/table/ProjectTableRepresentationDescriptionProvider.java +++ b/packages/sirius-web/backend/sirius-web-papaya/src/main/java/org/eclipse/sirius/web/papaya/representations/table/ProjectTableRepresentationDescriptionProvider.java @@ -92,6 +92,7 @@ public List getRepresentationDescriptions(IEditingCo .cellDescriptions(this.getCellDescriptions()) .iconURLsProvider(variableManager -> List.of("/papaya-representations/project-table.svg")) .isStripeRowPredicate(variableManager -> false) + .enableSubRows(false) .build(); return List.of(tableDescription); diff --git a/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/services/forms/FormWithTableDescriptionProvider.java b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/services/forms/FormWithTableDescriptionProvider.java index 5818e9e3b3..ad5d08921a 100644 --- a/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/services/forms/FormWithTableDescriptionProvider.java +++ b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/services/forms/FormWithTableDescriptionProvider.java @@ -156,6 +156,7 @@ private TableWidgetDescription getTableWidgetDescription() { .cellDescriptions(this.getCellDescriptions()) .iconURLsProvider(variableManager -> List.of()) .isStripeRowPredicate(variableManager -> false) + .enableSubRows(false) .build(); return TableWidgetDescription.newTableWidgetDescription("tasksTableWidgetId") diff --git a/packages/tables/backend/sirius-components-collaborative-tables/src/main/resources/schema/table.graphqls b/packages/tables/backend/sirius-components-collaborative-tables/src/main/resources/schema/table.graphqls index fa25664d6e..359b3ad550 100644 --- a/packages/tables/backend/sirius-components-collaborative-tables/src/main/resources/schema/table.graphqls +++ b/packages/tables/backend/sirius-components-collaborative-tables/src/main/resources/schema/table.graphqls @@ -41,6 +41,7 @@ type Table implements Representation { paginationData: PaginationData globalFilter: String columnFilters: [ColumnFilter!]! + enableSubRows: Boolean! } type Column { diff --git a/packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/Table.java b/packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/Table.java index 8787a78b73..6106cb4248 100644 --- a/packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/Table.java +++ b/packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/Table.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2024 Obeo. + * Copyright (c) 2024, 2025 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 @@ -51,10 +51,16 @@ public final class Table implements IRepresentation { private List columnFilters; + private boolean enableSubRows; + private Table() { // Prevent instantiation } + public static Builder newTable(String id) { + return new Builder(id); + } + @Override public String getId() { return this.id; @@ -103,8 +109,8 @@ public List getColumnFilters() { return this.columnFilters; } - public static Builder newTable(String id) { - return new Builder(id); + public boolean isEnableSubRows() { + return this.enableSubRows; } @Override @@ -143,6 +149,8 @@ public static final class Builder { private List columnFilters; + private boolean enableSubRows; + private Builder(String id) { this.id = Objects.requireNonNull(id); } @@ -192,6 +200,11 @@ public Builder columnFilters(List columnFilters) { return this; } + public Builder enableSubRows(boolean enableSubRows) { + this.enableSubRows = enableSubRows; + return this; + } + public Table build() { Table table = new Table(); table.id = Objects.requireNonNull(this.id); @@ -205,6 +218,7 @@ public Table build() { table.paginationData = Objects.requireNonNull(this.paginationData); table.globalFilter = Objects.requireNonNull(this.globalFilter); table.columnFilters = Objects.requireNonNull(this.columnFilters); + table.enableSubRows = this.enableSubRows; return table; } } diff --git a/packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/TableComponent.java b/packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/TableComponent.java index 233dd98a9f..fb0a298d00 100644 --- a/packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/TableComponent.java +++ b/packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/components/TableComponent.java @@ -100,6 +100,7 @@ public Element render() { .paginationData(new PaginationData(paginatedData.hasPreviousPage(), paginatedData.hasNextPage(), paginatedData.totalRowCount())) .globalFilter(this.props.globalFilter()) .columnFilters(columnsFilters) + .enableSubRows(tableDescription.isEnableSubRows()) .build(); return new Element(TableElementProps.TYPE, tableElementProps); diff --git a/packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/descriptions/TableDescription.java b/packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/descriptions/TableDescription.java index 14c59668e9..89aebbf777 100644 --- a/packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/descriptions/TableDescription.java +++ b/packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/descriptions/TableDescription.java @@ -60,10 +60,16 @@ public final class TableDescription implements IRepresentationDescription { private Function> iconURLsProvider; + private boolean enableSubRows; + private TableDescription() { // Prevent instantiation } + public static Builder newTableDescription(String id) { + return new Builder(id); + } + public String getId() { return this.id; } @@ -110,8 +116,8 @@ public Function> getIconURLsProvider() { return this.iconURLsProvider; } - public static Builder newTableDescription(String id) { - return new Builder(id); + public boolean isEnableSubRows() { + return this.enableSubRows; } @Override @@ -150,6 +156,8 @@ public static final class Builder { private Function> iconURLsProvider; + private boolean enableSubRows; + private Builder(String id) { this.id = Objects.requireNonNull(id); } @@ -200,7 +208,12 @@ public Builder cellDescriptions(List cellDescriptions) { } public Builder iconURLsProvider(Function> iconURLsProvider) { - this.iconURLsProvider = Objects.requireNonNull(iconURLsProvider); + this.iconURLsProvider = Objects.requireNonNull(iconURLsProvider); + return this; + } + + public Builder enableSubRows(boolean enableSubRows) { + this.enableSubRows = enableSubRows; return this; } @@ -217,6 +230,7 @@ public TableDescription build() { tableDescription.columnDescriptions = Objects.requireNonNull(this.columnDescriptions); tableDescription.cellDescriptions = Objects.requireNonNull(this.cellDescriptions); tableDescription.iconURLsProvider = Objects.requireNonNull(this.iconURLsProvider); + tableDescription.enableSubRows = this.enableSubRows; return tableDescription; } } diff --git a/packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/elements/TableElementProps.java b/packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/elements/TableElementProps.java index c66e577f6a..39d7497ef0 100644 --- a/packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/elements/TableElementProps.java +++ b/packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/elements/TableElementProps.java @@ -26,7 +26,7 @@ * @author lfasani */ public record TableElementProps(String id, String descriptionId, String targetObjectId, String targetObjectKind, - PaginationData paginationData, boolean stripeRow, List children, String globalFilter, List columnFilters) implements IProps { + PaginationData paginationData, boolean stripeRow, List children, String globalFilter, List columnFilters, boolean enableSubRows) implements IProps { public static final String TYPE = "Table"; @@ -76,6 +76,8 @@ public static final class Builder { private List columnFilters; + private boolean enableSubRows; + private Builder(String id) { this.id = Objects.requireNonNull(id); } @@ -120,8 +122,14 @@ public Builder columnFilters(List columnFilters) { return this; } + public Builder enableSubRows(boolean enableSubRows) { + this.enableSubRows = enableSubRows; + return this; + } + public TableElementProps build() { - return new TableElementProps(this.id, this.descriptionId, this.targetObjectId, this.targetObjectKind, this.paginationData, this.stripeRow, this.children, this.globalFilter, this.columnFilters); + return new TableElementProps(this.id, this.descriptionId, this.targetObjectId, this.targetObjectKind, this.paginationData, this.stripeRow, this.children, this.globalFilter, + this.columnFilters, this.enableSubRows); } } } diff --git a/packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/renderer/TableElementFactory.java b/packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/renderer/TableElementFactory.java index 7ec5f887eb..875041f3ac 100644 --- a/packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/renderer/TableElementFactory.java +++ b/packages/tables/backend/sirius-components-tables/src/main/java/org/eclipse/sirius/components/tables/renderer/TableElementFactory.java @@ -81,6 +81,7 @@ private Table instantiateTable(IProps props, List children) { .paginationData(tableElementProps.paginationData()) .globalFilter(tableElementProps.globalFilter()) .columnFilters(tableElementProps.columnFilters()) + .enableSubRows(tableElementProps.enableSubRows()) .build(); } return null; diff --git a/packages/tables/frontend/sirius-components-tables/src/representation/useTableSubscription.ts b/packages/tables/frontend/sirius-components-tables/src/representation/useTableSubscription.ts index c7899bf989..3d39999311 100644 --- a/packages/tables/frontend/sirius-components-tables/src/representation/useTableSubscription.ts +++ b/packages/tables/frontend/sirius-components-tables/src/representation/useTableSubscription.ts @@ -48,6 +48,7 @@ export const getTableEventSubscription = ` totalRowCount } stripeRow + enableSubRows globalFilter columnFilters { id diff --git a/packages/tables/frontend/sirius-components-tables/src/rows/RowChevronButton.tsx b/packages/tables/frontend/sirius-components-tables/src/rows/RowChevronButton.tsx index 13d1d5b3f0..f0638749db 100644 --- a/packages/tables/frontend/sirius-components-tables/src/rows/RowChevronButton.tsx +++ b/packages/tables/frontend/sirius-components-tables/src/rows/RowChevronButton.tsx @@ -22,7 +22,7 @@ export const RowChevronButton = ({ row, isExpanded, onExpandCollapse, hasChildre onExpandCollapse(row.id)} // the contrast between disabled and default text color is not enough - sx={{ marginLeft: theme.spacing(row.depthLevel), color: 'black' }} + sx={{ marginLeft: theme.spacing(row.depthLevel), marginRight: theme.spacing(-2), color: 'black' }} disabled={!hasChildren}> {isExpanded ? : } diff --git a/packages/tables/frontend/sirius-components-tables/src/rows/RowHeader.tsx b/packages/tables/frontend/sirius-components-tables/src/rows/RowHeader.tsx index 8a53044435..e00258e4c4 100644 --- a/packages/tables/frontend/sirius-components-tables/src/rows/RowHeader.tsx +++ b/packages/tables/frontend/sirius-components-tables/src/rows/RowHeader.tsx @@ -15,23 +15,15 @@ import { IconOverlay } from '@eclipse-sirius/sirius-components-core'; import Box from '@mui/material/Box'; import { useTheme } from '@mui/material/styles'; import Typography from '@mui/material/Typography'; -import { RowChevronButton } from './RowChevronButton'; import { RowHeaderProps } from './RowHeader.types'; -export const RowHeader = ({ row, isExpanded, hasChildren, onExpandCollapse }: RowHeaderProps) => { +export const RowHeader = ({ row, children }: RowHeaderProps) => { const theme = useTheme(); return ( - - - {row.headerIndexLabel} - + {children} + {row.headerIndexLabel} {row.headerLabel} diff --git a/packages/tables/frontend/sirius-components-tables/src/rows/RowHeader.types.ts b/packages/tables/frontend/sirius-components-tables/src/rows/RowHeader.types.ts index dbf61a347f..1596b00daf 100644 --- a/packages/tables/frontend/sirius-components-tables/src/rows/RowHeader.types.ts +++ b/packages/tables/frontend/sirius-components-tables/src/rows/RowHeader.types.ts @@ -14,7 +14,5 @@ import { GQLLine } from '../table/TableContent.types'; export interface RowHeaderProps { row: GQLLine; - isExpanded: boolean; - onExpandCollapse: (rowId: string) => void; - hasChildren: boolean; + children: React.ReactNode; } diff --git a/packages/tables/frontend/sirius-components-tables/src/table/TableContent.tsx b/packages/tables/frontend/sirius-components-tables/src/table/TableContent.tsx index 365e43512d..970cc66a78 100644 --- a/packages/tables/frontend/sirius-components-tables/src/table/TableContent.tsx +++ b/packages/tables/frontend/sirius-components-tables/src/table/TableContent.tsx @@ -27,6 +27,64 @@ import { GQLLine, TableContentProps, TablePaginationState } from './TableContent import { useGlobalFilter } from './useGlobalFilter'; import { useTableColumns } from './useTableColumns'; +const keepRow = (row: GQLLine, visibleRows: GQLLine[]): number => { + visibleRows.push(row); + return row.depthLevel; +}; +const getChildrenById = (rowId: string, rows: GQLLine[]): GQLLine[] => { + const rowIndex = rows.findIndex((row) => row.id === rowId); + const children: GQLLine[] = []; + if (rowIndex >= 0 && rowIndex + 1 < rows.length) { + const level = rows[rowIndex]?.depthLevel ?? 0; + let index = rowIndex + 1; + while (index < rows.length && (rows[index]?.depthLevel ?? 0) > level) { + // keep only direct children + const row = rows[index]; + if (row && row.depthLevel === level + 1) { + children.push(row); + } + index++; + } + } + return children; +}; + +const rowIdsToCollapse = (rowId: string, rows: GQLLine[], expandedRowIds: string[]): string[] => { + const result: string[] = []; + + result.push(rowId); + // need to check if some sub rows are expanded + const children = getChildrenById(rowId, rows); + for (const child of children) { + if (expandedRowIds.includes(child.id)) { + result.push(...rowIdsToCollapse(child.id, rows, expandedRowIds)); + } + } + return result; +}; + +const filterRowsOnLevel = (rows: GQLLine[], expandedRowIds: string[]): GQLLine[] => { + let filteredRows: GQLLine[] = []; + let currentIndex = 0; + const firstRow = rows[currentIndex]; + if (firstRow) { + let currentLevel = keepRow(firstRow, filteredRows); + for (let index = 1; index < rows.length; index++) { + const row = rows[index]; + if (row && row.depthLevel <= currentLevel) { + currentLevel = keepRow(row, filteredRows); + } else if (row && row.depthLevel > currentLevel) { + const currentRow = rows[currentIndex]; + if (currentRow && expandedRowIds.includes(currentRow.id)) { + currentLevel = keepRow(row, filteredRows); + } + } + currentIndex = index; + } + } + return filteredRows; +}; + export const TableContent = memo( ({ editingContextId, @@ -51,41 +109,9 @@ export const TableContent = memo( setLinesState((prev) => prev.map((line) => (line.id === rowId ? { ...line, height } : line))); }; - const getChildrenById = (id: string): GQLLine[] => { - const rowIndex = table.lines.findIndex((row) => row.id === id); - const children: GQLLine[] = []; - if (rowIndex >= 0 && rowIndex + 1 < table.lines.length) { - const level = table.lines[rowIndex]?.depthLevel ?? 0; - let index = rowIndex + 1; - while (index < table.lines.length && (table.lines[index]?.depthLevel ?? 0) > level) { - // keep only direct children - const row = table.lines[index]; - if (row && row.depthLevel === level + 1) { - children.push(row); - } - index++; - } - } - return children; - }; - - const rowIdsToCollapse = (rowId: string): string[] => { - const result: string[] = []; - - result.push(rowId); - // need to check if some sub rows are expanded - const children = getChildrenById(rowId); - for (const child of children) { - if (expandedRowIds.includes(child.id)) { - result.push(...rowIdsToCollapse(child.id)); - } - } - return result; - }; - const onRowExpandCollapse = (rowId: string) => { if (expandedRowIds.includes(rowId)) { - const toRemove = rowIdsToCollapse(rowId); + const toRemove = rowIdsToCollapse(rowId, table.lines, expandedRowIds); setExpandedRowIds((prev) => [...prev.filter((id) => !toRemove.includes(id))]); } else { setExpandedRowIds((prev) => [...prev, rowId]); @@ -182,30 +208,13 @@ export const TableContent = memo( onPaginationChange(pagination.cursor, pagination.direction, pagination.size); }, [pagination.cursor, pagination.size, pagination.direction]); - const keepRow = (row: GQLLine, visibleRows: GQLLine[]): number => { - visibleRows.push(row); - return row.depthLevel; - }; - useEffect(() => { - let filteredRows: GQLLine[] = []; - let currentIndex = 0; - const firstRow = table.lines[currentIndex]; - if (firstRow) { - let currentLevel = keepRow(firstRow, filteredRows); - for (let index = 1; index < table.lines.length; index++) { - const row = table.lines[index]; - if (row && row.depthLevel <= currentLevel) { - currentLevel = keepRow(row, filteredRows); - } else if (row && row.depthLevel > currentLevel) { - if (expandedRowIds.includes(table.lines[currentIndex]!.id)) { - currentLevel = keepRow(row, filteredRows); - } - } - currentIndex = index; - } + if (table.enableSubRows) { + const rowFiltered = filterRowsOnLevel(table.lines, expandedRowIds); + setLinesState([...rowFiltered]); + } else { + setLinesState([...table.lines]); } - setLinesState([...filteredRows]); }, [table, expandedRowIds]); useEffect(() => { diff --git a/packages/tables/frontend/sirius-components-tables/src/table/TableContent.types.ts b/packages/tables/frontend/sirius-components-tables/src/table/TableContent.types.ts index f84a1de428..5c1dd5df3d 100644 --- a/packages/tables/frontend/sirius-components-tables/src/table/TableContent.types.ts +++ b/packages/tables/frontend/sirius-components-tables/src/table/TableContent.types.ts @@ -52,6 +52,7 @@ export interface GQLTable { id: string; targetObjectId: string; stripeRow: boolean; + enableSubRows: boolean; globalFilter: string | null; columns: GQLColumn[]; lines: GQLLine[]; diff --git a/packages/tables/frontend/sirius-components-tables/src/table/useTableColumns.tsx b/packages/tables/frontend/sirius-components-tables/src/table/useTableColumns.tsx index 4e535e2829..b9b2f7e8f9 100644 --- a/packages/tables/frontend/sirius-components-tables/src/table/useTableColumns.tsx +++ b/packages/tables/frontend/sirius-components-tables/src/table/useTableColumns.tsx @@ -19,6 +19,12 @@ import { ResizeRowHandler } from '../rows/ResizeRowHandler'; import { RowHeader } from '../rows/RowHeader'; import { GQLCell, GQLLine, GQLTable } from './TableContent.types'; import { UseTableColumnsValue } from './useTableColumns.types'; +import { RowChevronButton } from '../rows/RowChevronButton'; + +const hasChildren = (id: string, rows: GQLLine[]) => { + const index = rows.findIndex((row) => row.id === id); + return index < rows.length - 1 && (rows.at(index + 1)?.depthLevel ?? 0) === (rows.at(index)?.depthLevel ?? 0) + 1; +}; export const useTableColumns = ( editingContextId: string, @@ -34,14 +40,6 @@ export const useTableColumns = ( onExpandCollapse: (rowId: string) => void, expandedRowIds: string[] ): UseTableColumnsValue => { - const hasChildren = (id: string) => { - const index = table.lines.findIndex((row) => row.id === id); - return ( - index < table.lines.length - 1 && - (table.lines.at(index + 1)?.depthLevel ?? 0) === (table.lines.at(index)?.depthLevel ?? 0) + 1 - ); - }; - const { setSelection } = useSelection(); const columns = useMemo[]>(() => { const columnDefs: MRT_ColumnDef[] = table.columns.map((column) => { @@ -90,12 +88,16 @@ export const useTableColumns = ( }; setSelection(newSelection); }}> - + + {table.enableSubRows && ( + + )} + {enableRowSizing ? ( caseTableWidgetDescription(org.eclips .cellDescriptions(new CellDescriptionConverter(this.tableIdProvider, this.objectService).convert(viewTableWidgetDescription.getCellDescriptions(), this.interpreter)) .lineDescription(new RowDescriptionConverter(this.tableIdProvider, this.semanticTargetIdProvider, variableManager -> "").convert(viewTableWidgetDescription.getRowDescription(), this.interpreter)) + .enableSubRows(false) .build(); var tableWidgetDescription = TableWidgetDescription.newTableWidgetDescription(descriptionId) .targetObjectIdProvider(this.semanticTargetIdProvider) diff --git a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/table/ViewTableRepresentationDescriptionConverter.java b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/table/ViewTableRepresentationDescriptionConverter.java index 5bae2ee6fa..99d8af04cd 100644 --- a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/table/ViewTableRepresentationDescriptionConverter.java +++ b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/table/ViewTableRepresentationDescriptionConverter.java @@ -88,6 +88,7 @@ public IRepresentationDescription convert(RepresentationDescription representati .cellDescriptions(new CellDescriptionConverter(this.tableIdProvider, this.objectService).convert(viewTableDescription.getCellDescriptions(), interpreter)) .isStripeRowPredicate(isStripeRowPredicate) .iconURLsProvider(new ViewIconURLsProvider(interpreter, viewTableDescription.getIconExpression())) + .enableSubRows(false) .build(); }