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

fix(app): allow navbar during LegacyModals on the modal portal #15166

Merged
merged 3 commits into from
May 17, 2024

Conversation

sfoster1
Copy link
Member

@sfoster1 sfoster1 commented May 10, 2024

In theory, the intent both from a programming and a design aspect of having the "modal portal root" - the portal component that lives inside the desktop app's route-component render node - was that modals registered to the modal portal instead of the top portal would occlude page content (i.e. the Devices page, a protocols page, whichever one that modal said it wanted) but not occlude or inhibit interaction with the navbar or the breadcrumbs.

However, because the Overlay component behind LegacyModal (which is the thing that renders the translucent occlusion of background content, and the thing that intercepts interaction) had position: fixed, it would always be positioned as-if its parent were the viewport, meaning that it would always occlude interaction with the entire app, even while centering the actual modal content on the page content. This is wrong.

The solution is for Overlay to be position: absolute, which has most of the same semantics (also creates a z-order stack, allows left:, right:, top:, bottom:, etc) but has its positioning parent be its DOM parent, which in this case is the modal portal element, which means that

  • When a LegacyModal is instantiated via createPortal to the "top level portal root", it will occlude and intercept interaction to everything in the viewport (also previous behavior, correct)
  • When a LegacyModal is instantiated via createPortal to the "modal portal root", it will occlude and intercept interaction to the page content but not the navbar or breadcrumbs (new behavior, correct)
  • When a LegacyModal is instantiated via a normal component render tree, it will occlude and intercept interaction to whatever is below it in the component tree (new behavior, correct - previously this would also intercept and occlude the entire viewport)

This is a lot of words for a small css change, but it affects a whole lot of things.

Review and Testing Requests

  • There should be no change to modals that use the top root, let's smoke test this and check; that should include app update notifications and estop modals
  • We should smoke test the following modals, which use the modal portal and a LegacyModal:
    • Confirm cancelling a run
    • Robot update notifications

In theory, the intent both from a programming and a design aspect of
having the "modal portal root" - the portal component that lives inside
the desktop app's route-component render node - was that modals
registered to the modal portal instead of the top portal would occlude
page content (i.e. the Devices page, a protocols page, whichever one
that modal said it wanted) but _not_ occlude or inhibit interaction with
the navbar or the breadcrumbs.

However, because the Overlay component behind LegacyModal (which is the
thing that renders the translucent occlusion of background content, and
the thing that intercepts interaction) had `position: fixed`, it would
always be positioned as-if its parent were the viewport, meaning that it
would always occlude interaction with the entire app, even while
centering the actual modal content on the page content. This is wrong.

The solution is for Overlay to be `position: absolute`, which has most
of the same semantics (also creates a z-order stack, allows `left:`,
`right:`, `top:`, `bottom:`, etc) but has its positioning parent be its
DOM parent, which in this case is the modal portal element, which means
that
- When a `LegacyModal` is instantiated via `createPortal` to the "top
level portal root", it will occlude and intercept interaction to
everything in the viewport (also previous behavior, correct)
- When a `LegacyModal` is instantiated via `createPortal` to the "modal
portal root", it will occlude and intercept interaction to the page
content but not the navbar or breadcrumbs (new behavior, correct)
- When a `LegacyModal` is instantiated via a normal component render
tree, it will occlude and intercept interaction to whatever is below it
in the component tree (new behavior, correct - previously this would
also intercept and occlude the entire viewport)

This is a lot of words for a small css change, but it affects a whole
lot of things.
@sfoster1 sfoster1 requested a review from a team as a code owner May 10, 2024 20:35
@sfoster1 sfoster1 requested review from koji and removed request for a team May 10, 2024 20:35
sfoster1 added a commit that referenced this pull request May 13, 2024
The implementation of the intervention modal (i.e., manual move labware)
in the desktop app was sort of manually open-coded in the intervention
modal organism. We're going to need modals styled in this way elsewhere,
so split it out into an app molecule with some overridable styles.

Also, make its background wrapper position: absolute instead of
position: fixed, for the same reasons as #15166 - when this modal is
hung off of the modal portal rather than the top portal, it should allow
interaction with the navbar and the breadcrumbs. This should not affect
the modal's use in the actual InterventionRequired organism, since in
the organism the modal is hung off of the top portal.

Closes RSQ-6
sfoster1 added a commit that referenced this pull request May 13, 2024
The implementation of the intervention modal (i.e., manual move labware)
in the desktop app was sort of manually open-coded in the intervention
modal organism. We're going to need modals styled in this way elsewhere,
so split it out into an app molecule with some overridable styles.

