ckeditor5 icon indicating copy to clipboard operation
ckeditor5 copied to clipboard

Todolist lost checked property when reload or set to Source Editing

Open woaiiimipi opened this issue 2 years ago • 2 comments

📝 Provide detailed reproduction steps (if any)

When I add todolist to a table cell, I checked the checkbox, and saved the data to server, when I reload the data, the checkbox's checked status is lost.

Before: image Reload: image Below is my source code, you can copy the code to source editing, the checked="checked" status will be lost

<html><head></head><body>
<figure class="table">
    <table>
        <tbody>
            <tr>
                <td style="background-color:hsl(60, 75%, 60%);text-align:center;">
                    <p style="color:#7F6000;font-family:Calibri;font-size:12.0pt;margin:0in;">
                        <span style="color:hsl(0,0%,0%);"><strong>FOUNDATION</strong></span>
                    </p>
                </td>
            </tr>
            <tr>
                <td style="vertical-align:top;">
                    <ul class="todo-list">
                        <li>
                            <label class="todo-list__label todo-list__label_without-description"><input type="checkbox" checked="checked" disabled="disabled"></label>
                            <p style="font-family:Calibri;font-size:12.0pt;margin:0in;">
                                <strong>Net Worth:&nbsp;</strong>
                            </p>
                        </li>
                    </ul>
                </td>
            </tr>
        </tbody>
    </table>
</figure>
</body></html>

✔️ Expected result

Checked status can reload correctly

❌ Actual result

Checked status is lost.

❓ Possible solution

📃 Other details

  • Browser: Latest Chrome
  • OS: MacOS / Windows
  • First affected CKEditor version: Latest ckeditor version
  • Installed CKEditor plugins: "@ckeditor/ckeditor5-alignment": "^40.0.0", "@ckeditor/ckeditor5-autoformat": "^40.0.0", "@ckeditor/ckeditor5-basic-styles": "^40.0.0", "@ckeditor/ckeditor5-block-quote": "^40.0.0", "@ckeditor/ckeditor5-cloud-services": "^40.0.0", "@ckeditor/ckeditor5-dev-translations": "^32.1.2", "@ckeditor/ckeditor5-dev-utils": "^32.1.2", "@ckeditor/ckeditor5-editor-classic": "^40.0.0", "@ckeditor/ckeditor5-editor-inline": "^40.0.0", "@ckeditor/ckeditor5-essentials": "^40.0.0", "@ckeditor/ckeditor5-font": "^40.0.0", "@ckeditor/ckeditor5-heading": "^40.0.0", "@ckeditor/ckeditor5-horizontal-line": "^40.0.0", "@ckeditor/ckeditor5-html-support": "^40.0.0", "@ckeditor/ckeditor5-image": "^40.0.0", "@ckeditor/ckeditor5-indent": "^40.0.0", "@ckeditor/ckeditor5-link": "^40.0.0", "@ckeditor/ckeditor5-list": "^40.0.0", "@ckeditor/ckeditor5-media-embed": "^40.0.0", "@ckeditor/ckeditor5-mention": "^40.0.0", "@ckeditor/ckeditor5-page-break": "^40.0.0", "@ckeditor/ckeditor5-paragraph": "^40.0.0", "@ckeditor/ckeditor5-paste-from-office": "^40.0.0", "@ckeditor/ckeditor5-source-editing": "^40.0.0", "@ckeditor/ckeditor5-special-characters": "^40.0.0", "@ckeditor/ckeditor5-table": "^40.0.0", "@ckeditor/ckeditor5-theme-lark": "^40.0.0", "@ckeditor/ckeditor5-typing": "^40.0.0", "@ckeditor/ckeditor5-word-count": "^40.0.0", "@ckeditor/ckeditor5-ui": "^40.0.0", "@ckeditor/ckeditor5-undo": "^40.0.0",

If you'd like to see this fixed sooner, add a 👍 reaction to this post.

woaiiimipi avatar Dec 28 '23 04:12 woaiiimipi

Simplest reproduction (with GHS enabled):

<ul class="todo-list">
    <li>
        <label class="todo-list__label todo-list__label_without-description"><input type="checkbox" checked="checked" disabled="disabled"></label>
        <p class="foo">
            foobar
        </p>
    </li>
</ul>

niegowski avatar Jan 09 '24 17:01 niegowski

Also reproducible when changing the alignment on an item in a todo list. Steps to repro:

  1. Create an item in a todo list
  2. Change its alignment, e.g. by centering the text
  3. Check the item on the todo list
  4. Execute editor.setData(editor.getData())

It seems that the checked="checked" attribute goes missing when the text inside the <li> gets wrapped in an additional element, e.g. <p>.

mabryl avatar Feb 19 '24 09:02 mabryl

Any update? Our clients report this issue again, I think it's an very important function.

woaiiimipi avatar Jun 12 '24 01:06 woaiiimipi

@niegowski @Witoso @mabryl Is there any way to avoid it? Too many of our users have encountered this problem.

woaiiimipi avatar Jul 22 '24 08:07 woaiiimipi

As I see it doesn't work with p element, while with span everything works fine (GHS is not required to check it):

<ul class="todo-list">
    <li>
        <label class="todo-list__label todo-list__label_without-description"><input type="checkbox" checked="checked" disabled="disabled"></label>
        <span class="foo">
            foobar
        </span>
    </li>
</ul>

So conversion treats todo list with p element a little bit differently.

This method override data.modelCursor: https://github.com/ckeditor/ckeditor5/blob/28d0389424dcb74d1163741d33a379e26816fc4c/packages/ckeditor5-engine/src/conversion/upcastdispatcher.ts#L351-L379

Inside modelCursor we could find an array with 3 elements (first and third elements are empty so they will be removed but they have actual attribute which is responsible for checked property while second doesn't have that attribute but have the text node)

image

First element:

image

Second element:

image

Third element:

image

Meanwhile todo list item with span element have only 1 (with text and attributes), not 3:

image image

Here is a method which remove empty elements (so only second element with text data from the array is left but it doesn't have todo-list-checked attribute) so that the reason of data lost: https://github.com/ckeditor/ckeditor5/blob/28d0389424dcb74d1163741d33a379e26816fc4c/packages/ckeditor5-engine/src/conversion/upcastdispatcher.ts#L500-L516

illia-stv avatar Jul 23 '24 15:07 illia-stv

Here is example solution: https://github.com/ckeditor/ckeditor5/pull/16785

illia-stv avatar Jul 23 '24 16:07 illia-stv