diff --git a/.eslintrc.js b/.eslintrc.js index 5fc78e6ff..db555cff9 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -93,6 +93,7 @@ module.exports = { 'jodit/types', 'jodit/.*\\u0000$', 'jodit/core', + 'jodit/config', 'jodit/modules' ], diff --git a/.gitignore b/.gitignore index b2f80d871..ddc9653d1 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ examples/build/ /playwright-report/ /blob-report/ /playwright/.cache/ +stack.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 819ff16b8..3c67326ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,60 @@ > - :house: [Internal] > - :nail_care: [Polish] +## 4.2.14 + +#### :house: Internal + +- Removed conversion of list arrays into objects when creating a button in the toolbar. Previously the code looked like: + + ```js + Jodit.make('#editor', { + constrols: { + lineHeight: { + list: [1, 1.1, 1.2, 1.3, 1.4, 1.5, 2] + } + } + }); + ``` + + was implicitly transformed into an object of the form: + + ```js + Jodit.make('#editor', { + constrols: { + lineHeight: { + list: { + 1: '1', + 2: '2', + 1.1: '1.1', + 1.2: '1.2', + 1.3: '1.3', + 1.4: '1.4', + 1.5: '1.5' + } + } + } + }); + ``` + + Thus, due to the nature of integer keys, the order of the elements was lost. Now such a transformation does not occur. + In your code you clearly need to check what came into `list` and if it is an array, then use it as is. + + ```js + Jodit.make('#editor', { + constrols: { + lineHeight: { + list: [1, 1.1, 1.2, 1.3, 1.4, 1.5, 2], + update(editor: IJodit, button): boolean { + if (Array.isArray(button.control)) { + // Work with array + } + } + } + } + }); + ``` + ## 4.2.13 ### :bug: Bug Fix @@ -2620,11 +2674,11 @@ Related with https://github.com/xdan/jodit/issues/574. In some cases need to lim - @property {IUIOption[]} link.selectOptionsClassName=[] The list of the option for the select (to use with modeClassName="select") - ex: [ -- { value: "", text: "" }, -- { value: "val1", text: "text1" }, -- { value: "val2", text: "text2" }, -- { value: "val3", text: "text3" } -- ] +- { value: "", text: "" }, +- { value: "val1", text: "text1" }, +- { value: "val2", text: "text2" }, +- { value: "val3", text: "text3" } +- ] PR: https://github.com/xdan/jodit/pull/577 Thanks @s-renier-taonix-fr ##### New option `statusbar: boolean = true` diff --git a/src/core/helpers/string/i18n.ts b/src/core/helpers/string/i18n.ts index 635a3a313..dd0b4c933 100644 --- a/src/core/helpers/string/i18n.ts +++ b/src/core/helpers/string/i18n.ts @@ -16,7 +16,6 @@ import { defaultLanguage as defineLanguage, error } from 'jodit/core/helpers/utils'; - import { Config } from 'jodit/config'; /** diff --git a/src/core/helpers/utils/config-proto.ts b/src/core/helpers/utils/config-proto.ts index 042da6ff8..5e1759f3d 100644 --- a/src/core/helpers/utils/config-proto.ts +++ b/src/core/helpers/utils/config-proto.ts @@ -13,12 +13,11 @@ import { isArray } from 'jodit/core/helpers/checker/is-array'; import { isPlainObject } from 'jodit/core/helpers/checker/is-plain-object'; import { isString } from 'jodit/core/helpers/checker/is-string'; import { isVoid } from 'jodit/core/helpers/checker/is-void'; +import { Config } from 'jodit/config'; import { isAtom } from './extend'; import { keys } from './utils'; -import { Config } from 'jodit/config'; - /** * @example * ```js diff --git a/src/core/request/ajax.ts b/src/core/request/ajax.ts index f531ccace..d4e085cab 100644 --- a/src/core/request/ajax.ts +++ b/src/core/request/ajax.ts @@ -30,13 +30,12 @@ import { parseQuery } from 'jodit/core/helpers'; import * as error from 'jodit/core/helpers/utils/error'; +import { Config } from 'jodit/config'; import './config'; import { Response } from './response'; -import { Config } from 'jodit/config'; - export class Ajax implements IAjax { className(): string { return 'Ajax'; diff --git a/src/core/request/config.ts b/src/core/request/config.ts index c647a2367..8bb594ad6 100644 --- a/src/core/request/config.ts +++ b/src/core/request/config.ts @@ -9,7 +9,6 @@ */ import type { AjaxOptions } from 'jodit/types'; - import { Config } from 'jodit/config'; declare module 'jodit/config' { diff --git a/src/core/ui/helpers/get-control-type.ts b/src/core/ui/helpers/get-control-type.ts index dec287076..2908646ba 100644 --- a/src/core/ui/helpers/get-control-type.ts +++ b/src/core/ui/helpers/get-control-type.ts @@ -15,8 +15,7 @@ import type { IControlTypeStrong, IDictionary } from 'jodit/types'; -import { ConfigFlatten, isArray, isString } from 'jodit/core/helpers'; - +import { ConfigFlatten, /*isArray,*/ isString } from 'jodit/core/helpers'; import { Config } from 'jodit/config'; /** @@ -73,24 +72,24 @@ export function findControlType( key = namespaceOrKey; } - const list = store[key]?.list; + // const list = store[key]?.list; return store[key] ? { name: key, - ...ConfigFlatten(store[key]), - list: isArray(list) - ? (>list).reduce( - ( - acc: IDictionary, - k: string | number - ) => { - acc[k] = k; - return acc; - }, - {} - ) - : list + ...ConfigFlatten(store[key]) + // list: isArray(list) + // ? (>list).reduce( + // ( + // acc: IDictionary, + // k: string | number + // ) => { + // acc[String(k)] = k; + // return acc; + // }, + // {} + // ) + // : list } : undefined; } diff --git a/src/core/ui/helpers/get-strong-control-types.ts b/src/core/ui/helpers/get-strong-control-types.ts index feb6d7271..f68a17151 100644 --- a/src/core/ui/helpers/get-strong-control-types.ts +++ b/src/core/ui/helpers/get-strong-control-types.ts @@ -16,11 +16,10 @@ import type { } from 'jodit/types'; import { isArray } from 'jodit/core/helpers/checker/is-array'; import { ConfigProto, keys } from 'jodit/core/helpers/utils'; +import { Config } from 'jodit/config'; import { getControlType } from './get-control-type'; -import { Config } from 'jodit/config'; - /** * @private */ diff --git a/src/jodit.ts b/src/jodit.ts index a632fcb5b..b7c7a56c5 100644 --- a/src/jodit.ts +++ b/src/jodit.ts @@ -69,6 +69,7 @@ import { } from 'jodit/core/helpers'; import { Ajax } from 'jodit/core/request'; import { Dlgs } from 'jodit/core/traits/dlgs'; +import { Config } from 'jodit/config'; import { Create, Dom, @@ -80,8 +81,6 @@ import { ViewWithToolbar } from 'jodit/modules'; -import { Config } from 'jodit/config'; - const __defaultStyleDisplayKey = 'data-jodit-default-style-display'; const __defaultClassesKey = 'data-jodit-default-classes'; diff --git a/src/modules/dialog/dialog.ts b/src/modules/dialog/dialog.ts index eef5cd1e3..44e1fe53b 100644 --- a/src/modules/dialog/dialog.ts +++ b/src/modules/dialog/dialog.ts @@ -37,11 +37,10 @@ import { assert } from 'jodit/core/helpers/utils/assert'; import { Icon } from 'jodit/core/ui'; import { View } from 'jodit/core/view/view'; import { ViewWithToolbar } from 'jodit/core/view/view-with-toolbar'; +import { Config } from 'jodit/config'; import './dialog.less'; -import { Config } from 'jodit/config'; - declare module 'jodit/config' { interface Config { dialog: IDialogOptions; diff --git a/src/modules/file-browser/config.ts b/src/modules/file-browser/config.ts index dc73da88e..43989620b 100644 --- a/src/modules/file-browser/config.ts +++ b/src/modules/file-browser/config.ts @@ -24,7 +24,6 @@ import 'jodit/core/request/config'; import { isArray, isString } from 'jodit/core/helpers/checker'; import { humanSizeToBytes } from 'jodit/core/helpers/utils/human-size-to-bytes'; import { UIFileInput } from 'jodit/core/ui/form/inputs/file/file'; - import { Config } from 'jodit/config'; declare module 'jodit/config' { diff --git a/src/modules/file-browser/file-browser.ts b/src/modules/file-browser/file-browser.ts index b086bfa37..a38eef081 100644 --- a/src/modules/file-browser/file-browser.ts +++ b/src/modules/file-browser/file-browser.ts @@ -43,6 +43,7 @@ import { import { Storage } from 'jodit/core/storage'; import { Dlgs } from 'jodit/core/traits/dlgs'; import { ViewWithToolbar } from 'jodit/core/view/view-with-toolbar'; +import { Config } from 'jodit/config'; import './config'; @@ -57,8 +58,6 @@ import { FileBrowserFiles, FileBrowserTree } from './ui'; import './styles/index.less'; -import { Config } from 'jodit/config'; - export interface FileBrowser extends Dlgs {} @derive(Dlgs) diff --git a/src/modules/history/history.ts b/src/modules/history/history.ts index 5d00c8290..597d0b5bf 100644 --- a/src/modules/history/history.ts +++ b/src/modules/history/history.ts @@ -20,13 +20,12 @@ import type { } from 'jodit/types'; import { ViewComponent } from 'jodit/core/component'; import { debounce } from 'jodit/core/decorators'; +import { Config } from 'jodit/config'; import { Command } from './command'; import { Snapshot } from './snapshot'; import { Stack } from './stack'; -import { Config } from 'jodit/config'; - declare module 'jodit/config' { interface Config { history: { diff --git a/src/modules/image-editor/config.ts b/src/modules/image-editor/config.ts index 06dd4a521..f88d73a46 100644 --- a/src/modules/image-editor/config.ts +++ b/src/modules/image-editor/config.ts @@ -10,12 +10,11 @@ import type { ImageEditorOptions } from 'jodit/types'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import cropIcon from './icons/crop.svg'; import resizeIcon from './icons/resize.svg'; -import { Config } from 'jodit/config'; - declare module 'jodit/config' { interface Config { imageeditor: ImageEditorOptions; diff --git a/src/modules/image-editor/image-editor.ts b/src/modules/image-editor/image-editor.ts index cc0cfed98..3469cfad2 100644 --- a/src/modules/image-editor/image-editor.ts +++ b/src/modules/image-editor/image-editor.ts @@ -27,6 +27,7 @@ import { autobind, component, debounce, throttle } from 'jodit/core/decorators'; import { Dom } from 'jodit/core/dom'; import { $$, attr, call, css, refs, toArray, trim } from 'jodit/core/helpers'; import { Button } from 'jodit/core/ui/button'; +import { Config } from 'jodit/config'; import './config'; @@ -34,8 +35,6 @@ import { form } from './templates/form'; import './image-editor.less'; -import { Config } from 'jodit/config'; - interface onSave { ( /** diff --git a/src/modules/toolbar/button/button.ts b/src/modules/toolbar/button/button.ts index 73dd18d0b..7ad52eb79 100644 --- a/src/modules/toolbar/button/button.ts +++ b/src/modules/toolbar/button/button.ts @@ -160,8 +160,8 @@ export class ToolbarButton @cacheHTML protected override createContainer(): HTMLElement { const cn = this.componentName; - const container = this.j.c.span(cn), - button = super.createContainer(); + const container = this.j.c.span(cn); + const button = super.createContainer(); attr(container, 'role', 'listitem'); diff --git a/src/modules/toolbar/button/select/select.ts b/src/modules/toolbar/button/select/select.ts index fc4fdbf1d..4d45f0452 100644 --- a/src/modules/toolbar/button/select/select.ts +++ b/src/modules/toolbar/button/select/select.ts @@ -10,6 +10,7 @@ import type { IViewBased } from 'jodit/types'; import { component } from 'jodit/core/decorators'; +import { isPlainObject } from 'jodit/core/helpers/checker/is-plain-object'; import { isString } from 'jodit/core/helpers/checker/is-string'; import { ToolbarButton } from '../button'; @@ -43,7 +44,9 @@ export class ToolbarSelect< key = keys[0]; } - const text = (list[key.toString()] || key).toString(); + const text = ( + isPlainObject(list) ? list[key.toString()] || key : key + ).toString(); this.state.text = this.control.textTemplate?.(this.jodit, text) ?? text; diff --git a/src/modules/uploader/config.ts b/src/modules/uploader/config.ts index a5c032703..12e482979 100644 --- a/src/modules/uploader/config.ts +++ b/src/modules/uploader/config.ts @@ -16,7 +16,6 @@ import type { } from 'jodit/types'; import { isArray } from 'jodit/core/helpers/checker/is-array'; import { isJoditObject } from 'jodit/core/helpers/checker/is-jodit-object'; - import { Config } from 'jodit/config'; declare module 'jodit/config' { diff --git a/src/modules/uploader/uploader.ts b/src/modules/uploader/uploader.ts index a6c84121c..a0df50650 100644 --- a/src/modules/uploader/uploader.ts +++ b/src/modules/uploader/uploader.ts @@ -26,6 +26,7 @@ import { isFunction, isJoditObject } from 'jodit/core/helpers'; +import { Config } from 'jodit/config'; import { ajaxInstances, hasFiles, @@ -39,8 +40,6 @@ import './config'; import './uploader.less'; -import { Config } from 'jodit/config'; - export class Uploader extends ViewComponent implements IUploader { declare readonly jodit: IViewBased; diff --git a/src/plugins/about/about.ts b/src/plugins/about/about.ts index eb189148a..a1aaab1d6 100644 --- a/src/plugins/about/about.ts +++ b/src/plugins/about/about.ts @@ -16,13 +16,12 @@ import { HOMEPAGE } from 'jodit/core/constants'; import { pluginSystem } from 'jodit/core/global'; import { css, isLicense, normalizeLicense } from 'jodit/core/helpers/'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import aboutIcon from './about.svg'; import './about.less'; -import { Config } from 'jodit/config'; - Config.prototype.controls.about = { exec: (editor: IJodit) => { const dialog = editor.dlg({ closeOnClickOverlay: true }), diff --git a/src/plugins/add-new-line/config.ts b/src/plugins/add-new-line/config.ts index 606b614ce..3d33f98f8 100644 --- a/src/plugins/add-new-line/config.ts +++ b/src/plugins/add-new-line/config.ts @@ -10,11 +10,10 @@ import type { HTMLTagNames } from 'jodit/types'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import enterIcon from './enter.svg'; -import { Config } from 'jodit/config'; - declare module 'jodit/config' { interface Config { /** diff --git a/src/plugins/ai-assistant/config.ts b/src/plugins/ai-assistant/config.ts index 9053aec8a..28d146136 100644 --- a/src/plugins/ai-assistant/config.ts +++ b/src/plugins/ai-assistant/config.ts @@ -10,12 +10,11 @@ import type { IControlType, IJodit } from 'jodit/types'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import magicWandIcon from './ai-assistant.svg'; import chatBotIcon from './chat-bot.svg'; -import { Config } from 'jodit/config'; - export interface AiAssistantSettings { /** Callback function for AI assistant to process and return the result */ aiAssistantCallback?: ( diff --git a/src/plugins/bold/bold.ts b/src/plugins/bold/bold.ts index 5e1eb0045..2412f1653 100644 --- a/src/plugins/bold/bold.ts +++ b/src/plugins/bold/bold.ts @@ -20,6 +20,7 @@ import type { import { pluginSystem } from 'jodit/core/global'; import { isArray } from 'jodit/core/helpers'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import './interface'; import './config'; @@ -31,8 +32,6 @@ import subscriptIcon from './icons/subscript.svg'; import superscriptIcon from './icons/superscript.svg'; import underlineIcon from './icons/underline.svg'; -import { Config } from 'jodit/config'; - /** * Adds `bold`,` strikethrough`, `underline` and` italic` buttons to Jodit */ diff --git a/src/plugins/bold/config.ts b/src/plugins/bold/config.ts index b50614f0f..006a19113 100644 --- a/src/plugins/bold/config.ts +++ b/src/plugins/bold/config.ts @@ -9,7 +9,6 @@ */ import type { IControlType } from 'jodit/types'; - import { Config } from 'jodit/config'; Config.prototype.controls.subscript = { diff --git a/src/plugins/class-span/class-span.ts b/src/plugins/class-span/class-span.ts index 297b6371f..08ae4593b 100644 --- a/src/plugins/class-span/class-span.ts +++ b/src/plugins/class-span/class-span.ts @@ -16,11 +16,10 @@ import { pluginSystem } from 'jodit/core/global'; import { memorizeExec } from 'jodit/core/helpers/utils/utils'; import { Plugin } from 'jodit/core/plugin'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import classSpanIcon from './class-span.svg'; -import { Config } from 'jodit/config'; - Config.prototype.controls.classSpan = { command: 'applyClassName', diff --git a/src/plugins/clean-html/config.ts b/src/plugins/clean-html/config.ts index 0a75e58a2..4576d79ac 100644 --- a/src/plugins/clean-html/config.ts +++ b/src/plugins/clean-html/config.ts @@ -10,11 +10,10 @@ import type { HTMLTagNames, IDictionary, Nullable } from 'jodit/types'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import eraserIcon from './eraser.svg'; -import { Config } from 'jodit/config'; - declare module 'jodit/config' { interface Config { cleanHTML: { diff --git a/src/plugins/clipboard/config.ts b/src/plugins/clipboard/config.ts index 768971049..c175189d0 100644 --- a/src/plugins/clipboard/config.ts +++ b/src/plugins/clipboard/config.ts @@ -10,14 +10,13 @@ import type { IControlType, IJodit } from 'jodit/types'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import copyIcon from './icons/copy.svg'; import cutIcon from './icons/cut.svg'; import pasteIcon from './icons/paste.svg'; import selectAllIcon from './icons/select-all.svg'; -import { Config } from 'jodit/config'; - Config.prototype.controls.cut = { command: 'cut', isDisabled: (editor: IJodit) => editor.s.isCollapsed(), diff --git a/src/plugins/color/config.ts b/src/plugins/color/config.ts index 570836d63..049c5954e 100644 --- a/src/plugins/color/config.ts +++ b/src/plugins/color/config.ts @@ -13,6 +13,7 @@ import type { Table } from 'jodit/modules'; import { Dom } from 'jodit/core/dom/dom'; import { css, dataBind, isJoditObject } from 'jodit/core/helpers/'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import { ColorPickerWidget, type TabOption, @@ -21,8 +22,6 @@ import { import brushIcon from './brush.svg'; -import { Config } from 'jodit/config'; - Icon.set('brush', brushIcon); Config.prototype.controls.brushCell = { diff --git a/src/plugins/copy-format/copy-format.ts b/src/plugins/copy-format/copy-format.ts index a04d9d653..224e81660 100644 --- a/src/plugins/copy-format/copy-format.ts +++ b/src/plugins/copy-format/copy-format.ts @@ -15,12 +15,11 @@ import { Dom } from 'jodit/core/dom/dom'; import { extendLang, pluginSystem } from 'jodit/core/global'; import { css } from 'jodit/core/helpers/utils/css'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import copyFormatIcon from './copy-format.svg'; import * as langs from './langs'; -import { Config } from 'jodit/config'; - const pluginKey = 'copy-format'; /** diff --git a/src/plugins/dtd/config.ts b/src/plugins/dtd/config.ts index 50699b53e..515601b16 100644 --- a/src/plugins/dtd/config.ts +++ b/src/plugins/dtd/config.ts @@ -9,7 +9,6 @@ */ import type { IDictionary } from 'jodit/types'; - import { Config } from 'jodit/config'; declare module 'jodit/config' { diff --git a/src/plugins/file/file.ts b/src/plugins/file/file.ts index 82652155e..188b912fd 100644 --- a/src/plugins/file/file.ts +++ b/src/plugins/file/file.ts @@ -17,9 +17,8 @@ import type { } from 'jodit/types'; import { Dom } from 'jodit/core/dom/dom'; import { pluginSystem } from 'jodit/core/global'; -import { FileSelectorWidget } from 'jodit/modules/widget'; - import { Config } from 'jodit/config'; +import { FileSelectorWidget } from 'jodit/modules/widget'; Config.prototype.controls.file = { popup: (editor: IJodit, current: Node | false, close) => { diff --git a/src/plugins/focus/focus.ts b/src/plugins/focus/focus.ts index b281a1d63..24a70bef7 100644 --- a/src/plugins/focus/focus.ts +++ b/src/plugins/focus/focus.ts @@ -13,7 +13,6 @@ import type { IJodit } from 'jodit/types'; import { Dom } from 'jodit/core/dom'; import { pluginSystem } from 'jodit/core/global'; - import { Config } from 'jodit/config'; declare module 'jodit/config' { diff --git a/src/plugins/font/config.ts b/src/plugins/font/config.ts index 3f64c498f..2f814c6b8 100644 --- a/src/plugins/font/config.ts +++ b/src/plugins/font/config.ts @@ -13,12 +13,11 @@ import { Dom } from 'jodit/core/dom'; import { trimChars } from 'jodit/core/helpers/string/trim'; import { css } from 'jodit/core/helpers/utils/css'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import fontIcon from './icons/font.svg'; import fontsizeIcon from './icons/fontsize.svg'; -import { Config } from 'jodit/config'; - declare module 'jodit/config' { interface Config { defaultFontSizePoints: 'px' | 'pt'; diff --git a/src/plugins/format-block/config.ts b/src/plugins/format-block/config.ts index 9fa7912e9..4fe70c4d9 100644 --- a/src/plugins/format-block/config.ts +++ b/src/plugins/format-block/config.ts @@ -9,13 +9,13 @@ */ import type { IControlType, IJodit } from 'jodit/types'; -import { Dom } from 'jodit/core/dom'; +import { Dom } from 'jodit/core/dom/dom'; +import { isPlainObject } from 'jodit/core/helpers/checker/is-plain-object'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import paragraphIcon from './paragraph.svg'; -import { Config } from 'jodit/config'; - Icon.set('paragraph', paragraphIcon); Config.prototype.controls.paragraph = { @@ -41,7 +41,7 @@ Config.prototype.controls.paragraph = { const currentValue = button.state.value, list = control.list; - if (list && list[currentValue.toString()]) { + if (isPlainObject(list) && list[currentValue.toString()]) { if (editor.o.textIcons) { button.state.text = list[currentValue.toString()].toString(); } @@ -71,7 +71,8 @@ Config.prototype.controls.paragraph = { isActive: (editor: IJodit, button): boolean => { return ( button.state.value !== editor.o.enter && - Boolean(button.control.list?.[button.state.value as string]) + isPlainObject(button.control.list) && + Boolean(button.control.list[button.state.value as string]) ); }, diff --git a/src/plugins/fullsize/config.ts b/src/plugins/fullsize/config.ts index 8a3fcdd83..564e3aaeb 100644 --- a/src/plugins/fullsize/config.ts +++ b/src/plugins/fullsize/config.ts @@ -11,14 +11,13 @@ import type { IControlType, IViewBased } from 'jodit/types'; import * as consts from 'jodit/core/constants'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import fullsizeIcon from './icons/fullsize.svg'; import shrinkIcon from './icons/shrink.svg'; import './fullsize.less'; -import { Config } from 'jodit/config'; - declare module 'jodit/config' { interface Config { /** diff --git a/src/plugins/hotkeys/config.ts b/src/plugins/hotkeys/config.ts index b49de893f..99879731c 100644 --- a/src/plugins/hotkeys/config.ts +++ b/src/plugins/hotkeys/config.ts @@ -9,7 +9,6 @@ */ import type { IDictionary } from 'jodit/types'; - import { Config } from 'jodit/config'; declare module 'jodit/config' { diff --git a/src/plugins/hr/hr.ts b/src/plugins/hr/hr.ts index f20112f28..e92395649 100644 --- a/src/plugins/hr/hr.ts +++ b/src/plugins/hr/hr.ts @@ -14,11 +14,10 @@ import type { IControlType, IJodit } from 'jodit/types'; import { Dom } from 'jodit/core/dom'; import { pluginSystem } from 'jodit/core/global'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import hrIcon from './hr.svg'; -import { Config } from 'jodit/config'; - Icon.set('hr', hrIcon); Config.prototype.controls.hr = { diff --git a/src/plugins/image-properties/config.ts b/src/plugins/image-properties/config.ts index cd81c4162..af54df9e5 100644 --- a/src/plugins/image-properties/config.ts +++ b/src/plugins/image-properties/config.ts @@ -8,10 +8,10 @@ * @module plugins/image-properties */ -import type { ImagePropertiesOptions } from './interface'; - import { Config } from 'jodit/config'; +import type { ImagePropertiesOptions } from './interface'; + declare module 'jodit/config' { interface Config { image: ImagePropertiesOptions; diff --git a/src/plugins/image/image.ts b/src/plugins/image/image.ts index f6867b516..5bbad1ac2 100644 --- a/src/plugins/image/image.ts +++ b/src/plugins/image/image.ts @@ -19,12 +19,11 @@ import { Dom } from 'jodit/core/dom'; import { pluginSystem } from 'jodit/core/global'; import { $$ } from 'jodit/core/helpers'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import { FileSelectorWidget } from 'jodit/modules/widget'; import imageIcon from './image.svg'; -import { Config } from 'jodit/config'; - Icon.set('image', imageIcon); Config.prototype.controls.image = { diff --git a/src/plugins/indent/config.ts b/src/plugins/indent/config.ts index 42e990650..1a1335dd9 100644 --- a/src/plugins/indent/config.ts +++ b/src/plugins/indent/config.ts @@ -11,13 +11,12 @@ import type { IControlType, IJodit } from 'jodit/types'; import { Dom } from 'jodit/core/dom'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import indentIcon from './icons/indent.svg'; import outdentIcon from './icons/outdent.svg'; import { getKey } from './helpers'; -import { Config } from 'jodit/config'; - Icon.set('indent', indentIcon).set('outdent', outdentIcon); Config.prototype.controls.indent = { diff --git a/src/plugins/inline-popup/config/config.ts b/src/plugins/inline-popup/config/config.ts index 197cfbc17..233a23612 100644 --- a/src/plugins/inline-popup/config/config.ts +++ b/src/plugins/inline-popup/config/config.ts @@ -10,6 +10,7 @@ import type { IControlType, IDictionary, IJodit } from 'jodit/types'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import a from './items/a'; import cells from './items/cells'; @@ -17,7 +18,6 @@ import jodit from './items/iframe'; import img from './items/img'; import toolbar from './items/toolbar'; -import { Config } from 'jodit/config'; import * as addcolumn from 'jodit/plugins/inline-popup/icons/addcolumn.svg'; import * as addrow from 'jodit/plugins/inline-popup/icons/addrow.svg'; import * as merge from 'jodit/plugins/inline-popup/icons/merge.svg'; diff --git a/src/plugins/justify/justify.ts b/src/plugins/justify/justify.ts index 464aedde3..63f6fcaa2 100644 --- a/src/plugins/justify/justify.ts +++ b/src/plugins/justify/justify.ts @@ -13,14 +13,14 @@ import type { IControlType, IJodit } from 'jodit/types'; import { Dom } from 'jodit/core/dom/dom'; import { pluginSystem } from 'jodit/core/global'; +import { isPlainObject } from 'jodit/core/helpers'; import { alignElement } from 'jodit/core/helpers/utils/align'; import { css } from 'jodit/core/helpers/utils/css'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import justifyIcon from './justify.svg'; -import { Config } from 'jodit/config'; - Icon.set('justify', justifyIcon); Config.prototype.controls.align = { @@ -45,11 +45,15 @@ Config.prototype.controls.align = { currentValue = 'left'; } + const { list, data } = control; + if ( - control.data && - control.data.currentValue !== currentValue && - control.list && - control.list[currentValue] + data && + data.currentValue !== currentValue && + list && + (isPlainObject(list) + ? list[currentValue] + : (list as string[]).includes(currentValue)) ) { if (editor.o.textIcons || control.component === 'select') { button.state.text = currentValue; @@ -57,7 +61,7 @@ Config.prototype.controls.align = { button.state.icon.name = currentValue; } - control.data.currentValue = currentValue; + data.currentValue = currentValue; } } }, diff --git a/src/plugins/line-height/config.ts b/src/plugins/line-height/config.ts index 83d7966bf..583121617 100644 --- a/src/plugins/line-height/config.ts +++ b/src/plugins/line-height/config.ts @@ -11,11 +11,10 @@ import type { IControlType, IJodit } from 'jodit/types'; import { memorizeExec } from 'jodit/core/helpers'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import lineHeightIcon from './line-height.svg'; -import { Config } from 'jodit/config'; - declare module 'jodit/config' { interface Config { /** diff --git a/src/plugins/line-height/line-height.test.js b/src/plugins/line-height/line-height.test.js index dd242a190..521dd16e5 100644 --- a/src/plugins/line-height/line-height.test.js +++ b/src/plugins/line-height/line-height.test.js @@ -50,9 +50,15 @@ describe('LineHeight plugin test', () => { } } }); + jodit.value = '

