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(lexical-list): remove list breaks if selection in empty #2672

Merged
merged 3 commits into from
Jul 21, 2022

Conversation

LuciNyan
Copy link
Contributor

@LuciNyan LuciNyan commented Jul 21, 2022

Description

When the anchor and focus of our selection fall on the textNode, we don't have to change the selection because the textNode will be appended to the newly generated paragraph.

When selection is in empty nested list item, selection is actually on the listItemNode. When the corresponding listItemNode is deleted and replaced by the newly generated paragraph, we should manually set the selection's focus and anchor to the newly generated paragraph.

closes #2640

2022-07-21.17.03.32.mov

@facebook-github-bot facebook-github-bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Jul 21, 2022
@vercel
Copy link

vercel bot commented Jul 21, 2022

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

Name Status Preview Updated
lexical ✅ Ready (Inspect) Visit Preview Jul 21, 2022 at 9:46AM (UTC)
lexical-playground ✅ Ready (Inspect) Visit Preview Jul 21, 2022 at 9:46AM (UTC)

Copy link
Member

@zurfyx zurfyx left a comment

Choose a reason for hiding this comment

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

Thanks for taking a stab on this! Seems like the problem is deeper than a selection issue.

First of, note that .remove recovers the selection automatically when the selection is correctly placed. Suspect bad behavior when this does not happen.

Second, the behavior you described in the test is probably not what we're after, see how GDocs does it. It moves the list item node as a paragraph item.

Third, I would change a few things on the implementation:

  1. Remove items should work on the current item list node rather than trying to reorganize all the nodes
    Screen Shot 2022-07-21 at 5 39 45 pm Why are we looking at all the top nodes?
  2. I'm suspicious about the correctness of splice, probably worth revisiting selection logic there to make sure it's being recovered gracefully
  3. forEach is not recommended

Let me know if you want me to help with this

cc @acywatson

Copy link
Member

@zurfyx zurfyx left a comment

Choose a reason for hiding this comment

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

Your fix is correct! Added more details on the linked PR but we can merge this.

