@opentiny/fluent-editor 3.19.0 → 3.19.1-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +97 -96
- package/es/config/base64-image.es.js +9 -0
- package/es/config/base64-image.es.js.map +1 -0
- package/es/config/editor.config.es.js +86 -0
- package/es/config/editor.config.es.js.map +1 -0
- package/es/config/editor.utils.es.js +141 -0
- package/es/config/editor.utils.es.js.map +1 -0
- package/es/config/i18n/en-us.es.js +90 -0
- package/es/config/i18n/en-us.es.js.map +1 -0
- package/es/config/i18n/zh-cn.es.js +90 -0
- package/es/config/i18n/zh-cn.es.js.map +1 -0
- package/es/config/icons.config.es.js +301 -0
- package/es/config/icons.config.es.js.map +1 -0
- package/es/config/types/additional-toolbar-item.interface.es.js +2 -0
- package/es/config/types/additional-toolbar-item.interface.es.js.map +1 -0
- package/es/config/types/content-change.interface.es.js +2 -0
- package/es/config/types/content-change.interface.es.js.map +1 -0
- package/es/config/types/content-save.interface.es.js +2 -0
- package/es/config/types/content-save.interface.es.js.map +1 -0
- package/es/config/types/counter-option.interface.es.js +2 -0
- package/es/config/types/counter-option.interface.es.js.map +1 -0
- package/es/config/types/editor-config.interface.es.js +2 -0
- package/es/config/types/editor-config.interface.es.js.map +1 -0
- package/es/config/types/editor-modules.interface.es.js +2 -0
- package/es/config/types/editor-modules.interface.es.js.map +1 -0
- package/es/config/types/file-operation.interface.es.js +2 -0
- package/es/config/types/file-operation.interface.es.js.map +1 -0
- package/es/config/types/focus-change.interface.es.js +2 -0
- package/es/config/types/focus-change.interface.es.js.map +1 -0
- package/es/config/types/fullscreen-module.interface.es.js +2 -0
- package/es/config/types/fullscreen-module.interface.es.js.map +1 -0
- package/es/config/types/help-panel-item.interface.es.js +2 -0
- package/es/config/types/help-panel-item.interface.es.js.map +1 -0
- package/es/config/types/help-panel-option.interface.es.js +2 -0
- package/es/config/types/help-panel-option.interface.es.js.map +1 -0
- package/es/config/types/image-module.interface.es.js +2 -0
- package/es/config/types/image-module.interface.es.js.map +1 -0
- package/es/config/types/image-upload.interface.es.js +2 -0
- package/es/config/types/image-upload.interface.es.js.map +1 -0
- package/es/config/types/index.es.js +23 -0
- package/es/config/types/index.es.js.map +1 -0
- package/es/config/types/load-on-demand-module.interface.es.js +2 -0
- package/es/config/types/load-on-demand-module.interface.es.js.map +1 -0
- package/es/config/types/mention-module.interface.es.js +2 -0
- package/es/config/types/mention-module.interface.es.js.map +1 -0
- package/es/config/types/paste-change.interface.es.js +2 -0
- package/es/config/types/paste-change.interface.es.js.map +1 -0
- package/es/config/types/quick-menu-module.interface.es.js +2 -0
- package/es/config/types/quick-menu-module.interface.es.js.map +1 -0
- package/es/config/types/range.interface.es.js +2 -0
- package/es/config/types/range.interface.es.js.map +1 -0
- package/es/config/types/registry-options.interface.es.js +2 -0
- package/es/config/types/registry-options.interface.es.js.map +1 -0
- package/es/config/types/selection-change.interface.es.js +2 -0
- package/es/config/types/selection-change.interface.es.js.map +1 -0
- package/es/config/types/toolbar-item.interface.es.js +2 -0
- package/es/config/types/toolbar-item.interface.es.js.map +1 -0
- package/es/config/types/type.es.js +2 -0
- package/es/config/types/type.es.js.map +1 -0
- package/es/config/types/validate-error.interface.es.js +2 -0
- package/es/config/types/validate-error.interface.es.js.map +1 -0
- package/es/config.es.js +168 -0
- package/es/config.es.js.map +1 -0
- package/es/counter/index.es.js +60 -0
- package/es/counter/index.es.js.map +1 -0
- package/es/custom-clipboard.es.js +469 -0
- package/es/custom-clipboard.es.js.map +1 -0
- package/es/custom-image/BlotFormatter.es.js +136 -0
- package/es/custom-image/BlotFormatter.es.js.map +1 -0
- package/es/custom-image/Options.es.js +95 -0
- package/es/custom-image/Options.es.js.map +1 -0
- package/es/custom-image/actions/Action.es.js +15 -0
- package/es/custom-image/actions/Action.es.js.map +1 -0
- package/es/custom-image/actions/CustomResizeAction.es.js +158 -0
- package/es/custom-image/actions/CustomResizeAction.es.js.map +1 -0
- package/es/custom-image/actions/DeleteAction.es.js +31 -0
- package/es/custom-image/actions/DeleteAction.es.js.map +1 -0
- package/es/custom-image/image.es.js +95 -0
- package/es/custom-image/image.es.js.map +1 -0
- package/es/custom-image/specs/BlotSpec.es.js +27 -0
- package/es/custom-image/specs/BlotSpec.es.js.map +1 -0
- package/es/custom-image/specs/CustomImageSpec.es.js +117 -0
- package/es/custom-image/specs/CustomImageSpec.es.js.map +1 -0
- package/es/custom-image/specs/ImageSpec.es.js +29 -0
- package/es/custom-image/specs/ImageSpec.es.js.map +1 -0
- package/es/custom-uploader.es.js +161 -0
- package/es/custom-uploader.es.js.map +1 -0
- package/es/emoji/emoji-list/index.es.js +5 -0
- package/es/emoji/emoji-list/index.es.js.map +1 -0
- package/es/emoji/emoji-list/people.es.js +114 -0
- package/es/emoji/emoji-list/people.es.js.map +1 -0
- package/es/emoji/emoji-list.es.js +9 -0
- package/es/emoji/emoji-list.es.js.map +1 -0
- package/es/emoji/emoji-map.es.js +9 -0
- package/es/emoji/emoji-map.es.js.map +1 -0
- package/es/emoji/formats/emoji-blot.es.js +41 -0
- package/es/emoji/formats/emoji-blot.es.js.map +1 -0
- package/es/emoji/index.es.js +8 -0
- package/es/emoji/index.es.js.map +1 -0
- package/es/emoji/modules/emoji.es.js +248 -0
- package/es/emoji/modules/emoji.es.js.map +1 -0
- package/es/emoji/modules/toolbar-emoji.es.js +153 -0
- package/es/emoji/modules/toolbar-emoji.es.js.map +1 -0
- package/es/emoji/utils.es.js +19 -0
- package/es/emoji/utils.es.js.map +1 -0
- package/es/file/formats/file.es.js +56 -0
- package/es/file/formats/file.es.js.map +1 -0
- package/es/file/index.es.js +32 -0
- package/es/file/index.es.js.map +1 -0
- package/es/file/modules/file-bar.es.js +123 -0
- package/es/file/modules/file-bar.es.js.map +1 -0
- package/es/fluent-editor.es.js +163 -0
- package/es/fluent-editor.es.js.map +1 -0
- package/es/format-painter/index.es.js +66 -0
- package/es/format-painter/index.es.js.map +1 -0
- package/es/global-link/constants.es.js +9 -0
- package/es/global-link/constants.es.js.map +1 -0
- package/es/global-link/formats/customer-widget-link.es.js +28 -0
- package/es/global-link/formats/customer-widget-link.es.js.map +1 -0
- package/es/global-link/formats/doc-link.es.js +42 -0
- package/es/global-link/formats/doc-link.es.js.map +1 -0
- package/es/global-link/formats/wiki-link.es.js +34 -0
- package/es/global-link/formats/wiki-link.es.js.map +1 -0
- package/es/global-link/formats/work-item-link.es.js +36 -0
- package/es/global-link/formats/work-item-link.es.js.map +1 -0
- package/es/global-link/global-link-panel.es.js +2 -0
- package/es/global-link/global-link-panel.es.js.map +1 -0
- package/es/global-link/index.es.js +139 -0
- package/es/global-link/index.es.js.map +1 -0
- package/es/global-link/utils/createTable.es.js +50 -0
- package/es/global-link/utils/createTable.es.js.map +1 -0
- package/es/index.es.js +5 -0
- package/es/index.es.js.map +1 -0
- package/es/lineheight.es.js +11 -0
- package/es/lineheight.es.js.map +1 -0
- package/es/link/formats/link.es.js +34 -0
- package/es/link/formats/link.es.js.map +1 -0
- package/es/link/index.es.js +32 -0
- package/es/link/index.es.js.map +1 -0
- package/es/link/modules/tooltip.es.js +275 -0
- package/es/link/modules/tooltip.es.js.map +1 -0
- package/es/mention/Mention.es.js +329 -0
- package/es/mention/Mention.es.js.map +1 -0
- package/es/mention/MentionLink.es.js +37 -0
- package/es/mention/MentionLink.es.js.map +1 -0
- package/es/mention/constants.es.js +9 -0
- package/es/mention/constants.es.js.map +1 -0
- package/es/quick-menu/index.es.js +82 -0
- package/es/quick-menu/index.es.js.map +1 -0
- package/es/screenshot/index.es.js +147 -0
- package/es/screenshot/index.es.js.map +1 -0
- package/es/soft-break/index.es.js +23 -0
- package/es/soft-break/index.es.js.map +1 -0
- package/es/strike/index.es.js +12 -0
- package/es/strike/index.es.js.map +1 -0
- package/es/syntax/index.es.js +30 -0
- package/es/syntax/index.es.js.map +1 -0
- package/es/table/better-table.es.js +434 -0
- package/es/table/better-table.es.js.map +1 -0
- package/es/table/formats/header.es.js +94 -0
- package/es/table/formats/header.es.js.map +1 -0
- package/es/table/formats/list.es.js +163 -0
- package/es/table/formats/list.es.js.map +1 -0
- package/es/table/formats/table.es.js +970 -0
- package/es/table/formats/table.es.js.map +1 -0
- package/es/table/modules/table-column-tool.es.js +400 -0
- package/es/table/modules/table-column-tool.es.js.map +1 -0
- package/es/table/modules/table-operation-menu.es.js +457 -0
- package/es/table/modules/table-operation-menu.es.js.map +1 -0
- package/es/table/modules/table-scroll-bar.es.js +190 -0
- package/es/table/modules/table-scroll-bar.es.js.map +1 -0
- package/es/table/modules/table-selection.es.js +306 -0
- package/es/table/modules/table-selection.es.js.map +1 -0
- package/es/table/table-config.es.js +74 -0
- package/es/table/table-config.es.js.map +1 -0
- package/es/table/utils/index.es.js +54 -0
- package/es/table/utils/index.es.js.map +1 -0
- package/es/table/utils/node-matchers.es.js +292 -0
- package/es/table/utils/node-matchers.es.js.map +1 -0
- package/es/toolbar/better-picker.es.js +307 -0
- package/es/toolbar/better-picker.es.js.map +1 -0
- package/es/toolbar/index.es.js +139 -0
- package/es/toolbar/index.es.js.map +1 -0
- package/es/types/vue.d.es.js +2 -0
- package/es/types/vue.d.es.js.map +1 -0
- package/es/utils/debounce.es.js +112 -0
- package/es/utils/debounce.es.js.map +1 -0
- package/es/utils/method.es.js +68 -0
- package/es/utils/method.es.js.map +1 -0
- package/es/video/index.es.js +49 -0
- package/es/video/index.es.js.map +1 -0
- package/lib/config/base64-image.cjs.js +9 -0
- package/lib/config/base64-image.cjs.js.map +1 -0
- package/lib/config/editor.config.cjs.js +86 -0
- package/lib/config/editor.config.cjs.js.map +1 -0
- package/lib/config/editor.utils.cjs.js +141 -0
- package/lib/config/editor.utils.cjs.js.map +1 -0
- package/lib/config/i18n/en-us.cjs.js +90 -0
- package/lib/config/i18n/en-us.cjs.js.map +1 -0
- package/lib/config/i18n/zh-cn.cjs.js +90 -0
- package/lib/config/i18n/zh-cn.cjs.js.map +1 -0
- package/lib/config/icons.config.cjs.js +301 -0
- package/lib/config/icons.config.cjs.js.map +1 -0
- package/lib/config/types/additional-toolbar-item.interface.cjs.js +2 -0
- package/lib/config/types/additional-toolbar-item.interface.cjs.js.map +1 -0
- package/lib/config/types/content-change.interface.cjs.js +2 -0
- package/lib/config/types/content-change.interface.cjs.js.map +1 -0
- package/lib/config/types/content-save.interface.cjs.js +2 -0
- package/lib/config/types/content-save.interface.cjs.js.map +1 -0
- package/lib/config/types/counter-option.interface.cjs.js +2 -0
- package/lib/config/types/counter-option.interface.cjs.js.map +1 -0
- package/lib/config/types/editor-config.interface.cjs.js +2 -0
- package/lib/config/types/editor-config.interface.cjs.js.map +1 -0
- package/lib/config/types/editor-modules.interface.cjs.js +2 -0
- package/lib/config/types/editor-modules.interface.cjs.js.map +1 -0
- package/lib/config/types/file-operation.interface.cjs.js +2 -0
- package/lib/config/types/file-operation.interface.cjs.js.map +1 -0
- package/lib/config/types/focus-change.interface.cjs.js +2 -0
- package/lib/config/types/focus-change.interface.cjs.js.map +1 -0
- package/lib/config/types/fullscreen-module.interface.cjs.js +2 -0
- package/lib/config/types/fullscreen-module.interface.cjs.js.map +1 -0
- package/lib/config/types/help-panel-item.interface.cjs.js +2 -0
- package/lib/config/types/help-panel-item.interface.cjs.js.map +1 -0
- package/lib/config/types/help-panel-option.interface.cjs.js +2 -0
- package/lib/config/types/help-panel-option.interface.cjs.js.map +1 -0
- package/lib/config/types/image-module.interface.cjs.js +2 -0
- package/lib/config/types/image-module.interface.cjs.js.map +1 -0
- package/lib/config/types/image-upload.interface.cjs.js +2 -0
- package/lib/config/types/image-upload.interface.cjs.js.map +1 -0
- package/lib/config/types/index.cjs.js +24 -0
- package/lib/config/types/index.cjs.js.map +1 -0
- package/lib/config/types/load-on-demand-module.interface.cjs.js +2 -0
- package/lib/config/types/load-on-demand-module.interface.cjs.js.map +1 -0
- package/lib/config/types/mention-module.interface.cjs.js +2 -0
- package/lib/config/types/mention-module.interface.cjs.js.map +1 -0
- package/lib/config/types/paste-change.interface.cjs.js +2 -0
- package/lib/config/types/paste-change.interface.cjs.js.map +1 -0
- package/lib/config/types/quick-menu-module.interface.cjs.js +2 -0
- package/lib/config/types/quick-menu-module.interface.cjs.js.map +1 -0
- package/lib/config/types/range.interface.cjs.js +2 -0
- package/lib/config/types/range.interface.cjs.js.map +1 -0
- package/lib/config/types/registry-options.interface.cjs.js +2 -0
- package/lib/config/types/registry-options.interface.cjs.js.map +1 -0
- package/lib/config/types/selection-change.interface.cjs.js +2 -0
- package/lib/config/types/selection-change.interface.cjs.js.map +1 -0
- package/lib/config/types/toolbar-item.interface.cjs.js +2 -0
- package/lib/config/types/toolbar-item.interface.cjs.js.map +1 -0
- package/lib/config/types/type.cjs.js +2 -0
- package/lib/config/types/type.cjs.js.map +1 -0
- package/lib/config/types/validate-error.interface.cjs.js +2 -0
- package/lib/config/types/validate-error.interface.cjs.js.map +1 -0
- package/lib/config.cjs.js +168 -0
- package/lib/config.cjs.js.map +1 -0
- package/lib/counter/index.cjs.js +60 -0
- package/lib/counter/index.cjs.js.map +1 -0
- package/lib/custom-clipboard.cjs.js +469 -0
- package/lib/custom-clipboard.cjs.js.map +1 -0
- package/lib/custom-image/BlotFormatter.cjs.js +136 -0
- package/lib/custom-image/BlotFormatter.cjs.js.map +1 -0
- package/lib/custom-image/Options.cjs.js +95 -0
- package/lib/custom-image/Options.cjs.js.map +1 -0
- package/lib/custom-image/actions/Action.cjs.js +15 -0
- package/lib/custom-image/actions/Action.cjs.js.map +1 -0
- package/lib/custom-image/actions/CustomResizeAction.cjs.js +158 -0
- package/lib/custom-image/actions/CustomResizeAction.cjs.js.map +1 -0
- package/lib/custom-image/actions/DeleteAction.cjs.js +31 -0
- package/lib/custom-image/actions/DeleteAction.cjs.js.map +1 -0
- package/lib/custom-image/image.cjs.js +95 -0
- package/lib/custom-image/image.cjs.js.map +1 -0
- package/lib/custom-image/specs/BlotSpec.cjs.js +27 -0
- package/lib/custom-image/specs/BlotSpec.cjs.js.map +1 -0
- package/lib/custom-image/specs/CustomImageSpec.cjs.js +117 -0
- package/lib/custom-image/specs/CustomImageSpec.cjs.js.map +1 -0
- package/lib/custom-image/specs/ImageSpec.cjs.js +29 -0
- package/lib/custom-image/specs/ImageSpec.cjs.js.map +1 -0
- package/lib/custom-uploader.cjs.js +161 -0
- package/lib/custom-uploader.cjs.js.map +1 -0
- package/lib/emoji/emoji-list/index.cjs.js +5 -0
- package/lib/emoji/emoji-list/index.cjs.js.map +1 -0
- package/lib/emoji/emoji-list/people.cjs.js +114 -0
- package/lib/emoji/emoji-list/people.cjs.js.map +1 -0
- package/lib/emoji/emoji-list.cjs.js +9 -0
- package/lib/emoji/emoji-list.cjs.js.map +1 -0
- package/lib/emoji/emoji-map.cjs.js +9 -0
- package/lib/emoji/emoji-map.cjs.js.map +1 -0
- package/lib/emoji/formats/emoji-blot.cjs.js +41 -0
- package/lib/emoji/formats/emoji-blot.cjs.js.map +1 -0
- package/lib/emoji/index.cjs.js +8 -0
- package/lib/emoji/index.cjs.js.map +1 -0
- package/lib/emoji/modules/emoji.cjs.js +248 -0
- package/lib/emoji/modules/emoji.cjs.js.map +1 -0
- package/lib/emoji/modules/toolbar-emoji.cjs.js +153 -0
- package/lib/emoji/modules/toolbar-emoji.cjs.js.map +1 -0
- package/lib/emoji/utils.cjs.js +19 -0
- package/lib/emoji/utils.cjs.js.map +1 -0
- package/lib/file/formats/file.cjs.js +56 -0
- package/lib/file/formats/file.cjs.js.map +1 -0
- package/lib/file/index.cjs.js +32 -0
- package/lib/file/index.cjs.js.map +1 -0
- package/lib/file/modules/file-bar.cjs.js +123 -0
- package/lib/file/modules/file-bar.cjs.js.map +1 -0
- package/lib/fluent-editor.cjs.js +163 -0
- package/lib/fluent-editor.cjs.js.map +1 -0
- package/lib/format-painter/index.cjs.js +66 -0
- package/lib/format-painter/index.cjs.js.map +1 -0
- package/lib/global-link/constants.cjs.js +9 -0
- package/lib/global-link/constants.cjs.js.map +1 -0
- package/lib/global-link/formats/customer-widget-link.cjs.js +28 -0
- package/lib/global-link/formats/customer-widget-link.cjs.js.map +1 -0
- package/lib/global-link/formats/doc-link.cjs.js +42 -0
- package/lib/global-link/formats/doc-link.cjs.js.map +1 -0
- package/lib/global-link/formats/wiki-link.cjs.js +34 -0
- package/lib/global-link/formats/wiki-link.cjs.js.map +1 -0
- package/lib/global-link/formats/work-item-link.cjs.js +36 -0
- package/lib/global-link/formats/work-item-link.cjs.js.map +1 -0
- package/lib/global-link/global-link-panel.cjs.js +2 -0
- package/lib/global-link/global-link-panel.cjs.js.map +1 -0
- package/lib/global-link/index.cjs.js +139 -0
- package/lib/global-link/index.cjs.js.map +1 -0
- package/lib/global-link/utils/createTable.cjs.js +50 -0
- package/lib/global-link/utils/createTable.cjs.js.map +1 -0
- package/lib/index.cjs.js +5 -0
- package/lib/index.cjs.js.map +1 -0
- package/lib/lineheight.cjs.js +11 -0
- package/lib/lineheight.cjs.js.map +1 -0
- package/lib/link/formats/link.cjs.js +34 -0
- package/lib/link/formats/link.cjs.js.map +1 -0
- package/lib/link/index.cjs.js +32 -0
- package/lib/link/index.cjs.js.map +1 -0
- package/lib/link/modules/tooltip.cjs.js +275 -0
- package/lib/link/modules/tooltip.cjs.js.map +1 -0
- package/lib/mention/Mention.cjs.js +329 -0
- package/lib/mention/Mention.cjs.js.map +1 -0
- package/lib/mention/MentionLink.cjs.js +37 -0
- package/lib/mention/MentionLink.cjs.js.map +1 -0
- package/lib/mention/constants.cjs.js +9 -0
- package/lib/mention/constants.cjs.js.map +1 -0
- package/lib/quick-menu/index.cjs.js +82 -0
- package/lib/quick-menu/index.cjs.js.map +1 -0
- package/lib/screenshot/index.cjs.js +147 -0
- package/lib/screenshot/index.cjs.js.map +1 -0
- package/lib/soft-break/index.cjs.js +23 -0
- package/lib/soft-break/index.cjs.js.map +1 -0
- package/lib/strike/index.cjs.js +12 -0
- package/lib/strike/index.cjs.js.map +1 -0
- package/lib/syntax/index.cjs.js +30 -0
- package/lib/syntax/index.cjs.js.map +1 -0
- package/lib/table/better-table.cjs.js +434 -0
- package/lib/table/better-table.cjs.js.map +1 -0
- package/lib/table/formats/header.cjs.js +94 -0
- package/lib/table/formats/header.cjs.js.map +1 -0
- package/lib/table/formats/list.cjs.js +163 -0
- package/lib/table/formats/list.cjs.js.map +1 -0
- package/lib/table/formats/table.cjs.js +970 -0
- package/lib/table/formats/table.cjs.js.map +1 -0
- package/lib/table/modules/table-column-tool.cjs.js +400 -0
- package/lib/table/modules/table-column-tool.cjs.js.map +1 -0
- package/lib/table/modules/table-operation-menu.cjs.js +457 -0
- package/lib/table/modules/table-operation-menu.cjs.js.map +1 -0
- package/lib/table/modules/table-scroll-bar.cjs.js +190 -0
- package/lib/table/modules/table-scroll-bar.cjs.js.map +1 -0
- package/lib/table/modules/table-selection.cjs.js +306 -0
- package/lib/table/modules/table-selection.cjs.js.map +1 -0
- package/lib/table/table-config.cjs.js +74 -0
- package/lib/table/table-config.cjs.js.map +1 -0
- package/lib/table/utils/index.cjs.js +54 -0
- package/lib/table/utils/index.cjs.js.map +1 -0
- package/lib/table/utils/node-matchers.cjs.js +292 -0
- package/lib/table/utils/node-matchers.cjs.js.map +1 -0
- package/lib/toolbar/better-picker.cjs.js +308 -0
- package/lib/toolbar/better-picker.cjs.js.map +1 -0
- package/lib/toolbar/index.cjs.js +139 -0
- package/lib/toolbar/index.cjs.js.map +1 -0
- package/lib/types/vue.d.cjs.js +2 -0
- package/lib/types/vue.d.cjs.js.map +1 -0
- package/lib/utils/debounce.cjs.js +112 -0
- package/lib/utils/debounce.cjs.js.map +1 -0
- package/lib/utils/method.cjs.js +68 -0
- package/lib/utils/method.cjs.js.map +1 -0
- package/lib/video/index.cjs.js +49 -0
- package/lib/video/index.cjs.js.map +1 -0
- package/package.json +63 -65
- package/theme/index.css +4742 -0
- package/index.cjs.js +0 -374
- package/index.cjs.js.map +0 -1
- package/index.es.js +0 -51095
- package/index.es.js.map +0 -1
- package/style.css +0 -7
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
+
const Quill = require("quill");
|
|
4
|
+
const editor_utils = require("../config/editor.utils.cjs.js");
|
|
5
|
+
const constants = require("./constants.cjs.js");
|
|
6
|
+
const MentionLink = require("./MentionLink.cjs.js");
|
|
7
|
+
const { Scope } = Quill.imports["parchment"];
|
|
8
|
+
const Delta = Quill.imports["delta"];
|
|
9
|
+
class Mention {
|
|
10
|
+
// @ts-ignore
|
|
11
|
+
constructor(quill, options) {
|
|
12
|
+
this.quill = quill;
|
|
13
|
+
this.activeMentionIndex = 0;
|
|
14
|
+
this.searchTerm = "";
|
|
15
|
+
this.needInsertBr = true;
|
|
16
|
+
this.defaultOptions = {
|
|
17
|
+
defaultLink: "#",
|
|
18
|
+
target: "_blank",
|
|
19
|
+
mentionChar: constants.DEFAULT_MENTION_CHAR,
|
|
20
|
+
maxHeight: 200,
|
|
21
|
+
renderMentionItem(data) {
|
|
22
|
+
let mentionItem = data.name || data.id;
|
|
23
|
+
if (this.itemKey) {
|
|
24
|
+
mentionItem = data[this.itemKey];
|
|
25
|
+
}
|
|
26
|
+
const dom = document.createElement("SPAN");
|
|
27
|
+
dom.textContent = mentionItem;
|
|
28
|
+
return dom;
|
|
29
|
+
},
|
|
30
|
+
renderMentionText(data) {
|
|
31
|
+
let mentionText = data.name || data.id;
|
|
32
|
+
if (this.itemKey) {
|
|
33
|
+
mentionText = data[this.itemKey];
|
|
34
|
+
}
|
|
35
|
+
return `${mentionText}`;
|
|
36
|
+
},
|
|
37
|
+
containerClass: "ql-mention-list-container",
|
|
38
|
+
listClass: "ql-mention-list",
|
|
39
|
+
listHideClass: "ql-mention-list--hide",
|
|
40
|
+
itemClass: "ql-mention-item",
|
|
41
|
+
itemActiveClass: "ql-mention-item--active",
|
|
42
|
+
itemKey: "name",
|
|
43
|
+
searchKey: "name",
|
|
44
|
+
dataAttributes: ["id"],
|
|
45
|
+
select(_data) {
|
|
46
|
+
},
|
|
47
|
+
remove(_data) {
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
this.handleTextChange = (_delta, _oldDelta, source) => {
|
|
51
|
+
setTimeout(() => {
|
|
52
|
+
if (Quill.sources.USER === source) {
|
|
53
|
+
const range = this.quill.getSelection();
|
|
54
|
+
if (!range) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const caretPos = this.latestCaretPos = range.index;
|
|
58
|
+
const content = this.quill.getContents();
|
|
59
|
+
const beforeCaretText = content.reduce((newText, op) => {
|
|
60
|
+
if (typeof op.insert === "string") {
|
|
61
|
+
return newText += op.insert;
|
|
62
|
+
} else {
|
|
63
|
+
return newText += " ";
|
|
64
|
+
}
|
|
65
|
+
}, "");
|
|
66
|
+
const mentionCharPos = beforeCaretText.lastIndexOf(this.options.mentionChar);
|
|
67
|
+
if (mentionCharPos > -1) {
|
|
68
|
+
const searchTerm = beforeCaretText.substring(mentionCharPos + this.options.mentionChar.length, caretPos);
|
|
69
|
+
this.searchTerm = searchTerm;
|
|
70
|
+
if (!"".startsWith.call(searchTerm, " ")) {
|
|
71
|
+
this.latestMentionCharPos = mentionCharPos;
|
|
72
|
+
this.searchMentionListByTerm(searchTerm);
|
|
73
|
+
} else {
|
|
74
|
+
this.hideMentionList();
|
|
75
|
+
}
|
|
76
|
+
} else {
|
|
77
|
+
this.hideMentionList();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
this.handleArrowUpKey = () => {
|
|
83
|
+
if (this.isOpen()) {
|
|
84
|
+
this.activeMentionIndex = (this.activeMentionIndex + this.latestMentionList.length - 1) % this.latestMentionList.length;
|
|
85
|
+
this.highlightMentionItem(this.activeMentionIndex);
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
return true;
|
|
89
|
+
};
|
|
90
|
+
this.handleArrowDownKey = () => {
|
|
91
|
+
if (this.isOpen()) {
|
|
92
|
+
this.activeMentionIndex = (this.activeMentionIndex + 1) % this.latestMentionList.length;
|
|
93
|
+
this.highlightMentionItem(this.activeMentionIndex);
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
return true;
|
|
97
|
+
};
|
|
98
|
+
this.handleEnterKey = () => {
|
|
99
|
+
if (this.isOpen()) {
|
|
100
|
+
this.selectMentionItem();
|
|
101
|
+
this.needInsertBr = false;
|
|
102
|
+
}
|
|
103
|
+
return true;
|
|
104
|
+
};
|
|
105
|
+
this.handleEscapeKey = () => {
|
|
106
|
+
if (this.isOpen()) {
|
|
107
|
+
this.hideMentionList();
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
return true;
|
|
111
|
+
};
|
|
112
|
+
if (!options.search) {
|
|
113
|
+
console.warn("please provide a search function!");
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
this.options = Object.assign(this.defaultOptions, options);
|
|
117
|
+
const container = document.createElement("div");
|
|
118
|
+
container.classList.add("ql-mention-list-container");
|
|
119
|
+
if (this.options.containerClass !== "ql-mention-list-container") {
|
|
120
|
+
container.classList.add(this.options.containerClass);
|
|
121
|
+
}
|
|
122
|
+
this.mentionListEL = document.createElement("ul");
|
|
123
|
+
this.mentionListEL.classList.add(this.options.listClass, this.options.listHideClass);
|
|
124
|
+
this.mentionListEL.style.cssText += `
|
|
125
|
+
max-height: ${this.options.maxHeight}px;
|
|
126
|
+
`;
|
|
127
|
+
quill.on(Quill.events.TEXT_CHANGE, this.handleTextChange);
|
|
128
|
+
quill.keyboard.addBinding({ key: "ArrowUp" }, this.handleArrowUpKey);
|
|
129
|
+
quill.keyboard.addBinding({ key: "ArrowDown" }, this.handleArrowDownKey);
|
|
130
|
+
quill.keyboard.addBinding({ key: "Enter" }, this.handleEnterKey);
|
|
131
|
+
quill.keyboard.addBinding({ key: "Tab" }, this.handleEnterKey);
|
|
132
|
+
quill.keyboard.addBinding({ key: "Escape" }, this.handleEscapeKey);
|
|
133
|
+
quill.keyboard.bindings["Enter"].unshift(quill.keyboard.bindings["Enter"].pop());
|
|
134
|
+
quill.keyboard.bindings["Tab"].unshift(quill.keyboard.bindings["Tab"].pop());
|
|
135
|
+
quill.keyboard.bindings["Escape"].unshift(quill.keyboard.bindings["Escape"].pop());
|
|
136
|
+
const customKeyboardEnter = {
|
|
137
|
+
key: "Enter",
|
|
138
|
+
shiftKey: null,
|
|
139
|
+
handler: (range, context) => {
|
|
140
|
+
const lineFormats = Object.keys(context.format).reduce(
|
|
141
|
+
(formats, format) => {
|
|
142
|
+
if (this.quill.scroll.query(format, Scope.BLOCK) && !Array.isArray(context.format[format])) {
|
|
143
|
+
formats[format] = context.format[format];
|
|
144
|
+
}
|
|
145
|
+
return formats;
|
|
146
|
+
},
|
|
147
|
+
{}
|
|
148
|
+
);
|
|
149
|
+
let selectionIndex = range.index - this.searchTerm.length;
|
|
150
|
+
let delta = new Delta().retain(range.index).delete(range.length);
|
|
151
|
+
if (this.needInsertBr) {
|
|
152
|
+
delta = delta.insert("\n", lineFormats);
|
|
153
|
+
selectionIndex = range.index + 1;
|
|
154
|
+
}
|
|
155
|
+
this.quill.updateContents(delta, Quill.sources.USER);
|
|
156
|
+
this.quill.setSelection(selectionIndex, Quill.sources.SILENT);
|
|
157
|
+
this.quill.focus();
|
|
158
|
+
Object.keys(context.format).forEach((name) => {
|
|
159
|
+
if (!editor_utils.isNullOrUndefined(lineFormats[name])) return;
|
|
160
|
+
if (Array.isArray(context.format[name])) return;
|
|
161
|
+
if (name === "code" || name === "link") return;
|
|
162
|
+
this.quill.format(name, context.format[name], Quill.sources.USER);
|
|
163
|
+
});
|
|
164
|
+
this.needInsertBr = true;
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
quill.keyboard.bindings["Enter"] = quill.keyboard.bindings["Enter"].map((item) => {
|
|
168
|
+
const buildinKeyboardEnter = item.format === void 0 && item.shiftKey === null;
|
|
169
|
+
if (buildinKeyboardEnter) {
|
|
170
|
+
return customKeyboardEnter;
|
|
171
|
+
} else {
|
|
172
|
+
return item;
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
this.on("click", this.handleMouseClick);
|
|
176
|
+
this.on("mouseover", this.handleMouseEnter);
|
|
177
|
+
quill.emitter.on(constants.ON_MENTION_LINK_REMOVE, async ({ mention, name }) => {
|
|
178
|
+
const [result] = mention && [mention] || await this.options.search(name);
|
|
179
|
+
this.options.remove(result);
|
|
180
|
+
});
|
|
181
|
+
container.appendChild(this.mentionListEL);
|
|
182
|
+
quill.container.parentElement.insertBefore(container, quill.container);
|
|
183
|
+
}
|
|
184
|
+
static register() {
|
|
185
|
+
Quill.register(MentionLink.default);
|
|
186
|
+
}
|
|
187
|
+
on(eventName, callback) {
|
|
188
|
+
this.mentionListEL.addEventListener(eventName, (evt) => {
|
|
189
|
+
let target = evt.target;
|
|
190
|
+
let targetItemEL;
|
|
191
|
+
while (this.mentionListEL.contains(target) && target !== this.mentionListEL) {
|
|
192
|
+
if (target.classList.contains(this.options.itemClass)) {
|
|
193
|
+
targetItemEL = target;
|
|
194
|
+
}
|
|
195
|
+
target = target.parentElement;
|
|
196
|
+
}
|
|
197
|
+
if (targetItemEL) {
|
|
198
|
+
callback.call(this, targetItemEL, this.getMentionItemIndex(targetItemEL));
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
getMentionItemIndex(itemEl) {
|
|
203
|
+
return [].reduce.call(
|
|
204
|
+
this.mentionListEL.children,
|
|
205
|
+
(index, item, idx) => item === itemEl ? idx : index,
|
|
206
|
+
-1
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
handleMouseClick(_itemEl, index) {
|
|
210
|
+
this.selectMentionItem(index, true);
|
|
211
|
+
this.quill.focus();
|
|
212
|
+
}
|
|
213
|
+
handleMouseEnter(_itemEl, index) {
|
|
214
|
+
this.activeMentionIndex = index;
|
|
215
|
+
this.highlightMentionItem(index);
|
|
216
|
+
}
|
|
217
|
+
getActiveMentionItem() {
|
|
218
|
+
return this.mentionListEL.querySelector(`.${this.options.itemActiveClass}`);
|
|
219
|
+
}
|
|
220
|
+
isOpen() {
|
|
221
|
+
return !this.mentionListEL.classList.contains(this.options.listHideClass);
|
|
222
|
+
}
|
|
223
|
+
async searchMentionListByTerm(term) {
|
|
224
|
+
const mentionList = await this.options.search(term);
|
|
225
|
+
this.latestMentionList = mentionList;
|
|
226
|
+
if (!mentionList || mentionList.length === 0) {
|
|
227
|
+
return this.hideMentionList();
|
|
228
|
+
}
|
|
229
|
+
this.showMentionList(mentionList);
|
|
230
|
+
}
|
|
231
|
+
showMentionList(mentionList) {
|
|
232
|
+
if (!this.isOpen()) {
|
|
233
|
+
this.mentionListEL.classList.remove(this.options.listHideClass);
|
|
234
|
+
}
|
|
235
|
+
this.activeMentionIndex = 0;
|
|
236
|
+
this.setMentionListPos();
|
|
237
|
+
this.render(mentionList);
|
|
238
|
+
}
|
|
239
|
+
hideMentionList() {
|
|
240
|
+
if (this.isOpen()) {
|
|
241
|
+
this.activeMentionIndex = 0;
|
|
242
|
+
this.mentionListEL.classList.add(this.options.listHideClass);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
setMentionListPos() {
|
|
246
|
+
const cursorIndex = this.quill.selection.savedRange.index;
|
|
247
|
+
const cursorBounds = this.quill.getBounds(cursorIndex);
|
|
248
|
+
const { left, top } = cursorBounds;
|
|
249
|
+
const container = this.quill.container;
|
|
250
|
+
const hostElement = container.parentNode;
|
|
251
|
+
const { left: editorLeft, top: editorTop } = container.getBoundingClientRect();
|
|
252
|
+
const { left: hostElementLeft, top: hostElementTop } = hostElement.getBoundingClientRect();
|
|
253
|
+
const relativeLeft = editorLeft - hostElementLeft;
|
|
254
|
+
const relativeTop = editorTop - hostElementTop;
|
|
255
|
+
const menuLeft = left + relativeLeft - 5;
|
|
256
|
+
const menuTop = top + relativeTop + 20;
|
|
257
|
+
this.mentionListEL.style.cssText += `
|
|
258
|
+
left: ${menuLeft}px;
|
|
259
|
+
top: ${menuTop}px;
|
|
260
|
+
`;
|
|
261
|
+
}
|
|
262
|
+
render(mentionList) {
|
|
263
|
+
const wrapEl = document.createElement("div");
|
|
264
|
+
[].forEach.call(mentionList, (mentionItem, index) => {
|
|
265
|
+
const mentionItemEl = document.createElement("li");
|
|
266
|
+
mentionItemEl.classList.add(this.options.itemClass);
|
|
267
|
+
if (index === this.activeMentionIndex) {
|
|
268
|
+
mentionItemEl.classList.add(this.options.itemActiveClass);
|
|
269
|
+
}
|
|
270
|
+
const renderResult = this.options.renderMentionItem(mentionItem);
|
|
271
|
+
if (typeof renderResult === "string") {
|
|
272
|
+
mentionItemEl.insertAdjacentHTML("afterbegin", renderResult);
|
|
273
|
+
} else {
|
|
274
|
+
mentionItemEl.insertAdjacentElement("afterbegin", renderResult);
|
|
275
|
+
}
|
|
276
|
+
wrapEl.appendChild(mentionItemEl);
|
|
277
|
+
});
|
|
278
|
+
this.mentionListEL.innerHTML = wrapEl.innerHTML;
|
|
279
|
+
}
|
|
280
|
+
highlightMentionItem(index) {
|
|
281
|
+
const oldActiveItem = this.getActiveMentionItem();
|
|
282
|
+
if (oldActiveItem) {
|
|
283
|
+
oldActiveItem.classList.remove(this.options.itemActiveClass);
|
|
284
|
+
}
|
|
285
|
+
const newActiveItem = this.mentionListEL.querySelector(`.${this.options.itemClass}:nth-of-type(${index + 1})`);
|
|
286
|
+
if (newActiveItem) {
|
|
287
|
+
newActiveItem.classList.add(this.options.itemActiveClass);
|
|
288
|
+
this.scrollIntoView(newActiveItem);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
scrollIntoView(node) {
|
|
292
|
+
const nodeAsAny = node;
|
|
293
|
+
if (nodeAsAny.scrollIntoViewIfNeeded) {
|
|
294
|
+
nodeAsAny.scrollIntoViewIfNeeded(false);
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
if (node.scrollIntoView) {
|
|
298
|
+
node.scrollIntoView(false);
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
selectMentionItem(index = this.activeMentionIndex, isClick) {
|
|
303
|
+
const activeMentionItem = this.latestMentionList[index];
|
|
304
|
+
this.insertMentionBlot(activeMentionItem, isClick);
|
|
305
|
+
this.options.select(activeMentionItem);
|
|
306
|
+
this.hideMentionList();
|
|
307
|
+
}
|
|
308
|
+
insertMentionBlot(activeMentionItem, isClick) {
|
|
309
|
+
const mention = this.options.renderMentionText(activeMentionItem);
|
|
310
|
+
const delta = new Delta().retain(this.latestMentionCharPos).delete(this.latestCaretPos - this.latestMentionCharPos).insert({
|
|
311
|
+
[MentionLink.default.blotName]: {
|
|
312
|
+
char: this.options.mentionChar,
|
|
313
|
+
text: mention,
|
|
314
|
+
mention: activeMentionItem,
|
|
315
|
+
link: this.options.defaultLink,
|
|
316
|
+
target: this.options.target,
|
|
317
|
+
searchKey: this.options.searchKey
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
if (isClick) {
|
|
321
|
+
this.quill.updateContents(delta, Quill.sources.USER);
|
|
322
|
+
} else {
|
|
323
|
+
this.quill.updateContents(delta, Quill.sources.API);
|
|
324
|
+
}
|
|
325
|
+
this.quill.setSelection(this.latestMentionCharPos + 1, Quill.sources.API);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
exports.default = Mention;
|
|
329
|
+
//# sourceMappingURL=Mention.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Mention.cjs.js","sources":["../../../src/mention/Mention.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { isNullOrUndefined } from '../config/editor.utils'\r\nimport { DEFAULT_MENTION_CHAR, ON_MENTION_LINK_REMOVE } from './constants'\r\nimport MentionLink from './MentionLink'\r\n\r\nconst { Scope } = Quill.imports['parchment']\r\nconst Delta = Quill.imports['delta']\r\n\r\ninterface MentionOption {\r\n containerClass?: string\r\n dataAttributes?: string[]\r\n defaultLink?: string\r\n itemActiveClass?: string\r\n itemKey: string\r\n itemClass?: string\r\n listClass?: string\r\n listHideClass?: string\r\n maxHeight?: number\r\n mentionChar?: string\r\n remove?: (data: any) => void\r\n renderMentionItem?: (data: any) => string | HTMLElement\r\n renderMentionText?: (data: any) => string | HTMLElement\r\n search?: (term: string) => Promise<any[]>\r\n searchKey: string\r\n select?: (data: any) => void\r\n target?: string\r\n}\r\n\r\n// @dynamic\r\nclass Mention {\r\n private readonly options: MentionOption\r\n private readonly mentionListEL: HTMLUListElement\r\n private activeMentionIndex = 0\r\n private latestMentionList: any[]\r\n private latestMentionCharPos: number\r\n private latestCaretPos: number\r\n private searchTerm = ''\r\n private needInsertBr = true\r\n private readonly defaultOptions: MentionOption = {\r\n defaultLink: '#',\r\n target: '_blank',\r\n mentionChar: DEFAULT_MENTION_CHAR,\r\n maxHeight: 200,\r\n renderMentionItem(data: any) {\r\n let mentionItem = data.name || data.id\r\n if (this.itemKey) {\r\n mentionItem = data[this.itemKey]\r\n }\r\n const dom = document.createElement('SPAN')\r\n dom.textContent = mentionItem\r\n return dom\r\n },\r\n renderMentionText(data: any) {\r\n let mentionText = data.name || data.id\r\n if (this.itemKey) {\r\n mentionText = data[this.itemKey]\r\n }\r\n return `${mentionText}`\r\n },\r\n containerClass: 'ql-mention-list-container',\r\n listClass: 'ql-mention-list',\r\n listHideClass: 'ql-mention-list--hide',\r\n itemClass: 'ql-mention-item',\r\n itemActiveClass: 'ql-mention-item--active',\r\n itemKey: 'name',\r\n searchKey: 'name',\r\n dataAttributes: ['id'],\r\n select(_data: any) {},\r\n remove(_data: any) {},\r\n }\r\n\r\n static register() {\r\n Quill.register(MentionLink)\r\n }\r\n\r\n // @ts-ignore\r\n constructor(private quill: Quill, options: MentionOption) {\r\n if (!options.search) {\r\n console.warn('please provide a search function!')\r\n return\r\n }\r\n\r\n this.options = Object.assign(this.defaultOptions, options)\r\n const container = document.createElement('div')\r\n container.classList.add('ql-mention-list-container')\r\n if (this.options.containerClass !== 'ql-mention-list-container') {\r\n container.classList.add(this.options.containerClass)\r\n }\r\n this.mentionListEL = document.createElement('ul')\r\n this.mentionListEL.classList.add(this.options.listClass, this.options.listHideClass)\r\n this.mentionListEL.style.cssText += `\r\n max-height: ${this.options.maxHeight}px;\r\n `\r\n\r\n quill.on(Quill.events.TEXT_CHANGE, this.handleTextChange)\r\n quill.keyboard.addBinding({ key: 'ArrowUp' }, this.handleArrowUpKey)\r\n quill.keyboard.addBinding({ key: 'ArrowDown' }, this.handleArrowDownKey)\r\n quill.keyboard.addBinding({ key: 'Enter' }, this.handleEnterKey)\r\n quill.keyboard.addBinding({ key: 'Tab' }, this.handleEnterKey)\r\n quill.keyboard.addBinding({ key: 'Escape' }, this.handleEscapeKey)\r\n quill.keyboard.bindings['Enter'].unshift(quill.keyboard.bindings['Enter'].pop())\r\n quill.keyboard.bindings['Tab'].unshift(quill.keyboard.bindings['Tab'].pop())\r\n quill.keyboard.bindings['Escape'].unshift(quill.keyboard.bindings['Escape'].pop())\r\n\r\n const customKeyboardEnter = {\r\n key: 'Enter',\r\n shiftKey: null,\r\n handler: (range, context) => {\r\n const lineFormats = Object.keys(context.format).reduce(\r\n (formats, format) => {\r\n if (\r\n this.quill.scroll.query(format, Scope.BLOCK)\r\n && !Array.isArray(context.format[format])\r\n ) {\r\n formats[format] = context.format[format]\r\n }\r\n return formats\r\n },\r\n {},\r\n )\r\n\r\n // fix: 解决@提醒之后插入多余空行和光标位置不对的问题\r\n let selectionIndex = range.index - this.searchTerm.length\r\n let delta = new Delta()\r\n .retain(range.index)\r\n .delete(range.length)\r\n if (this.needInsertBr) {\r\n delta = delta.insert('\\n', lineFormats)\r\n selectionIndex = range.index + 1\r\n }\r\n\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(selectionIndex, Quill.sources.SILENT)\r\n this.quill.focus()\r\n\r\n Object.keys(context.format).forEach((name) => {\r\n if (!isNullOrUndefined(lineFormats[name])) return\r\n if (Array.isArray(context.format[name])) return\r\n if (name === 'code' || name === 'link') return\r\n this.quill.format(name, context.format[name], Quill.sources.USER)\r\n })\r\n\r\n this.needInsertBr = true // 标记是否是输入@提醒的Enter\r\n },\r\n }\r\n\r\n // 用自定义的Enter替换内置的Enter\r\n quill.keyboard.bindings['Enter'] = quill.keyboard.bindings['Enter'].map((item) => {\r\n const buildinKeyboardEnter = item.format === undefined && item.shiftKey === null\r\n if (buildinKeyboardEnter) {\r\n return customKeyboardEnter\r\n }\r\n else {\r\n return item\r\n }\r\n })\r\n\r\n this.on('click', this.handleMouseClick)\r\n this.on('mouseover', this.handleMouseEnter)\r\n quill.emitter.on(ON_MENTION_LINK_REMOVE, async ({ mention, name }) => {\r\n const [result] = (mention && [mention]) || (await this.options.search(name))\r\n this.options.remove(result)\r\n })\r\n container.appendChild(this.mentionListEL)\r\n quill.container.parentElement.insertBefore(container, quill.container)\r\n }\r\n\r\n on(eventName, callback) {\r\n this.mentionListEL.addEventListener(eventName, (evt) => {\r\n let\r\n target = evt.target\r\n let targetItemEL\r\n\r\n while (this.mentionListEL.contains(target) && target !== this.mentionListEL) {\r\n if (target.classList.contains(this.options.itemClass)) {\r\n targetItemEL = target\r\n }\r\n target = target.parentElement\r\n }\r\n\r\n if (targetItemEL) {\r\n callback.call(this, targetItemEL, this.getMentionItemIndex(targetItemEL))\r\n }\r\n })\r\n }\r\n\r\n getMentionItemIndex(itemEl: Element) {\r\n return [].reduce.call(this.mentionListEL.children,\r\n (index, item, idx) => item === itemEl ? idx : index, -1)\r\n }\r\n\r\n handleTextChange = (_delta, _oldDelta, source) => {\r\n // defer handler to make sure that we can get correct quill selection range.\r\n setTimeout(() => {\r\n if (Quill.sources.USER === source) {\r\n const range = this.quill.getSelection()\r\n if (!range) {\r\n return\r\n }\r\n\r\n const caretPos = this.latestCaretPos = range.index\r\n // beforeCaretText的计算有问题,没有把图片内容和@提醒内容的非字符内容算进去\r\n const content = this.quill.getContents()\r\n const beforeCaretText = content.reduce((newText, op) => {\r\n if (typeof op.insert === 'string') {\r\n // eslint-disable-next-line no-return-assign\r\n return (newText += op.insert)\r\n }\r\n else {\r\n // eslint-disable-next-line no-return-assign\r\n return (newText += ' ') // 将图片内容和@提醒内容的非字符内容置为' ',算一个位置\r\n }\r\n }, '')\r\n const mentionCharPos = beforeCaretText.lastIndexOf(this.options.mentionChar)\r\n\r\n if (mentionCharPos > -1) {\r\n const searchTerm = beforeCaretText.substring(mentionCharPos + this.options.mentionChar.length, caretPos)\r\n this.searchTerm = searchTerm\r\n if (!''.startsWith.call(searchTerm, ' ')) {\r\n this.latestMentionCharPos = mentionCharPos\r\n this.searchMentionListByTerm(searchTerm)\r\n }\r\n else {\r\n this.hideMentionList()\r\n }\r\n }\r\n else {\r\n this.hideMentionList()\r\n }\r\n }\r\n })\r\n }\r\n\r\n handleMouseClick(_itemEl: HTMLLIElement, index: number) {\r\n this.selectMentionItem(index, true)\r\n this.quill.focus()\r\n }\r\n\r\n handleMouseEnter(_itemEl: HTMLLIElement, index: number) {\r\n this.activeMentionIndex = index\r\n this.highlightMentionItem(index)\r\n }\r\n\r\n handleArrowUpKey = () => {\r\n if (this.isOpen()) {\r\n this.activeMentionIndex\r\n = (this.activeMentionIndex + this.latestMentionList.length - 1) % this.latestMentionList.length\r\n this.highlightMentionItem(this.activeMentionIndex)\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n handleArrowDownKey = () => {\r\n if (this.isOpen()) {\r\n this.activeMentionIndex = (this.activeMentionIndex + 1) % this.latestMentionList.length\r\n this.highlightMentionItem(this.activeMentionIndex)\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n handleEnterKey = () => {\r\n if (this.isOpen()) {\r\n this.selectMentionItem()\r\n this.needInsertBr = false\r\n }\r\n return true\r\n }\r\n\r\n handleEscapeKey = () => {\r\n if (this.isOpen()) {\r\n this.hideMentionList()\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n getActiveMentionItem() {\r\n return this.mentionListEL.querySelector(`.${this.options.itemActiveClass}`)\r\n }\r\n\r\n isOpen() {\r\n return !this.mentionListEL.classList.contains(this.options.listHideClass)\r\n }\r\n\r\n async searchMentionListByTerm(term: string) {\r\n const mentionList = await this.options.search(term)\r\n this.latestMentionList = mentionList\r\n if (!mentionList || mentionList.length === 0) {\r\n return this.hideMentionList()\r\n }\r\n\r\n this.showMentionList(mentionList)\r\n }\r\n\r\n showMentionList(mentionList: any[]) {\r\n if (!this.isOpen()) {\r\n this.mentionListEL.classList.remove(this.options.listHideClass)\r\n }\r\n this.activeMentionIndex = 0\r\n this.setMentionListPos()\r\n this.render(mentionList)\r\n }\r\n\r\n hideMentionList() {\r\n if (this.isOpen()) {\r\n this.activeMentionIndex = 0\r\n this.mentionListEL.classList.add(this.options.listHideClass)\r\n }\r\n }\r\n\r\n setMentionListPos() {\r\n const cursorIndex = this.quill.selection.savedRange.index\r\n const cursorBounds = this.quill.getBounds(cursorIndex)\r\n const { left, top } = cursorBounds\r\n const container = this.quill.container\r\n const hostElement = container.parentNode as HTMLDivElement\r\n const { left: editorLeft, top: editorTop } = container.getBoundingClientRect()\r\n const { left: hostElementLeft, top: hostElementTop } = hostElement.getBoundingClientRect()\r\n const relativeLeft = editorLeft - hostElementLeft\r\n const relativeTop = editorTop - hostElementTop\r\n const menuLeft = left + relativeLeft - 5\r\n const menuTop = top + relativeTop + 20\r\n this.mentionListEL.style.cssText += `\r\n left: ${menuLeft}px;\r\n top: ${menuTop}px;\r\n `\r\n }\r\n\r\n render(mentionList: any[]) {\r\n const wrapEl = document.createElement('div');\r\n\r\n [].forEach.call(mentionList, (mentionItem, index) => {\r\n const mentionItemEl = document.createElement('li')\r\n mentionItemEl.classList.add(this.options.itemClass)\r\n if (index === this.activeMentionIndex) {\r\n mentionItemEl.classList.add(this.options.itemActiveClass)\r\n }\r\n const renderResult = this.options.renderMentionItem(mentionItem)\r\n if (typeof renderResult === 'string') {\r\n mentionItemEl.insertAdjacentHTML('afterbegin', renderResult)\r\n }\r\n else {\r\n mentionItemEl.insertAdjacentElement('afterbegin', renderResult)\r\n }\r\n wrapEl.appendChild(mentionItemEl)\r\n })\r\n\r\n this.mentionListEL.innerHTML = wrapEl.innerHTML\r\n }\r\n\r\n highlightMentionItem(index: number) {\r\n const oldActiveItem = this.getActiveMentionItem()\r\n if (oldActiveItem) {\r\n oldActiveItem.classList.remove(this.options.itemActiveClass)\r\n }\r\n\r\n const newActiveItem = this.mentionListEL.querySelector(`.${this.options.itemClass}:nth-of-type(${index + 1})`)\r\n if (newActiveItem) {\r\n newActiveItem.classList.add(this.options.itemActiveClass)\r\n this.scrollIntoView(newActiveItem)\r\n }\r\n }\r\n\r\n scrollIntoView(node: Element): void {\r\n const nodeAsAny: any = node\r\n if (nodeAsAny.scrollIntoViewIfNeeded) {\r\n nodeAsAny.scrollIntoViewIfNeeded(false)\r\n return\r\n }\r\n if (node.scrollIntoView) {\r\n node.scrollIntoView(false)\r\n return\r\n }\r\n }\r\n\r\n selectMentionItem(index = this.activeMentionIndex, isClick?: boolean) {\r\n const activeMentionItem = this.latestMentionList[index]\r\n this.insertMentionBlot(activeMentionItem, isClick)\r\n this.options.select(activeMentionItem)\r\n this.hideMentionList()\r\n }\r\n\r\n insertMentionBlot(activeMentionItem: any, isClick?: boolean) {\r\n const mention = this.options.renderMentionText(activeMentionItem)\r\n const delta = new Delta()\r\n .retain(this.latestMentionCharPos)\r\n .delete(this.latestCaretPos - this.latestMentionCharPos)\r\n .insert({\r\n [MentionLink.blotName]: {\r\n char: this.options.mentionChar,\r\n text: mention,\r\n mention: activeMentionItem,\r\n link: this.options.defaultLink,\r\n target: this.options.target,\r\n searchKey: this.options.searchKey,\r\n },\r\n })\r\n if (isClick) {\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n }\r\n else {\r\n this.quill.updateContents(delta, Quill.sources.API)\r\n }\r\n this.quill.setSelection(this.latestMentionCharPos + 1, Quill.sources.API)\r\n }\r\n}\r\n\r\nexport { Mention as default }\r\n"],"names":["DEFAULT_MENTION_CHAR","isNullOrUndefined","ON_MENTION_LINK_REMOVE","MentionLink"],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
+
const Quill = require("quill");
|
|
4
|
+
const constants = require("./constants.cjs.js");
|
|
5
|
+
const Embed = Quill.imports["blots/embed"];
|
|
6
|
+
class MentionLink extends Embed {
|
|
7
|
+
static create(data) {
|
|
8
|
+
const node = super.create(data);
|
|
9
|
+
node.dataset.mentionId = data.name || data.mention && data.mention[data.searchKey || "name"] || "";
|
|
10
|
+
node.setAttribute("title", data.text);
|
|
11
|
+
node.setAttribute(constants.MENTION_CHAR, data.char);
|
|
12
|
+
node.textContent = data.char + data.text;
|
|
13
|
+
return node;
|
|
14
|
+
}
|
|
15
|
+
static value(domNode) {
|
|
16
|
+
const char = domNode.getAttribute(constants.MENTION_CHAR) || constants.DEFAULT_MENTION_CHAR;
|
|
17
|
+
const text = domNode.getAttribute("title");
|
|
18
|
+
const name = domNode.dataset.mentionId;
|
|
19
|
+
return { char, text, name };
|
|
20
|
+
}
|
|
21
|
+
constructor(scroll, domNode, data) {
|
|
22
|
+
super(scroll, domNode, data);
|
|
23
|
+
this.mentionData = data;
|
|
24
|
+
}
|
|
25
|
+
value() {
|
|
26
|
+
return super.value();
|
|
27
|
+
}
|
|
28
|
+
remove() {
|
|
29
|
+
this.scroll.emitter.emit(constants.ON_MENTION_LINK_REMOVE, this.mentionData);
|
|
30
|
+
return super.remove();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
MentionLink.blotName = "mention";
|
|
34
|
+
MentionLink.tagName = "span";
|
|
35
|
+
MentionLink.className = "ql-mention-link";
|
|
36
|
+
exports.default = MentionLink;
|
|
37
|
+
//# sourceMappingURL=MentionLink.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MentionLink.cjs.js","sources":["../../../src/mention/MentionLink.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { DEFAULT_MENTION_CHAR, MENTION_CHAR, ON_MENTION_LINK_REMOVE } from './constants'\r\n\r\nconst Embed = Quill.imports['blots/embed']\r\n\r\n// @dynamic\r\nclass MentionLink extends Embed {\r\n static blotName: string\r\n static tagName: string\r\n static className: string\r\n scroll: any\r\n mentionData: any\r\n\r\n static create(data) {\r\n const node = super.create(data)\r\n node.dataset.mentionId = data.name || (data.mention && data.mention[data.searchKey || 'name']) || ''\r\n node.setAttribute('title', data.text)\r\n node.setAttribute(MENTION_CHAR, data.char)\r\n node.textContent = data.char + data.text\r\n return node\r\n }\r\n\r\n static value(domNode) {\r\n const\r\n char = domNode.getAttribute(MENTION_CHAR) || DEFAULT_MENTION_CHAR\r\n const text = domNode.getAttribute('title')\r\n const name = domNode.dataset.mentionId\r\n return { char, text, name }\r\n }\r\n\r\n constructor(scroll, domNode, data) {\r\n super(scroll, domNode, data)\r\n this.mentionData = data\r\n }\r\n\r\n value() {\r\n // fix: 将@提醒内容加入到 Delta 里,以解决输入空格,@提醒内容被删除的问题\r\n // return ' ';\r\n return super.value()\r\n }\r\n\r\n remove() {\r\n this.scroll.emitter.emit(ON_MENTION_LINK_REMOVE, this.mentionData)\r\n return super.remove()\r\n }\r\n}\r\n\r\nMentionLink.blotName = 'mention'\r\nMentionLink.tagName = 'span'\r\nMentionLink.className = 'ql-mention-link'\r\nexport { MentionLink as default }\r\n"],"names":["MENTION_CHAR","DEFAULT_MENTION_CHAR","ON_MENTION_LINK_REMOVE"],"mappings":";;;;AAGA,MAAM,QAAQ,MAAM,QAAQ,aAAa;AAGzC,MAAM,oBAAoB,MAAM;AAAA,EAO9B,OAAO,OAAO,MAAM;AACZ,UAAA,OAAO,MAAM,OAAO,IAAI;AACzB,SAAA,QAAQ,YAAY,KAAK,QAAS,KAAK,WAAW,KAAK,QAAQ,KAAK,aAAa,MAAM,KAAM;AAC7F,SAAA,aAAa,SAAS,KAAK,IAAI;AAC/B,SAAA,aAAaA,UAAAA,cAAc,KAAK,IAAI;AACpC,SAAA,cAAc,KAAK,OAAO,KAAK;AAC7B,WAAA;AAAA,EACT;AAAA,EAEA,OAAO,MAAM,SAAS;AACpB,UACE,OAAO,QAAQ,aAAaA,UAAY,YAAA,KAAKC,UAAAA;AACzC,UAAA,OAAO,QAAQ,aAAa,OAAO;AACnC,UAAA,OAAO,QAAQ,QAAQ;AACtB,WAAA,EAAE,MAAM,MAAM;EACvB;AAAA,EAEA,YAAY,QAAQ,SAAS,MAAM;AAC3B,UAAA,QAAQ,SAAS,IAAI;AAC3B,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,QAAQ;AAGN,WAAO,MAAM;EACf;AAAA,EAEA,SAAS;AACP,SAAK,OAAO,QAAQ,KAAKC,UAAAA,wBAAwB,KAAK,WAAW;AACjE,WAAO,MAAM;EACf;AACF;AAEA,YAAY,WAAW;AACvB,YAAY,UAAU;AACtB,YAAY,YAAY;;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const ON_MENTION_LINK_REMOVE = "mention-link/remove";
|
|
4
|
+
const MENTION_CHAR = "mentionChar";
|
|
5
|
+
const DEFAULT_MENTION_CHAR = "@";
|
|
6
|
+
exports.DEFAULT_MENTION_CHAR = DEFAULT_MENTION_CHAR;
|
|
7
|
+
exports.MENTION_CHAR = MENTION_CHAR;
|
|
8
|
+
exports.ON_MENTION_LINK_REMOVE = ON_MENTION_LINK_REMOVE;
|
|
9
|
+
//# sourceMappingURL=constants.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.cjs.js","sources":["../../../src/mention/constants.ts"],"sourcesContent":["export const ON_MENTION_LINK_REMOVE = 'mention-link/remove'\r\nexport const MENTION_CHAR = 'mentionChar'\r\nexport const DEFAULT_MENTION_CHAR = '@'\r\n"],"names":[],"mappings":";;AAAO,MAAM,yBAAyB;AAC/B,MAAM,eAAe;AACrB,MAAM,uBAAuB;;;;"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
+
class QuickMenu {
|
|
4
|
+
// @ts-ignore
|
|
5
|
+
constructor(quill, options) {
|
|
6
|
+
this.quill = quill;
|
|
7
|
+
this.options = options;
|
|
8
|
+
this.handleSlashKeyDown = (_range, context) => {
|
|
9
|
+
const index = this.quill.selection.savedRange.index;
|
|
10
|
+
this.quill.insertText(index, "/");
|
|
11
|
+
const shouldTriggerQuickMenu = context.prefix === "" && Object.keys(context.format).length === 0;
|
|
12
|
+
if (shouldTriggerQuickMenu) {
|
|
13
|
+
const cursorIndex = this.quill.selection.savedRange.index;
|
|
14
|
+
const cursorBounds = this.quill.getBounds(cursorIndex);
|
|
15
|
+
const { left, top } = cursorBounds;
|
|
16
|
+
const { left: editorLeft, top: editorTop } = this.container.getBoundingClientRect();
|
|
17
|
+
const { left: hostElementLeft, top: hostElementTop } = this.hostElement.getBoundingClientRect();
|
|
18
|
+
const relativeLeft = editorLeft - hostElementLeft;
|
|
19
|
+
const relativeTop = editorTop - hostElementTop;
|
|
20
|
+
const menuLeft = left + relativeLeft - 5;
|
|
21
|
+
const menuTop = top + relativeTop + 20;
|
|
22
|
+
this.quickMenu.style.display = "block";
|
|
23
|
+
const zIndex = this.quill.options.modules.quickmenu.zIndex;
|
|
24
|
+
let style = `left:${menuLeft}px;top:${menuTop}px;`;
|
|
25
|
+
if (zIndex || zIndex === 0) {
|
|
26
|
+
style += `z-index:${zIndex}`;
|
|
27
|
+
}
|
|
28
|
+
this.quickMenuContainer.setAttribute("style", style);
|
|
29
|
+
this.options.component.activeIndex = 0;
|
|
30
|
+
} else {
|
|
31
|
+
this.quickMenu.style.display = "none";
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
this.hideQuickMenu = (event) => {
|
|
35
|
+
if (this.quickMenuContainer && !this.quickMenuContainer.contains(event.target)) {
|
|
36
|
+
this.quickMenuContainer.style.display = "none";
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
this.handleArrowUpKey = (_range, _context) => {
|
|
40
|
+
if (this.isOpen()) {
|
|
41
|
+
const index = this.options.component.activeIndex;
|
|
42
|
+
const total = this.options.component.quickMenus.length;
|
|
43
|
+
this.options.component.activeIndex = (index + total - 1) % total;
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
};
|
|
48
|
+
this.handleArrowDownKey = (_range, _context) => {
|
|
49
|
+
if (this.isOpen()) {
|
|
50
|
+
const index = this.options.component.activeIndex;
|
|
51
|
+
const total = this.options.component.quickMenus.length;
|
|
52
|
+
this.options.component.activeIndex = (index + 1) % total;
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
return true;
|
|
56
|
+
};
|
|
57
|
+
this.handleEnterKey = (_range, _context) => {
|
|
58
|
+
if (this.isOpen()) {
|
|
59
|
+
this.options.component.onEnter();
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
return true;
|
|
63
|
+
};
|
|
64
|
+
this.quill = quill;
|
|
65
|
+
this.options = options;
|
|
66
|
+
this.container = this.quill.container;
|
|
67
|
+
this.hostElement = this.container.parentNode;
|
|
68
|
+
this.quickMenu = this.hostElement.querySelector(".quick-menu");
|
|
69
|
+
this.quickMenuContainer = this.quickMenu.querySelector(".quick-menu-container");
|
|
70
|
+
quill.keyboard.addBinding({ key: "/" }, this.handleSlashKeyDown);
|
|
71
|
+
quill.keyboard.addBinding({ key: "ArrowUp" }, this.handleArrowUpKey);
|
|
72
|
+
quill.keyboard.addBinding({ key: "ArrowDown" }, this.handleArrowDownKey);
|
|
73
|
+
quill.keyboard.addBinding({ key: "Enter" }, this.handleEnterKey);
|
|
74
|
+
quill.keyboard.bindings["Enter"].unshift(quill.keyboard.bindings["Enter"].pop());
|
|
75
|
+
document.body.addEventListener("click", this.hideQuickMenu.bind(this));
|
|
76
|
+
}
|
|
77
|
+
isOpen() {
|
|
78
|
+
return this.quickMenuContainer.style.display !== "none" && this.quickMenu.style.display === "block";
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.default = QuickMenu;
|
|
82
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../src/quick-menu/index.ts"],"sourcesContent":["import Quill from 'quill'\r\n\r\ninterface QuickMenuOptions {\r\n container: string\r\n component: any\r\n}\r\n\r\nclass QuickMenu {\r\n private container: HTMLDivElement\r\n private hostElement: HTMLDivElement\r\n private quickMenu: HTMLDivElement\r\n private quickMenuContainer: HTMLDivElement\r\n\r\n // @ts-ignore\r\n constructor(private quill: Quill, private options: QuickMenuOptions) {\r\n this.quill = quill\r\n this.options = options\r\n this.container = this.quill.container\r\n this.hostElement = this.container.parentNode as HTMLDivElement\r\n this.quickMenu = this.hostElement.querySelector('.quick-menu')\r\n this.quickMenuContainer = this.quickMenu.querySelector('.quick-menu-container')\r\n quill.keyboard.addBinding({ key: '/' }, this.handleSlashKeyDown)\r\n quill.keyboard.addBinding({ key: 'ArrowUp' }, this.handleArrowUpKey)\r\n quill.keyboard.addBinding({ key: 'ArrowDown' }, this.handleArrowDownKey)\r\n quill.keyboard.addBinding({ key: 'Enter' }, this.handleEnterKey)\r\n quill.keyboard.bindings['Enter'].unshift(quill.keyboard.bindings['Enter'].pop())\r\n document.body.addEventListener('click', this.hideQuickMenu.bind(this))\r\n }\r\n\r\n handleSlashKeyDown = (_range, context) => {\r\n const index = this.quill.selection.savedRange.index\r\n this.quill.insertText(index, '/')\r\n\r\n // 一行的第一个字符为 '/',且没有格式化,则触发快捷菜单\r\n const shouldTriggerQuickMenu = context.prefix === '' && Object.keys(context.format).length === 0\r\n if (shouldTriggerQuickMenu) {\r\n const cursorIndex = this.quill.selection.savedRange.index\r\n const cursorBounds = this.quill.getBounds(cursorIndex)\r\n const { left, top } = cursorBounds\r\n const { left: editorLeft, top: editorTop } = this.container.getBoundingClientRect()\r\n const { left: hostElementLeft, top: hostElementTop } = this.hostElement.getBoundingClientRect()\r\n const relativeLeft = editorLeft - hostElementLeft\r\n const relativeTop = editorTop - hostElementTop\r\n const menuLeft = left + relativeLeft - 5\r\n const menuTop = top + relativeTop + 20\r\n\r\n this.quickMenu.style.display = 'block'\r\n const zIndex = this.quill.options.modules.quickmenu.zIndex\r\n let style = `left:${menuLeft}px;top:${menuTop}px;`\r\n if (zIndex || zIndex === 0) {\r\n style += `z-index:${zIndex}`\r\n }\r\n this.quickMenuContainer.setAttribute('style', style)\r\n this.options.component.activeIndex = 0\r\n }\r\n else {\r\n this.quickMenu.style.display = 'none'\r\n }\r\n }\r\n\r\n private isOpen() {\r\n return this.quickMenuContainer.style.display !== 'none' && this.quickMenu.style.display === 'block'\r\n }\r\n\r\n hideQuickMenu = (event) => {\r\n if (this.quickMenuContainer && !this.quickMenuContainer.contains(event.target)) {\r\n this.quickMenuContainer.style.display = 'none'\r\n }\r\n }\r\n\r\n handleArrowUpKey = (_range, _context) => {\r\n if (this.isOpen()) {\r\n const index = this.options.component.activeIndex\r\n const total = this.options.component.quickMenus.length\r\n this.options.component.activeIndex = (index + total - 1) % total\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n handleArrowDownKey = (_range, _context) => {\r\n if (this.isOpen()) {\r\n const index = this.options.component.activeIndex\r\n const total = this.options.component.quickMenus.length\r\n this.options.component.activeIndex = (index + 1) % total\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n handleEnterKey = (_range, _context) => {\r\n if (this.isOpen()) {\r\n this.options.component.onEnter()\r\n return false\r\n }\r\n return true\r\n }\r\n}\r\n\r\nexport default QuickMenu\r\n"],"names":[],"mappings":"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"}
|