Skip to content
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

[2418] Extract synchronize with selection into a hook #2419

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

gcoutable
Copy link
Contributor

Pull request template

General purpose

What is the main goal of this pull request?

  • Bug fixes
  • New features
  • Documentation
  • Cleanup
  • Tests
  • Build / releng

Project management

  • Has the pull request been added to the relevant project and milestone? (Only if you know that your work is part of a specific iteration such as the current one)
  • Have the priority: and pr: labels been added to the pull request? (In case of doubt, start with the labels priority: low and pr: to review later)
  • Have the relevant issues been added to the pull request?
  • Have the relevant labels been added to the issues? (area:, difficulty:, type:)
  • Have the relevant issues been added to the same project and milestone as the pull request?
  • Has the CHANGELOG.adoc been updated to reference the relevant issues?
  • Have the relevant API breaks been described in the CHANGELOG.adoc? (Including changes in the GraphQL API)
  • In case of a change with a visual impact, are there any screenshots in the CHANGELOG.adoc? For example in doc/screenshots/2022.5.0-my-new-feature.png

Architectural decision records (ADR)

  • Does the title of the commit contributing the ADR start with [doc]?
  • Are the ADRs mentioned in the relevant section of the CHANGELOG.adoc?

Dependencies

  • Are the new / upgraded dependencies mentioned in the relevant section of the CHANGELOG.adoc?
  • Are the new dependencies justified in the CHANGELOG.adoc?

Frontend

This section is not relevant if your contribution does not come with changes to the frontend.

General purpose

  • Is the code properly tested? (Plain old JavaScript tests for business code and tests based on React Testing Library for the components)

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).

  • Variables have a proper type
  • Functions’ arguments have a proper type
  • Functions’ return type are specified
  • Hooks are properly typed:
    • useMutation<DATA_TYPE, VARIABLE_TYPE>(…)
    • useQuery<DATA_TYPE, VARIABLE_TYPE>(…)
    • useSubscription<DATA_TYPE, VARIABLE_TYPE>(…)
    • useMachine<CONTEXT_TYPE, EVENTS_TYPE>(…)
    • useState<STATE_TYPE>(…)
  • All components have a proper typing for their props
  • No useless optional chaining with ?. (if the GraphQL API specifies that a field cannot be null, do not treat it has potentially null for example)
  • Nullable values have a proper type (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

  • Are all the event handlers tested?
  • Are the event processor tested?
  • Is the business code (services) tested?
  • Are diagram layout changes tested?

Architecture

  • Are data structure classes properly separated from behavioral classes?
  • Are all the relevant fields final?
  • Is any data structure mutable? If so, please write a comment indicating why
  • Are behavioral classes either stateless or side effect free?

Review

How to test this PR?

Please describe here the various use cases to test this pull request

  • Has the Kiwi TCMS test suite been updated with tests for this contribution?

CHANGELOG.adoc Outdated Show resolved Hide resolved
CHANGELOG.adoc Outdated Show resolved Hide resolved
CHANGELOG.adoc Outdated
@@ -156,6 +158,7 @@ These color palettes are accessible in studio projects but are not visible in th
- [ADR-104] Add support for Help Expressions in Form widgets
- [ADR-105] Add custom widget to edit EMF references
- [ADR-106] Add the support for the palette with react flow
- [ADR-107] - Improve frontend selection support
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • Should be moved to 2023.12 (and remove the " -" which is not present in the others.
  • We're now at ADR 122, this would be (at least) ADR 123.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done


```

This makes sense because the selection is relative to a particular project/editing context.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, maybe not always.
I am working on Portals support, where one I need more control on how the selection inside the representations displayed in a portal are synchronized with the global, project-wide selection.

This is just a remark, it seems that even with this new approach I should be able to locally override the selection handling for my case. It might be worth mentioning, you decide.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually I see that the pattern is used in e.g. modals to get a local selection.

@@ -0,0 +1,75 @@
= ADR-107 - Improve frontend selection support
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This does not mention the SynchonizeWithSelection API also added here.


const setSelection = useCallback((selection: Selection) => {
const selectedRepresentation = selection.entries.filter(isRepresentation);
setState((prevState) => ({ ...prevState, selection, selectedRepresentation }));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

selectedRepresentation is not declared in SelectionContextProviderState.
If the frontend still compiles I guess it means it's not actually used anywhere?

I suppose it should be used in the workbench, but the code there continues to read the full selection and do its own filtering (equivalent to this one):

 const representations: Representation[] = selection.entries.filter((entry) =>
      entry.kind.startsWith('siriusComponents://representation')
    );

@@ -170,9 +148,9 @@ export const workbenchMachine = Machine<WorkbenchContext, WorkbenchStateSchema,

const newSelectedRepresentations = [...representations, ...newRepresentations];

return { selection, displayedRepresentation, representations: newSelectedRepresentations };
return { displayedRepresentation, representations: newSelectedRepresentations };
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems we're losing the test we had before which prevented "changing" the state with the same selected representations.

toggleSynchronizeWithSelection();
};

const preferenceButtonSynchroniseTitle = isSynchronized
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The code uses the US spelling ("synchroni[z]ed" with a "z") except for here (variable names an titles, use the UK spelling, with an "s").

@sbegaudeau sbegaudeau force-pushed the gco/enh/useselection branch 8 times, most recently from 35cbc34 to e262c60 Compare December 15, 2023 13:23
Base automatically changed from gco/enh/useselection to master December 15, 2023 13:39
@gcoutable gcoutable force-pushed the gco/enh/synchronizeWithSelection-hook branch 2 times, most recently from a30af8c to 2ee28ac Compare December 19, 2023 14:23
@gcoutable
Copy link
Contributor Author

I have some doubt about the implementation here, @sbegaudeau we should discuss about that

@gcoutable gcoutable force-pushed the gco/enh/synchronizeWithSelection-hook branch 2 times, most recently from 5aeaf09 to 05b3848 Compare December 19, 2023 14:44
@sbegaudeau sbegaudeau modified the milestones: 2024.1.0, 2024.3.0 Jan 23, 2024
@gcoutable gcoutable modified the milestones: 2024.3.0, 2024.5.0 Apr 2, 2024
@gcoutable gcoutable force-pushed the gco/enh/synchronizeWithSelection-hook branch from 05b3848 to 1faf644 Compare April 2, 2024 10:42
Bug: #2418
Signed-off-by: Guillaume Coutable <guillaume.coutable@obeo.fr>
@gcoutable gcoutable force-pushed the gco/enh/synchronizeWithSelection-hook branch from 1faf644 to 42cfbaa Compare April 2, 2024 10:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Extract synchonize with selection from the TreeToolBar into a hook
3 participants