(As for the fist point about the behavior I think we should revisit this, not sure this behavior is very desirable but your fix addresses the bug so it's correct)

@zurfyx zurfyx merged commit b491f01 into facebook:main Jul 21, 2022
@LuciNyan
Copy link
Contributor Author

Added more details on the linked PR but we can merge this.

Thank you @zurfyx ! That's awesome! I learned a lot from your PR. You've solved a big potential problem. <3

karam-qaoud pushed a commit to karam-qaoud/lexical that referenced this pull request Jul 26, 2022
…#2672)

* fix(lexical-list): remove list breaks if selection in empty

* chore: add a comment

* chore: add test
karam-qaoud added a commit that referenced this pull request Jul 26, 2022
* Fixed getStyleObjectFromRawCSS function to work for unformatted css strings

* Testing that  handles unformatted css text

* Testing that $getStyleObjectFromRawCss handles unformatted css

* Added TableOfContents

* Renamed TableOfContetnsPlugin file name and added flow file

* Added TableOfContentsPlugin to config files and added styling

* Fixed types

* Added TableOfContentsList as a seperate module

* Fixed type of tag from string to HeadingTagType

* Table of contents updates as user scrolls

* Wrapped plugin in a feature

* Deleted package-lock.json

* Fixed conditioanl rendering syntax

* Removed extra parameter

* package-lock

* fix imports

* Update packages/lexical-playground/src/plugins/TableOfContentsPlugin.tsx

Co-authored-by: Gerard Rovira <zurfyx@users.noreply.github.com>

* Added sticky styling and handled text overflow

* Table of contents updates automtaically on scroll without observing all heading nodes

* Update table correctly  when headings are not visible but exist either up or down

* Fix failing E2E

* Changed isTableOfContentes to showTableOfContents in settings

* Added useEffect to fix memory leak

* Hoisted functions that don't use props

* Renamed isTableOfContets to showTableOfContents

* Changing selectedHeading by observing page top

* resolved lint error

* Refactored scroll up logic

* Added comments

* Added better css

* Changed place of toc div to fix failing test

* Fixed adjacent headings scrolling

* Fixed adjacent headings bug

* Renamed helper methods

* Fixed test

* Added dependency array to useEffect

* Added TableOfContents to dependency array

* Updated dependeny array in useEffect

* Created e2e test file for table of contents plugin

* Added scroll test

* E2E test: Adding heading to editor adds them to table-of-contents

* clean up

* Refactored getEditorElement

* Scrolling callback has better conditions

* Table of contents is now covering all edge cases and doesn't freeze webpage

* Solved page freezing

* Added one more assert statment to second test

* chore(lexical-playground): make directory clear (#2674)

* Conditionally utilize `startTransition` if it's present (#2676)

* Only utilize startTransition if it's available

* Add type annotation

* Run prettier

* fix(lexical-list): remove list breaks if selection in empty (#2672)

* fix(lexical-list): remove list breaks if selection in empty

* chore: add a comment

* chore: add test

* Separate `@lexical/code` into more atomic modules (#2673)

* separate code package into more atomic modules

* remove utils

* named exports

* Fixed typo (#2678)

* fix: path to icons (#2683)

* Fix VALID_TWITTER_URL to allow underscores. (#2690)

* fix(lexical-playground): LexicalTypeaheadMenuPlugin import (#2689)

Use the correct import path that available in NPM package

* Collapse and Expand DevTools Tree Nodes (#2679)

* fix(playground): fix rendering Exclidraw (#2694)

* Make includeHeaders a boolean (#2697)

Changed type for includeHeaders parameter from string to boolean to match the type of the parameter from the $createTableNodeWithDimensions function.

* Remove coverage reports (#2699)

* fix: check if options are empty (#2701)

* feat: Link node with target and rel (#2687)

* OnChangePlugin ignoreInitialChange -> ignoreHistoryMergeTagChange (#2706)

* OnChangePlugin ignoreInitialChange -> ignoreHistoryMergeTag

* .

* default to false because 0.4

Co-authored-by: Karam Qaoud <kqaoud@fb.com>
Co-authored-by: Gerard Rovira <zurfyx@users.noreply.github.com>
Co-authored-by: 子瞻 Luci <haru.lucinyan@gmail.com>
Co-authored-by: Jack Hanford <jackhanford@gmail.com>
Co-authored-by: John Flockton <thegreatercurve@users.noreply.github.com>
Co-authored-by: SalvadorLekan <66782276+SalvadorLekan@users.noreply.github.com>
Co-authored-by: Adithya Vardhan <imadithyavardhan@gmail.com>
Co-authored-by: hiraoka <62982380+y-hiraoka@users.noreply.github.com>
Co-authored-by: Elvin Dzhavadov <elvin.d@outlook.com>
Co-authored-by: Will <will.gutierrez@gmail.com>
Co-authored-by: Bryan <ImSingee@users.noreply.github.com>
Co-authored-by: alinamusuroi <44519061+alinamusuroi@users.noreply.github.com>
Co-authored-by: Andriy Chemerynskiy <andrzej.chem@gmail.com>
thegreatercurve pushed a commit that referenced this pull request Nov 25, 2022
* fix(lexical-list): remove list breaks if selection in empty

* chore: add a comment

* chore: add test
thegreatercurve added a commit that referenced this pull request Nov 25, 2022
* Fixed getStyleObjectFromRawCSS function to work for unformatted css strings

* Testing that  handles unformatted css text

* Testing that $getStyleObjectFromRawCss handles unformatted css

* Added TableOfContents

* Renamed TableOfContetnsPlugin file name and added flow file

* Added TableOfContentsPlugin to config files and added styling

* Fixed types

* Added TableOfContentsList as a seperate module

* Fixed type of tag from string to HeadingTagType

* Table of contents updates as user scrolls

* Wrapped plugin in a feature

* Deleted package-lock.json

* Fixed conditioanl rendering syntax

* Removed extra parameter

* package-lock

* fix imports

* Update packages/lexical-playground/src/plugins/TableOfContentsPlugin.tsx

Co-authored-by: Gerard Rovira <zurfyx@users.noreply.github.com>

* Added sticky styling and handled text overflow

* Table of contents updates automtaically on scroll without observing all heading nodes

* Update table correctly  when headings are not visible but exist either up or down

* Fix failing E2E

* Changed isTableOfContentes to showTableOfContents in settings

* Added useEffect to fix memory leak

* Hoisted functions that don't use props

* Renamed isTableOfContets to showTableOfContents

* Changing selectedHeading by observing page top

* resolved lint error

* Refactored scroll up logic

* Added comments

* Added better css

* Changed place of toc div to fix failing test

* Fixed adjacent headings scrolling

* Fixed adjacent headings bug

* Renamed helper methods

* Fixed test

* Added dependency array to useEffect

* Added TableOfContents to dependency array

* Updated dependeny array in useEffect

* Created e2e test file for table of contents plugin

* Added scroll test

* E2E test: Adding heading to editor adds them to table-of-contents

* clean up

* Refactored getEditorElement

* Scrolling callback has better conditions

* Table of contents is now covering all edge cases and doesn't freeze webpage

* Solved page freezing

* Added one more assert statment to second test

* chore(lexical-playground): make directory clear (#2674)

* Conditionally utilize `startTransition` if it's present (#2676)

* Only utilize startTransition if it's available

* Add type annotation

* Run prettier

* fix(lexical-list): remove list breaks if selection in empty (#2672)

* fix(lexical-list): remove list breaks if selection in empty

* chore: add a comment

* chore: add test

* Separate `@lexical/code` into more atomic modules (#2673)

* separate code package into more atomic modules

* remove utils

* named exports

* Fixed typo (#2678)

* fix: path to icons (#2683)

* Fix VALID_TWITTER_URL to allow underscores. (#2690)

* fix(lexical-playground): LexicalTypeaheadMenuPlugin import (#2689)

Use the correct import path that available in NPM package

* Collapse and Expand DevTools Tree Nodes (#2679)

* fix(playground): fix rendering Exclidraw (#2694)

* Make includeHeaders a boolean (#2697)

Changed type for includeHeaders parameter from string to boolean to match the type of the parameter from the $createTableNodeWithDimensions function.

* Remove coverage reports (#2699)

* fix: check if options are empty (#2701)

* feat: Link node with target and rel (#2687)

* OnChangePlugin ignoreInitialChange -> ignoreHistoryMergeTagChange (#2706)

* OnChangePlugin ignoreInitialChange -> ignoreHistoryMergeTag

* .

* default to false because 0.4

Co-authored-by: Karam Qaoud <kqaoud@fb.com>
Co-authored-by: Gerard Rovira <zurfyx@users.noreply.github.com>
Co-authored-by: 子瞻 Luci <haru.lucinyan@gmail.com>
Co-authored-by: Jack Hanford <jackhanford@gmail.com>
Co-authored-by: John Flockton <thegreatercurve@users.noreply.github.com>
Co-authored-by: SalvadorLekan <66782276+SalvadorLekan@users.noreply.github.com>
Co-authored-by: Adithya Vardhan <imadithyavardhan@gmail.com>
Co-authored-by: hiraoka <62982380+y-hiraoka@users.noreply.github.com>
Co-authored-by: Elvin Dzhavadov <elvin.d@outlook.com>
Co-authored-by: Will <will.gutierrez@gmail.com>
Co-authored-by: Bryan <ImSingee@users.noreply.github.com>
Co-authored-by: alinamusuroi <44519061+alinamusuroi@users.noreply.github.com>
Co-authored-by: Andriy Chemerynskiy <andrzej.chem@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Bug: playground remove list breaks if selection in empty nested list item
3 participants