-
Notifications
You must be signed in to change notification settings - Fork 61
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[4403] Add support of actions in table rows context menu #4405
[4403] Add support of actions in table rows context menu #4405
Conversation
packages/tables/frontend/sirius-components-tables/src/rows/RowContextMenu.tsx
Outdated
Show resolved
Hide resolved
packages/tables/frontend/sirius-components-tables/src/rows/useRowContextMenuEntries.ts
Outdated
Show resolved
Hide resolved
packages/tables/frontend/sirius-components-tables/src/rows/useRowContextMenuEntries.types.ts
Outdated
Show resolved
Hide resolved
packages/tables/frontend/sirius-components-tables/src/rows/useRowContextMenuEntries.types.ts
Outdated
Show resolved
Hide resolved
packages/tables/frontend/sirius-components-tables/src/rows/RowContextMenu.tsx
Outdated
Show resolved
Hide resolved
packages/tables/frontend/sirius-components-tables/src/rows/RowContextMenu.types.ts
Outdated
Show resolved
Hide resolved
@@ -1,5 +1,5 @@ | |||
/******************************************************************************* |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Github indicates that this file is moved from ResizeRowHandler (that thus does not exist anymore), is it normal
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ResizeRowHandler
has been removed from the table/row
folder since it has been copied into rows
.
RowContextMenu.types.ts
is a new file.
@@ -1,73 +0,0 @@ | |||
/******************************************************************************* |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why deleted
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It was already copied in rows
folder but not removed at this time.
@@ -126,9 +127,9 @@ export const TableContent = memo( | |||
onPaginationChange(pagination.cursor, pagination.direction, pagination.size); | |||
}, [pagination.cursor, pagination.size, pagination.direction]); | |||
|
|||
const handleRowHeightChange = (rowId, height) => { | |||
function handleRowHeightChange(rowId, height) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why this change ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This change is to avoid massive code changes.
This function is now passed as a parameter of useTableColumns
located at the beginning of the component.
It would have been moved before it was passed to useTableColumns
and bring with it other codes.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
????
I don't understand why changing the signature of this function solves any issue
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I found out by reverting this, you were using code hoisting to have access to this value before it was declared.
O______ô
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The whole row-resizing feature is already in a dire need of a complete re-write, let's not add additional reason to this situation. Just move the code 20lines above instead of trying to access variables before they exist.
...bles/backend/sirius-components-collaborative-tables/src/main/resources/schema/table.graphqls
Outdated
Show resolved
Hide resolved
3aee130
to
34b2e24
Compare
bb65198
to
b6f2a74
Compare
b6f2a74
to
da1a252
Compare
da1a252
to
7d9aaac
Compare
|
||
@Override | ||
public List<RowContextMenuEntry> getRowContextMenuEntries(IEditingContext editingContext, TableDescription tableDescription, Table table, Line row) { | ||
return List.of(new RowContextMenuEntry(DELETE_ID, DELETE_LABEL, List.of("/icons/full/obj16/DeleteTool.svg"))); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't just reference images from other unrelated modules like that. The Papaya example table has no real links to the support for diagrams in the view DSL.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Changed, I added a dedicated icon for this action
if (tableInput instanceof InvokeRowContextMenuEntryInput invokeRowContextMenuEntryInput) { | ||
var optionalRow = this.tableQueryService.findLineById(tableContext.getTable(), invokeRowContextMenuEntryInput.rowId()); | ||
if (optionalRow.isPresent()) { | ||
Line row = optionalRow.get(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should really clarify this naming convention of line vs row one day.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It was originally named line
but as the standard name is row
we use it for new developments.
We did not refactor existing code because is not related to the current feature and we thought that a dedicated issue could be filed in future with the goal to align naming convention over all table code.
.../org/eclipse/sirius/components/collaborative/tables/handlers/RowContextMenuEventHandler.java
Outdated
Show resolved
Hide resolved
...orative-tables/src/main/resources/messages/sirius-components-collaborative-tables.properties
Outdated
Show resolved
Hide resolved
...bles/backend/sirius-components-collaborative-tables/src/main/resources/schema/table.graphqls
Outdated
Show resolved
Hide resolved
packages/tables/frontend/sirius-components-tables/src/rows/useRowContextMenuEntries.types.ts
Outdated
Show resolved
Hide resolved
@@ -126,9 +127,9 @@ export const TableContent = memo( | |||
onPaginationChange(pagination.cursor, pagination.direction, pagination.size); | |||
}, [pagination.cursor, pagination.size, pagination.direction]); | |||
|
|||
const handleRowHeightChange = (rowId, height) => { | |||
function handleRowHeightChange(rowId, height) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
????
I don't understand why changing the signature of this function solves any issue
enableColumnPinning: true, | ||
initialState: { | ||
showGlobalFilter: enableGlobalFilter, | ||
columnPinning: { left: ['mrt-row-header'], right: ['mrt-row-actions'] }, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What's the link with row actions?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Row header and actions columns should be sticky
packages/tables/frontend/sirius-components-tables/src/table/TableContent.tsx
Outdated
Show resolved
Hide resolved
representationId={representationId} | ||
tableId={table.id} | ||
row={row} | ||
table={MRT_table} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
table prop has been removed
|
||
private final IObjectSearchService objectSearchService; | ||
|
||
private final Function<EObject, UUID> idProvider = (eObject) -> UUID.nameUUIDFromBytes(EcoreUtil.getURI(eObject).toString().getBytes()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why does that has to be a field?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Comes from copy/paste.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
And now it's just some dead code...
.../main/java/org/eclipse/sirius/components/view/emf/table/ViewRowContextMenuEntryExecutor.java
Outdated
Show resolved
Hide resolved
.../main/java/org/eclipse/sirius/components/view/emf/table/ViewRowContextMenuEntryExecutor.java
Outdated
Show resolved
Hide resolved
.../main/java/org/eclipse/sirius/components/view/emf/table/ViewRowContextMenuEntryExecutor.java
Outdated
Show resolved
Hide resolved
.../main/java/org/eclipse/sirius/components/view/emf/table/ViewRowContextMenuEntryExecutor.java
Outdated
Show resolved
Hide resolved
...-tables/src/main/java/org/eclipse/sirius/components/tables/descriptions/LineDescription.java
Outdated
Show resolved
Hide resolved
if (precondition != null && !precondition.isBlank()) { | ||
return this.evaluateBoolean(variableManager, interpreter, precondition); | ||
} | ||
return false; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it normal? Why return false by default instead of true?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You are right. Should be true
.../main/java/org/eclipse/sirius/components/view/emf/table/ViewRowContextMenuEntryProvider.java
Outdated
Show resolved
Hide resolved
|
||
private boolean isValidActionPrecondition(org.eclipse.sirius.components.view.table.RowContextMenuEntry viewContextAction, VariableManager variableManager, AQLInterpreter interpreter) { | ||
var precondition = viewContextAction.getPreconditionExpression(); | ||
if (precondition != null && !precondition.isBlank()) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The fact that the expression may be null or blank is not your concern, remove those checks they are done within the interpreter already.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the expression evaluation has been inlined and this method removed
.../main/java/org/eclipse/sirius/components/view/emf/table/ViewRowContextMenuEntryProvider.java
Outdated
Show resolved
Hide resolved
7d9aaac
to
89d48b9
Compare
1d28a58
to
6bb3e40
Compare
6bb3e40
to
7c1fa9f
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I will update the PR and merge it. As it stands today, it simply does not work in half of the use cases and crashes. I'll make sure it fails gracefully but it's really incomplete.
Tons of contributions have been submitted on tables without taking into account the whole picture on this subject. I shouldn't be the only one testing for real given that I have ensured that examples are available on Papaya.
"rowId", rowId.get().toString() | ||
); | ||
var result = this.rowContextMenuQueryRunner.run(variables); | ||
Object document = Configuration.defaultConfiguration().jsonProvider().parse(result); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As I suspected it, it does nothing, I've removed it
"tableId", tableId.get(), | ||
"rowId", rowId.get().toString()); | ||
var result = this.rowContextMenuQueryRunner.run(variables); | ||
Object document = Configuration.defaultConfiguration().jsonProvider().parse(result); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same comment
* @author Jerome Gout | ||
*/ | ||
public interface IRowContextMenuEntryExecutor { | ||
boolean canExecute(TableDescription tableDescription, String tableId, String rowId, String rowMenuContextEntryId); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's a bit odd to provide only id's here and instance below
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
* | ||
* @author Jerome Gout | ||
*/ | ||
public record RowContextMenuEntry(String id, String label, List<String> iconURLs) { } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
require non null
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
* | ||
* @author Jerome Gout | ||
*/ | ||
public record RowContextMenuSuccessPayload(UUID id, List<RowContextMenuEntry> entries) implements IPayload { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
require non null
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
viewer: GQLGetAllRowContextMenuEntriesViewer; | ||
} | ||
|
||
export interface GQLGetAllRowContextMenuEntriesViewer { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
GQLViewer containing a GQLEditingContext containing a GQLRepresentationMetadata containing a GQLRepresentationDescription which can be a GQLTableDescription... The types are wrong and thus the code can crash
const rowHeaderColumn: MRT_ColumnDef<GQLLine, string> = { | ||
id: 'mrt-row-header', | ||
header: '', | ||
size: 200, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why 200? Why hardcode this?
@@ -126,9 +127,9 @@ export const TableContent = memo( | |||
onPaginationChange(pagination.cursor, pagination.direction, pagination.size); | |||
}, [pagination.cursor, pagination.size, pagination.direction]); | |||
|
|||
const handleRowHeightChange = (rowId, height) => { | |||
function handleRowHeightChange(rowId, height) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I found out by reverting this, you were using code hoisting to have access to this value before it was declared.
O______ô
@@ -126,9 +127,9 @@ export const TableContent = memo( | |||
onPaginationChange(pagination.cursor, pagination.direction, pagination.size); | |||
}, [pagination.cursor, pagination.size, pagination.direction]); | |||
|
|||
const handleRowHeightChange = (rowId, height) => { | |||
function handleRowHeightChange(rowId, height) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The whole row-resizing feature is already in a dire need of a complete re-write, let's not add additional reason to this situation. Just move the code 20lines above instead of trying to access variables before they exist.
|
||
private final IObjectSearchService objectSearchService; | ||
|
||
private final Function<EObject, UUID> idProvider = (eObject) -> UUID.nameUUIDFromBytes(EcoreUtil.getURI(eObject).toString().getBytes()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
And now it's just some dead code...
7c1fa9f
to
612a8d2
Compare
Most issues detected should be fixed now, I'll wait for the build to merge it. |
612a8d2
to
b1dd897
Compare
Bug: eclipse-sirius#4403 Signed-off-by: Jerome Gout <[email protected]>
Bug: eclipse-sirius#4403 Signed-off-by: Jerome Gout <[email protected]>
b1dd897
to
09ec261
Compare
I'll dismiss this review to move forward and merge the PR. I've personally fixed most of the issues detected.
Bug: #4403
Pull request template
General purpose
What is the main goal of this pull request?
Project management
priority:
andpr:
labels been added to the pull request? (In case of doubt, start with the labelspriority: low
andpr: to review later
)area:
,difficulty:
,type:
)CHANGELOG.adoc
been updated to reference the relevant issues?CHANGELOG.adoc
? (Including changes in the GraphQL API)CHANGELOG.adoc
? For example indoc/screenshots/2022.5.0-my-new-feature.png
Architectural decision records (ADR)
[doc]
?CHANGELOG.adoc
?Dependencies
CHANGELOG.adoc
?CHANGELOG.adoc
?Frontend
This section is not relevant if your contribution does not come with changes to the frontend.
General purpose
Typing
We need to improve the typing of our code, as such, we require every contribution to come with proper TypeScript typing for both changes contributing new files and those modifying existing files.
Please ensure that the following statements are true for each file created or modified (this may require you to improve code outside of your contribution).
useMutation<DATA_TYPE, VARIABLE_TYPE>(…)
useQuery<DATA_TYPE, VARIABLE_TYPE>(…)
useSubscription<DATA_TYPE, VARIABLE_TYPE>(…)
useMachine<CONTEXT_TYPE, EVENTS_TYPE>(…)
useState<STATE_TYPE>(…)
?.
(if the GraphQL API specifies that a field cannot benull
, do not treat it has potentiallynull
for example)let diagram: Diagram | null = null;
)Backend
This section is not relevant if your contribution does not come with changes to the backend.
General purpose
Architecture
Review
How to test this PR?
Please describe here the various use cases to test this pull request