Also, make its background wrapper position: absolute instead of
position: fixed, for the same reasons as #15166 - when this modal is
hung off of the modal portal rather than the top portal, it should allow
interaction with the navbar and the breadcrumbs. This should not affect
the modal's use in the actual InterventionRequired organism, since in
the organism the modal is hung off of the top portal.

Closes RSQ-6
@sfoster1 sfoster1 requested a review from mjhuff May 13, 2024 20:24
sfoster1 added a commit that referenced this pull request May 13, 2024
The implementation of the intervention modal (i.e., manual move labware)
in the desktop app was sort of manually open-coded in the intervention
modal organism. We're going to need modals styled in this way elsewhere,
so split it out into an app molecule with some overridable styles.

Also, make its background wrapper position: absolute instead of
position: fixed, for the same reasons as #15166 - when this modal is
hung off of the modal portal rather than the top portal, it should allow
interaction with the navbar and the breadcrumbs. This should not affect
the modal's use in the actual InterventionRequired organism, since in
the organism the modal is hung off of the top portal.

Closes RSQ-6
Copy link
Contributor

@mjhuff mjhuff left a comment

Choose a reason for hiding this comment

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

Yep, this makes sense. Thank you!

This is the only legacy modal on the modal portal that actually wants to
continue having a non-interactive navbar
sfoster1 added a commit that referenced this pull request May 14, 2024
The implementation of the intervention modal (i.e., manual move labware)
in the desktop app was sort of manually open-coded in the intervention
modal organism. We're going to need modals styled in this way elsewhere,
so split it out into an app molecule with some overridable styles.

Also, make its background wrapper position: absolute instead of
position: fixed, for the same reasons as #15166 - when this modal is
hung off of the modal portal rather than the top portal, it should allow
interaction with the navbar and the breadcrumbs. This should not affect
the modal's use in the actual InterventionRequired organism, since in
the organism the modal is hung off of the top portal.

Closes RSQ-6
sfoster1 added a commit that referenced this pull request May 17, 2024
The implementation of the intervention modal (i.e., manual move labware)
in the desktop app was sort of manually open-coded in the intervention
modal organism. We're going to need modals styled in this way elsewhere,
so split it out into an app molecule with some overridable styles.

Also, make its background wrapper position: absolute instead of
position: fixed, for the same reasons as #15166 - when this modal is
hung off of the modal portal rather than the top portal, it should allow
interaction with the navbar and the breadcrumbs. This should not affect
the modal's use in the actual InterventionRequired organism, since in
the organism the modal is hung off of the top portal.

Closes RSQ-6

## Testing
- [x] The new storybook component should render
- [x] Move labware and pause modals on desktop should still render as in
~figma~ the shipping app
- [x] Move labware and pause modals on desktop should continue to ~(a)
visually overlap and (b)~ inhibit interaction with the navbar and
breadcrumbs

the shipping app has these modals confined to the route component area,
while figma has them overlapping everything with a small padding to the
viewport boundary. this pr doesn't change that. the navbar and route
breadcrumbs are still non interactive.
@sfoster1 sfoster1 merged commit 9d75107 into edge May 17, 2024
20 checks passed
@sfoster1 sfoster1 deleted the rsq-6-limited-modals branch May 17, 2024 14:16
Carlos-fernandez pushed a commit that referenced this pull request May 20, 2024
The implementation of the intervention modal (i.e., manual move labware)
in the desktop app was sort of manually open-coded in the intervention
modal organism. We're going to need modals styled in this way elsewhere,
so split it out into an app molecule with some overridable styles.

Also, make its background wrapper position: absolute instead of
position: fixed, for the same reasons as #15166 - when this modal is
hung off of the modal portal rather than the top portal, it should allow
interaction with the navbar and the breadcrumbs. This should not affect
the modal's use in the actual InterventionRequired organism, since in
the organism the modal is hung off of the top portal.

Closes RSQ-6

## Testing
- [x] The new storybook component should render
- [x] Move labware and pause modals on desktop should still render as in
~figma~ the shipping app
- [x] Move labware and pause modals on desktop should continue to ~(a)
visually overlap and (b)~ inhibit interaction with the navbar and
breadcrumbs

the shipping app has these modals confined to the route component area,
while figma has them overlapping everything with a small padding to the
viewport boundary. this pr doesn't change that. the navbar and route
breadcrumbs are still non interactive.
Carlos-fernandez pushed a commit that referenced this pull request May 20, 2024
In theory, the intent both from a programming and a design aspect of
having the "modal portal root" - the portal component that lives inside
the desktop app's route-component render node - was that modals
registered to the modal portal instead of the top portal would occlude
page content (i.e. the Devices page, a protocols page, whichever one
that modal said it wanted) but _not_ occlude or inhibit interaction with
the navbar or the breadcrumbs.

