diff --git a/addons/mass_mailing/static/src/scss/mass_mailing.ui.scss b/addons/mass_mailing/static/src/scss/mass_mailing.ui.scss index f91189c74f9..b4800f478a4 100644 --- a/addons/mass_mailing/static/src/scss/mass_mailing.ui.scss +++ b/addons/mass_mailing/static/src/scss/mass_mailing.ui.scss @@ -361,6 +361,19 @@ body.editor_enable.o_basic_theme.o_in_iframe { top: unset !important; } } + + #font-size > button { + &:focus-within input { + padding: 0 !important; + width: calc(2ch + #{$o-we-sidebar-content-field-clickable-spacing * 2} - #{$o-we-sidebar-content-field-border-width * 2}); + } + + input { + padding: 0; + text-align: center; + width: calc(2ch + #{$o-we-sidebar-content-field-clickable-spacing * 2}); + } + } } } } diff --git a/addons/web_editor/static/src/js/editor/odoo-editor/src/OdooEditor.js b/addons/web_editor/static/src/js/editor/odoo-editor/src/OdooEditor.js index 5e90c08f1f8..6d3c94f7a04 100644 --- a/addons/web_editor/static/src/js/editor/odoo-editor/src/OdooEditor.js +++ b/addons/web_editor/static/src/js/editor/odoo-editor/src/OdooEditor.js @@ -702,6 +702,59 @@ export class OdooEditor extends EventTarget { this.updateColorpickerLabels(); }); } + const fontSizeInput = this.toolbar.querySelector('input#fontSizeCurrentValue'); + this.addDomListener(this.toolbar, 'click', ev => { + if (fontSizeInput && ev.target.closest('#font-size .dropdown-toggle')) { + // If the click opened the font size dropdown, select the input content. + fontSizeInput.select(); + } else if (!this.isSelectionInEditable()) { + // Otherwise, if we lost the selection in the editable, restore it. + this.historyResetLatestComputedSelection(true); + } + }) + // Handle the font size input. + if (fontSizeInput) { + const debouncedOnInputChange = (() => { + let handle; + return () => new Promise(resolve => { + clearTimeout(handle); + handle = setTimeout(() => { + handle = null; + setFontSize(fontSizeInput.value); + resolve(); + }, 50); + }); + })(); + const setFontSize = fontSize => { + if (fontSize === 'default' || parseInt(fontSize) > 0) { + if (!this.isSelectionInEditable()) { + this.historyResetLatestComputedSelection(true); + } + this.execCommand('setFontSize', fontSize === 'default' ? undefined : parseInt(fontSize) + 'px'); + fontSizeInput.closest('#font-size').querySelectorAll('.show').forEach(el => { + el.classList.remove('show'); // Close the dropdown. + // Remove Popper's styles to ensure proper positioning + // of the dropdown next time it opens. + el.style.removeProperty('inset'); + el.style.removeProperty('transform'); + }); + fontSizeInput.blur(); + } + } + this.addDomListener(fontSizeInput, 'change', debouncedOnInputChange); + // Handle the font size dropdown. + const fontSizeDropdown = this.toolbar.querySelector('#font-size'); + if (fontSizeDropdown) { + fontSizeDropdown.querySelectorAll('.dropdown-item').forEach(item => { + this.addDomListener(item, 'mousedown', ev => setFontSize(ev.target.textContent)); + this.addDomListener(item, 'keydown', ev => { + if (ev.key === 'Enter') { + setFontSize(ev.target.textContent); + } + }); + }); + } + } } resetContent(value) { @@ -2901,7 +2954,7 @@ export class OdooEditor extends EventTarget { const fontSizeValue = this.toolbar.querySelector('#fontSizeCurrentValue'); if (fontSizeValue) { - fontSizeValue.textContent = /\d+/.exec(selectionStartStyle.fontSize).pop(); + fontSizeValue.value = /\d+/.exec(selectionStartStyle.fontSize).pop(); } const table = getInSelection(this.document, 'table'); const toolbarButton = this.toolbar.querySelector('.toolbar-edit-table'); diff --git a/addons/web_editor/static/src/scss/wysiwyg.scss b/addons/web_editor/static/src/scss/wysiwyg.scss index aea78a301b1..6d25f43359a 100644 --- a/addons/web_editor/static/src/scss/wysiwyg.scss +++ b/addons/web_editor/static/src/scss/wysiwyg.scss @@ -384,6 +384,11 @@ $o-we-zindex: $o-we-overlay-zindex + 1 !default; @include o-text-overflow(); max-width: 150px; } + + input#fontSizeCurrentValue { + width: 20px; + border: none; + } } // Toolbar in Sidebar (website editor, mass mailing) diff --git a/addons/web_editor/static/src/scss/wysiwyg_snippets.scss b/addons/web_editor/static/src/scss/wysiwyg_snippets.scss index d4a4b6c061f..881ce099b7d 100644 --- a/addons/web_editor/static/src/scss/wysiwyg_snippets.scss +++ b/addons/web_editor/static/src/scss/wysiwyg_snippets.scss @@ -516,6 +516,32 @@ padding: ($o-we-sidebar-content-field-height * .12) ($o-we-sidebar-content-field-button-group-button-spacing - 2); } + #font-size > button { + &:focus-within { + @extend %we-generic-text-input; + // Cancel the height of the border: + margin-top: -1px; + margin-bottom: -1px; + + input { + padding: 0 !important; + width: calc(2ch + #{$o-we-sidebar-content-field-clickable-spacing * 2} - #{$o-we-sidebar-content-field-border-width * 2}); + } + } + &.dropdown-toggle::after { + display: none; + } + + input { + background-color: unset; + border: none; + color: unset; + padding: 0; + text-align: center; + width: calc(2ch + #{$o-we-sidebar-content-field-clickable-spacing * 2}); + } + } + we-customizeblock-option { grid-area: options; padding-left: 0; diff --git a/addons/web_editor/static/src/xml/editor.xml b/addons/web_editor/static/src/xml/editor.xml index 351528e9df0..005acde9287 100644 --- a/addons/web_editor/static/src/xml/editor.xml +++ b/addons/web_editor/static/src/xml/editor.xml @@ -74,30 +74,32 @@ - + - +