github xdan/jodit 4.12.23

3 hours ago

🐛 Bug Fix

  • Search (Ctrl+F): pressing Enter in the search input submitted the parent <form> instead of jumping to the next match — the preventDefault() for Enter lived inside a debounced handler, so it ran only after the browser had already dispatched the form submission. Enter is now canceled synchronously, while the search logic itself stays debounced. Fixes #918.
  • i18n / language bundles: translations for keys that were missing from ar.js never reached the build — the master i18n key list was generated only from ar.js, and every other language is serialized as an array indexed by that list, so existing translations for the ordered-list menu items (Lower Alpha, Lower Greek, Lower Roman, Upper Alpha, Upper Roman — translated in de/es/fi/it/ja/pt_br) and a dozen other keys were silently dropped from every bundle. The key list is now built as the union of all language files. Fixes #997.
  • Custom ownerWindow (editor created inside an iframe): UI components (toolbar collection, popups, dialogs) always kept the global window as their owner window instead of the configured one. Popup/dropdown outside-click close handlers were therefore bound to the wrong window — clicks inside the iframe never reached them, so toolbar dropdowns did not close on an outside click. ViewComponent now inherits the owner window from its parent view. Fixes #965.
  • Toolbar content controls (getContent): controls rendered through getContent (e.g. the FileBrowser Upload button) never ran the status calculation, so their isDisabled/isActive/update callbacks were silently ignored — the Upload button stayed enabled even when the backend permissions (canI('FileUpload')) said otherwise. ToolbarContent.update() now evaluates the control's status like regular toolbar buttons and also propagates the disabled state to nested form controls (the file <input> of the Upload button). Thanks @WatchfulEyeOfZod for the diagnosis and the patch draft. Fixes #1094.
  • Inline toolbar / Iframe mode: with iframe: true the selection toolbar (toolbarInlineForSelection) opened far away from the selected text — the popup was positioned by range.getBoundingClientRect(), whose coordinates are iframe-local, while the popup itself lives in the host document. The iframe offset is now added to the selection bound. Fixes #1058.
  • Paste toolbar button: the Paste from clipboard toolbar button inserted only the plain text flavor of the clipboard, while Ctrl+V pasted the full HTML — the button explicitly requested text/plain from navigator.clipboard.read() even when text/html was available. The button now prefers the HTML flavor (falling back to plain text), so both paste paths behave the same. Fixes #1061.
  • Format block (H1–H6 / paragraph): applying a heading to a block pasted from an external source seemed to do nothing — the tag actually changed, but leftover inline styles like font-weight: normal; font-size: 24px visually overrode the new format, so an <h2> looked exactly like the old text. When a block format is applied, the conflicting font-size/font-weight inline styles are now removed from the block (other styles like color stay). Fixes #1063.
  • Backspace/Delete next to a table: pressing Backspace at the start of a paragraph that follows a table (or Delete at the end of a paragraph before one) merged the paragraph's text into the <table> element itself — it landed after </tbody>, which is invalid HTML; on the next parse the browser foster-parents such content out of the table, corrupting the document and causing follow-up DOM errors (the Failed to execute 'appendChild' console spam from the report). The join logic now merges the text into the edge table cell (last cell for Backspace, first for Delete). Covers #1064.
  • Paste from Word (askBeforePasteFromWord): office content was frequently mis-detected as plain HTML, so the generic Paste as HTML dialog appeared instead of the Word one. The detector only matched a Microsoft Word N meta generator or mso- styles in double quotes combined with <font> tags — while the raw Word clipboard fragment uses single-quoted style='mso-…', unquoted class=MsoNormal, an unquoted ProgId meta and office XML namespaces (and modern Word emits no <font> at all); LibreOffice/OpenOffice content was never detected. The detector now also recognizes all of these markers. Fixes #1078.
  • Drag and drop (enableDragAndDropFileToEditor: false): dropping a file (e.g. a JPG from another window) into the editor still embedded it — with the option off no handler was bound to the drop event, nothing called preventDefault, and Firefox inserted the dropped image natively. With the option disabled the editor now cancels file drops, so they do nothing — as the option promises. Fixes #1077.
  • AI Assistant: the Insert After button placed the generated text after the first node of the selection — with several selected paragraphs the result landed inside/after the first paragraph instead of after the whole selection. The insertion point is now the collapsed end of the selection, so the result follows everything that was selected; single-word/sentence behavior is unchanged. Fixes #1263.
  • Color / Select cells: applying a text or background color from the main toolbar to table cells selected with the select-cells plugin (click or drag-select a cell — typical for tables pasted from Word) silently did nothing: the cell selection drops or collapses the native range, so the color was committed as a pending caret format in an empty <span> outside the table. When cells are selected and the native selection is collapsed, the forecolor/background commands now recolor the content of every selected cell (including nested spans carrying their own Word colors). Fixes #1250.
  • Shadow DOM / Table: clicking a table cell inside a Shadow DOM editor (the shadowRoot option, e.g. a Stencil/web component integration) never opened the cell properties popup (background, vertical align, split/merge, add/remove row & column). document.elementFromPoint does not pierce shadow boundaries — it returns the shadow host — so the select-cells plugin could not find the clicked cell on mouseup. The hit-testing now starts from the configured shadow root in select-cells (cell selection on click and drag-select), add-new-line (the Break line over tables/images) and Popup.getKeepBound. Fixes #1312.

Don't miss a new jodit release

NewReleases is sending notifications on new releases.