However, because the Overlay component behind LegacyModal (which is the
thing that renders the translucent occlusion of background content, and
the thing that intercepts interaction) had `position: fixed`, it would
always be positioned as-if its parent were the viewport, meaning that it
would always occlude interaction with the entire app, even while
centering the actual modal content on the page content. This is wrong.

The solution is for Overlay to be `position: absolute`, which has most
of the same semantics (also creates a z-order stack, allows `left:`,
`right:`, `top:`, `bottom:`, etc) but has its positioning parent be its
DOM parent, which in this case is the modal portal element, which means
that
- When a `LegacyModal` is instantiated via `createPortal` to the "top
level portal root", it will occlude and intercept interaction to
everything in the viewport (also previous behavior, correct)
- When a `LegacyModal` is instantiated via `createPortal` to the "modal
portal root", it will occlude and intercept interaction to the page
content but not the navbar or breadcrumbs (new behavior, correct)
- When a `LegacyModal` is instantiated via a normal component render
tree, it will occlude and intercept interaction to whatever is below it
in the component tree (new behavior, correct - previously this would
also intercept and occlude the entire viewport)

This is a lot of words for a small css change, but it affects a whole
lot of things.

## Review and Testing Requests
- There should be no change to modals that use the top root, let's smoke
test this and check; that should include app update notifications and
estop modals
- We should smoke test the following modals, which use the modal portal
and a `LegacyModal`:
    - [x] Confirm cancelling a run
    - [x] Robot update notifications
Carlos-fernandez pushed a commit that referenced this pull request Jun 3, 2024
The implementation of the intervention modal (i.e., manual move labware)
in the desktop app was sort of manually open-coded in the intervention
modal organism. We're going to need modals styled in this way elsewhere,
so split it out into an app molecule with some overridable styles.

Also, make its background wrapper position: absolute instead of
position: fixed, for the same reasons as #15166 - when this modal is
hung off of the modal portal rather than the top portal, it should allow
interaction with the navbar and the breadcrumbs. This should not affect
the modal's use in the actual InterventionRequired organism, since in
the organism the modal is hung off of the top portal.

Closes RSQ-6

## Testing
- [x] The new storybook component should render
- [x] Move labware and pause modals on desktop should still render as in
~figma~ the shipping app
- [x] Move labware and pause modals on desktop should continue to ~(a)
visually overlap and (b)~ inhibit interaction with the navbar and
breadcrumbs

the shipping app has these modals confined to the route component area,
while figma has them overlapping everything with a small padding to the
viewport boundary. this pr doesn't change that. the navbar and route
breadcrumbs are still non interactive.
Carlos-fernandez pushed a commit that referenced this pull request Jun 3, 2024
In theory, the intent both from a programming and a design aspect of
having the "modal portal root" - the portal component that lives inside
the desktop app's route-component render node - was that modals
registered to the modal portal instead of the top portal would occlude
page content (i.e. the Devices page, a protocols page, whichever one
that modal said it wanted) but _not_ occlude or inhibit interaction with
the navbar or the breadcrumbs.

However, because the Overlay component behind LegacyModal (which is the
thing that renders the translucent occlusion of background content, and
the thing that intercepts interaction) had `position: fixed`, it would
always be positioned as-if its parent were the viewport, meaning that it
would always occlude interaction with the entire app, even while
centering the actual modal content on the page content. This is wrong.

The solution is for Overlay to be `position: absolute`, which has most
of the same semantics (also creates a z-order stack, allows `left:`,
`right:`, `top:`, `bottom:`, etc) but has its positioning parent be its
DOM parent, which in this case is the modal portal element, which means
that
- When a `LegacyModal` is instantiated via `createPortal` to the "top
level portal root", it will occlude and intercept interaction to
everything in the viewport (also previous behavior, correct)
- When a `LegacyModal` is instantiated via `createPortal` to the "modal
portal root", it will occlude and intercept interaction to the page
content but not the navbar or breadcrumbs (new behavior, correct)
- When a `LegacyModal` is instantiated via a normal component render
tree, it will occlude and intercept interaction to whatever is below it
in the component tree (new behavior, correct - previously this would
also intercept and occlude the entire viewport)

This is a lot of words for a small css change, but it affects a whole
lot of things.

- There should be no change to modals that use the top root, let's smoke
test this and check; that should include app update notifications and
estop modals
- We should smoke test the following modals, which use the modal portal
and a `LegacyModal`:
    - [x] Confirm cancelling a run
    - [x] Robot update notifications
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants