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(core): fix issues with PT-Input PopoverModal #8021

Merged
merged 2 commits into from
Dec 13, 2024

Conversation

skogsmaskin
Copy link
Member

@skogsmaskin skogsmaskin commented Dec 12, 2024

Description

  • Remove the workaround for the @sanity/ui issue (which has been fixed) with the initial rendering in the wrong position. This is no longer needed and can cause problems with assertions in tests.

  • Implement focus locking inside the modal. The PopoverModal should have the same kind of focus locking as other dialogs

What to review

That popover modals for links inside the Portable Text Input traps focus and work as expected.

The popover modal position is correct when first opened.

Testing

Open a Portable Text Editor with a link schema type and do the review steps above.

Notes for release

  • Keep tab focus inside Popover Dialogs for the Portable Text Input when editing links and similar.

Copy link

vercel bot commented Dec 12, 2024

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
page-building-studio ✅ Ready (Inspect) Visit Preview 💬 Add feedback Dec 13, 2024 1:06pm
performance-studio ✅ Ready (Inspect) Visit Preview 💬 Add feedback Dec 13, 2024 1:06pm
test-next-studio ✅ Ready (Inspect) Visit Preview 💬 Add feedback Dec 13, 2024 1:06pm
test-studio ✅ Ready (Inspect) Visit Preview 💬 Add feedback Dec 13, 2024 1:06pm
1 Skipped Deployment
Name Status Preview Comments Updated (UTC)
studio-workshop ⬜️ Ignored (Inspect) Visit Preview Dec 13, 2024 1:06pm

Copy link
Contributor

No changes to documentation

Copy link
Contributor

github-actions bot commented Dec 12, 2024

Component Testing Report Updated Dec 13, 2024 1:01 PM (UTC)

❌ Failed Tests (6) -- expand for details
File Status Duration Passed Skipped Failed
comments/CommentInput.spec.tsx ✅ Passed (Inspect) 1m 12s 15 0 0
formBuilder/ArrayInput.spec.tsx ✅ Passed (Inspect) 14s 3 0 0
formBuilder/inputs/PortableText/Annotations.spec.tsx ✅ Passed (Inspect) 40s 6 0 0
formBuilder/inputs/PortableText/copyPaste/CopyPaste.spec.tsx ✅ Passed (Inspect) 56s 11 7 0
formBuilder/inputs/PortableText/copyPaste/CopyPasteFields.spec.tsx ✅ Passed (Inspect) 0s 0 12 0
formBuilder/inputs/PortableText/Decorators.spec.tsx ✅ Passed (Inspect) 28s 6 0 0
formBuilder/inputs/PortableText/DisableFocusAndUnset.spec.tsx ✅ Passed (Inspect) 15s 3 0 0
formBuilder/inputs/PortableText/DragAndDrop.spec.tsx ❌ Failed (Inspect) 4m 27s 0 0 6
formBuilder/inputs/PortableText/FocusTracking.spec.tsx ✅ Passed (Inspect) 1m 13s 15 0 0
formBuilder/inputs/PortableText/Input.spec.tsx ✅ Passed (Inspect) 3m 1s 21 0 0
formBuilder/inputs/PortableText/ObjectBlock.spec.tsx ✅ Passed (Inspect) 1m 48s 18 0 0
formBuilder/inputs/PortableText/PresenceCursors.spec.tsx ✅ Passed (Inspect) 14s 3 9 0
formBuilder/inputs/PortableText/RangeDecoration.spec.tsx ✅ Passed (Inspect) 42s 9 0 0
formBuilder/inputs/PortableText/Styles.spec.tsx ✅ Passed (Inspect) 29s 6 0 0
formBuilder/inputs/PortableText/Toolbar.spec.tsx ✅ Passed (Inspect) 1m 53s 21 0 0
formBuilder/tree-editing/TreeEditing.spec.tsx ✅ Passed (Inspect) 0s 0 3 0
formBuilder/tree-editing/TreeEditingNestedObjects.spec.tsx ✅ Passed (Inspect) 0s 0 3 0

Copy link
Contributor

github-actions bot commented Dec 12, 2024

⚡️ Editor Performance Report

Updated Fri, 13 Dec 2024 13:01:46 GMT

Benchmark reference
latency of sanity@latest
experiment
latency of this branch
Δ (%)
latency difference
article (title) 24.4 efps (41ms) 24.4 efps (41ms) +0ms (-/-%)
article (body) 72.5 efps (14ms) 72.7 efps (14ms) -0ms (-/-%)
article (string inside object) 26.3 efps (38ms) 27.0 efps (37ms) -1ms (-2.6%)
article (string inside array) 24.4 efps (41ms) 24.1 efps (42ms) +1ms (+1.2%)
recipe (name) 50.0 efps (20ms) 50.0 efps (20ms) +0ms (-/-%)
recipe (description) 55.6 efps (18ms) 52.6 efps (19ms) +1ms (+5.6%)
recipe (instructions) 99.9+ efps (5ms) 99.9+ efps (5ms) +0ms (-/-%)
synthetic (title) 19.6 efps (51ms) 20.4 efps (49ms) -2ms (-3.9%)
synthetic (string inside object) 19.2 efps (52ms) 19.2 efps (52ms) +0ms (-/-%)

efps — editor "frames per second". The number of updates assumed to be possible within a second.

Derived from input latency. efps = 1000 / input_latency

Detailed information

🏠 Reference result

The performance result of sanity@latest

Benchmark latency p75 p90 p99 blocking time test duration
article (title) 41ms 43ms 47ms 166ms 198ms 10.4s
article (body) 14ms 16ms 18ms 52ms 208ms 5.2s
article (string inside object) 38ms 42ms 52ms 179ms 162ms 6.8s
article (string inside array) 41ms 43ms 56ms 174ms 167ms 6.9s
recipe (name) 20ms 22ms 25ms 59ms 0ms 7.0s
recipe (description) 18ms 20ms 22ms 31ms 0ms 4.6s
recipe (instructions) 5ms 7ms 8ms 16ms 0ms 3.1s
synthetic (title) 51ms 53ms 61ms 127ms 244ms 12.7s
synthetic (string inside object) 52ms 54ms 59ms 380ms 665ms 8.1s

🧪 Experiment result

The performance result of this branch

Benchmark latency p75 p90 p99 blocking time test duration
article (title) 41ms 44ms 53ms 172ms 202ms 11.2s
article (body) 14ms 15ms 18ms 45ms 65ms 4.7s
article (string inside object) 37ms 39ms 44ms 284ms 296ms 6.7s
article (string inside array) 42ms 43ms 49ms 164ms 134ms 7.0s
recipe (name) 20ms 22ms 26ms 42ms 0ms 6.8s
recipe (description) 19ms 20ms 23ms 40ms 0ms 4.7s
recipe (instructions) 5ms 7ms 8ms 24ms 0ms 3.1s
synthetic (title) 49ms 51ms 56ms 119ms 141ms 12.6s
synthetic (string inside object) 52ms 54ms 70ms 307ms 527ms 8.0s

📚 Glossary

column definitions

  • benchmark — the name of the test, e.g. "article", followed by the label of the field being measured, e.g. "(title)".
  • latency — the time between when a key was pressed and when it was rendered. derived from a set of samples. the median (p50) is shown to show the most common latency.
  • p75 — the 75th percentile of the input latency in the test run. 75% of the sampled inputs in this benchmark were processed faster than this value. this provides insight into the upper range of typical performance.
  • p90 — the 90th percentile of the input latency in the test run. 90% of the sampled inputs were faster than this. this metric helps identify slower interactions that occurred less frequently during the benchmark.
  • p99 — the 99th percentile of the input latency in the test run. only 1% of sampled inputs were slower than this. this represents the worst-case scenarios encountered during the benchmark, useful for identifying potential performance outliers.
  • blocking time — the total time during which the main thread was blocked, preventing user input and UI updates. this metric helps identify performance bottlenecks that may cause the interface to feel unresponsive.
  • test duration — how long the test run took to complete.

if (contentElement) {
contentElement.querySelector('input')?.focus()
}
}, [contentElement])
Copy link
Member Author

Choose a reason for hiding this comment

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

This should rather be handled by the autoFocus prop so that it works like the other Modals we use (where the first focusable element is focused, usually the close-button).

Copy link
Contributor

Choose a reason for hiding this comment

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

That works in my testing 👍.

@skogsmaskin skogsmaskin marked this pull request as ready for review December 12, 2024 11:14
@skogsmaskin skogsmaskin requested a review from a team as a code owner December 12, 2024 11:14
@skogsmaskin skogsmaskin requested review from ricokahler and removed request for a team December 12, 2024 11:14
@skogsmaskin skogsmaskin changed the title fix(core): fix two issues with PortableText Input PopoverModal fix(core): issues with PortableText Input PopoverModal Dec 12, 2024
@skogsmaskin skogsmaskin force-pushed the fix/pte-popover-modal branch from c68ca36 to 465db20 Compare December 12, 2024 11:45
@skogsmaskin skogsmaskin changed the title fix(core): issues with PortableText Input PopoverModal fix(core): fix issues with PortableText Input PopoverModal Dec 12, 2024
@skogsmaskin skogsmaskin changed the title fix(core): fix issues with PortableText Input PopoverModal fix(core): fix issues with PT-Input PopoverModal Dec 12, 2024
@skogsmaskin skogsmaskin force-pushed the fix/pte-popover-modal branch from 465db20 to f986921 Compare December 12, 2024 12:31
…pover Modal

The PopoverModal should have the same kind of focus locking as other dialogs
Copy link
Contributor

@juice49 juice49 left a comment

Choose a reason for hiding this comment

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

Looks good to me 🙌. I tried this in Test Studio, and it worked as you described. I added one small comment, but it's not a blocker.

contentElement.querySelector('input')?.focus()
}
}, [contentElement])
const handleFocusLockWhiteList = useCallback((element: HTMLElement) => {
Copy link
Contributor

Choose a reason for hiding this comment

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

Language nit: we should use a term like allowList instead.

Copy link
Member Author

Choose a reason for hiding this comment

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

allowList

The dependency library uses this term, so it's supposed to match that.

if (contentElement) {
contentElement.querySelector('input')?.focus()
}
}, [contentElement])
Copy link
Contributor

Choose a reason for hiding this comment

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

That works in my testing 👍.

@skogsmaskin skogsmaskin added this pull request to the merge queue Dec 13, 2024
Merged via the queue into next with commit ded659e Dec 13, 2024
58 checks passed
@skogsmaskin skogsmaskin deleted the fix/pte-popover-modal branch December 13, 2024 15:20
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.

2 participants