test|

'; + setCursorToChar(jodit); clickTrigger('lineHeight', jodit); const list = getOpenedPopup(jodit); expect(list.innerText).eq('1\n2\n3\n3.5'); + clickButton('3', list); + expect(sortAttributes(jodit.value)).eq( + '

test

' + ); }); }); }); diff --git a/src/plugins/link/config.ts b/src/plugins/link/config.ts index 5f6e0421a..7e0555dd9 100644 --- a/src/plugins/link/config.ts +++ b/src/plugins/link/config.ts @@ -11,13 +11,12 @@ import type { IControlType, IJodit, IUIForm, IUIOption } from 'jodit/types'; import { Dom } from 'jodit/core/dom/dom'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import linkIcon from './icons/link.svg'; import unlinkIcon from './icons/unlink.svg'; import { formTemplate } from './template'; -import { Config } from 'jodit/config'; - declare module 'jodit/config' { interface Config { link: { diff --git a/src/plugins/mobile/config.ts b/src/plugins/mobile/config.ts index 1ad7278df..6cf6eea4a 100644 --- a/src/plugins/mobile/config.ts +++ b/src/plugins/mobile/config.ts @@ -17,11 +17,10 @@ import type { } from 'jodit/types'; import * as consts from 'jodit/core/constants'; import { splitArray } from 'jodit/core/helpers'; +import { Config } from 'jodit/config'; import { ToolbarCollection } from 'jodit/modules/toolbar/collection/collection'; import { makeCollection } from 'jodit/modules/toolbar/factory'; -import { Config } from 'jodit/config'; - declare module 'jodit/config' { interface Config { /** diff --git a/src/plugins/ordered-list/config.ts b/src/plugins/ordered-list/config.ts index 18572a637..5b4963f3c 100644 --- a/src/plugins/ordered-list/config.ts +++ b/src/plugins/ordered-list/config.ts @@ -11,12 +11,11 @@ import type { IControlType, IJodit } from 'jodit/types'; import { dataBind } from 'jodit/core/helpers/utils/data-bind'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import olIcon from './icons/ol.svg'; import ulIcon from './icons/ul.svg'; -import { Config } from 'jodit/config'; - const memoExec: IControlType['exec'] = ( jodit, _, diff --git a/src/plugins/paste-from-word/config.ts b/src/plugins/paste-from-word/config.ts index 996a14862..15419c930 100644 --- a/src/plugins/paste-from-word/config.ts +++ b/src/plugins/paste-from-word/config.ts @@ -14,7 +14,6 @@ import { INSERT_AS_TEXT, INSERT_ONLY_TEXT } from 'jodit/core/constants'; - import { Config } from 'jodit/config'; declare module 'jodit/config' { diff --git a/src/plugins/paste/config.ts b/src/plugins/paste/config.ts index c9baf5fd7..7104a9fd7 100644 --- a/src/plugins/paste/config.ts +++ b/src/plugins/paste/config.ts @@ -22,11 +22,10 @@ import { IS_PROD, TEXT_PLAIN } from 'jodit/core/constants'; +import { Config } from 'jodit/config'; import { pasteInsertHtml } from './helpers'; -import { Config } from 'jodit/config'; - declare module 'jodit/config' { interface Config { /** diff --git a/src/plugins/preview/preview.ts b/src/plugins/preview/preview.ts index 456865ffe..3a05d5721 100644 --- a/src/plugins/preview/preview.ts +++ b/src/plugins/preview/preview.ts @@ -14,11 +14,10 @@ import type { IControlType, IJodit } from 'jodit/types'; import { MODE_SOURCE, MODE_WYSIWYG } from 'jodit/core/constants'; import { pluginSystem } from 'jodit/core/global'; import { previewBox } from 'jodit/core/helpers/utils/print'; +import { Config } from 'jodit/config'; import './preview.less'; -import { Config } from 'jodit/config'; - Config.prototype.controls.preview = { icon: 'eye', command: 'preview', diff --git a/src/plugins/print/print.ts b/src/plugins/print/print.ts index 078299fe7..fd236e63b 100644 --- a/src/plugins/print/print.ts +++ b/src/plugins/print/print.ts @@ -17,12 +17,11 @@ import { getContainer, pluginSystem } from 'jodit/core/global'; import { defaultLanguage } from 'jodit/core/helpers/utils/default-language'; import { previewBox } from 'jodit/core/helpers/utils/print'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import { generateCriticalCSS } from './lib/generate-critical-css'; import printIcon from './print.svg'; -import { Config } from 'jodit/config'; - Icon.set('print', printIcon); Config.prototype.controls.print = { diff --git a/src/plugins/redo-undo/redo-undo.ts b/src/plugins/redo-undo/redo-undo.ts index 3ef3a1150..8965099ad 100644 --- a/src/plugins/redo-undo/redo-undo.ts +++ b/src/plugins/redo-undo/redo-undo.ts @@ -15,12 +15,11 @@ import * as consts from 'jodit/core/constants'; import { pluginSystem } from 'jodit/core/global'; import { Plugin } from 'jodit/core/plugin/plugin'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import redoIcon from './icons/redo.svg'; import undoIcon from './icons/undo.svg'; -import { Config } from 'jodit/config'; - Icon.set('redo', redoIcon).set('undo', undoIcon); Config.prototype.controls.redo = { diff --git a/src/plugins/resizer/config.ts b/src/plugins/resizer/config.ts index d16da474a..ef90d26f9 100644 --- a/src/plugins/resizer/config.ts +++ b/src/plugins/resizer/config.ts @@ -9,7 +9,6 @@ */ import type { HTMLTagNames } from 'jodit/types'; - import { Config } from 'jodit/config'; declare module 'jodit/config' { diff --git a/src/plugins/search/config.ts b/src/plugins/search/config.ts index 8f9a85abd..69160a95d 100644 --- a/src/plugins/search/config.ts +++ b/src/plugins/search/config.ts @@ -10,13 +10,12 @@ import type { FuzzySearch, IControlType, IJodit } from 'jodit/types'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import './interface'; import searchIcon from './search.svg'; -import { Config } from 'jodit/config'; - declare module 'jodit/config' { interface Config { /** diff --git a/src/plugins/source/config.ts b/src/plugins/source/config.ts index 8d51d3387..10c57de3d 100644 --- a/src/plugins/source/config.ts +++ b/src/plugins/source/config.ts @@ -11,11 +11,10 @@ import type { IControlType, IJodit, ISourceEditor } from 'jodit/types'; import { IS_IE, MODE_SOURCE, MODE_SPLIT } from 'jodit/core/constants'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import sourceIcon from './source.svg'; -import { Config } from 'jodit/config'; - declare module 'jodit/config' { interface Config { sourceEditor: 'area' | 'ace' | ((jodit: IJodit) => ISourceEditor); diff --git a/src/plugins/speech-recognize/config.ts b/src/plugins/speech-recognize/config.ts index 63b20e19b..ac0179426 100644 --- a/src/plugins/speech-recognize/config.ts +++ b/src/plugins/speech-recognize/config.ts @@ -12,14 +12,13 @@ import type { IControlType, IDictionary, IJodit } from 'jodit/types'; import { isBoolean } from 'jodit/core/helpers/checker/is-boolean'; import { dataBind } from 'jodit/core/helpers/utils/data-bind'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import type { ISpeechRecognizeConstructor } from './interface'; import { SpeechRecognition } from './helpers/api'; import { RecognizeManager } from './helpers/recognize-manager'; import speechRecognizeIcon from './speech-recognize.svg'; -import { Config } from 'jodit/config'; - declare module 'jodit/config' { interface Config { speechRecognize: { diff --git a/src/plugins/spellcheck/config.ts b/src/plugins/spellcheck/config.ts index 0add03f61..e9f38e858 100644 --- a/src/plugins/spellcheck/config.ts +++ b/src/plugins/spellcheck/config.ts @@ -10,11 +10,10 @@ import type { IControlType, IJodit } from 'jodit/types'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import spellcheckIcon from './spellcheck.svg'; -import { Config } from 'jodit/config'; - declare module 'jodit/config' { interface Config { /** diff --git a/src/plugins/symbols/config.ts b/src/plugins/symbols/config.ts index f86c14f58..8c6ac589f 100644 --- a/src/plugins/symbols/config.ts +++ b/src/plugins/symbols/config.ts @@ -10,11 +10,10 @@ import type { IControlType, IJodit } from 'jodit/types'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import symbolsIcon from './symbols.svg'; -import { Config } from 'jodit/config'; - declare module 'jodit/config' { interface Config { specialCharacters: string[]; diff --git a/src/plugins/table/config.ts b/src/plugins/table/config.ts index 1b269c4af..a2ce50c09 100644 --- a/src/plugins/table/config.ts +++ b/src/plugins/table/config.ts @@ -13,11 +13,10 @@ import { Dom } from 'jodit/core/dom'; import { $$, css, scrollIntoViewIfNeeded } from 'jodit/core/helpers'; import { attr } from 'jodit/core/helpers/utils'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import tableIcon from './table.svg'; -import { Config } from 'jodit/config'; - declare module 'jodit/config' { interface Config { table: { diff --git a/src/plugins/video/config.ts b/src/plugins/video/config.ts index c6dd4ca8d..02f5b28f2 100644 --- a/src/plugins/video/config.ts +++ b/src/plugins/video/config.ts @@ -13,12 +13,11 @@ import { convertMediaUrlToVideoEmbed } from 'jodit/core/helpers'; import { Button } from 'jodit/core/ui/button'; import { UIBlock, UIForm, UIInput, UITextArea } from 'jodit/core/ui/form'; import { Icon } from 'jodit/core/ui/icon'; +import { Config } from 'jodit/config'; import { type TabOption, TabsWidget } from 'jodit/modules/widget'; import videoIcon from './video.svg'; -import { Config } from 'jodit/config'; - Icon.set('video', videoIcon); Config.prototype.controls.video = { diff --git a/src/plugins/wrap-nodes/config.ts b/src/plugins/wrap-nodes/config.ts index 770786631..4c3764f75 100644 --- a/src/plugins/wrap-nodes/config.ts +++ b/src/plugins/wrap-nodes/config.ts @@ -9,7 +9,6 @@ */ import type { HTMLTagNames } from 'jodit/types'; - import { Config } from 'jodit/config'; declare module 'jodit/config' { diff --git a/src/types/toolbar.d.ts b/src/types/toolbar.d.ts index 5480ec1b7..659e42900 100644 --- a/src/types/toolbar.d.ts +++ b/src/types/toolbar.d.ts @@ -26,7 +26,7 @@ import type { IMods } from './traits'; interface IControlType< T extends IViewBased = IJodit | IViewBased | IFileBrowser, - B = IToolbarButton + B extends IToolbarButton = IToolbarButton > { name?: string; text?: string; @@ -290,7 +290,7 @@ interface IControlListItem { interface IControlTypeStrong extends IControlType { name: NonNullable; - list?: IDictionary; + // list?: IDictionary; } interface IControlTypeContent extends IControlTypeStrong {