widget/utils

Api-module icon module

Constants

Functions

  • Chevron-right icon

    calculateResizeHostAncestorWidth( domResizeHost ) → number

    Starting from a DOM resize host element (an element that receives dimensions as a result of resizing), this helper returns the width of the found ancestor element.

    * It searches up to 5 levels of ancestors only.
    
    Copy code

    Parameters

    domResizeHost : HTMLElement

    Resize host DOM element that receives dimensions as a result of resizing.

    Returns

    number

    Width of ancestor element in pixels or 0 if no ancestor with a computed width has been found.

  • Chevron-right icon

    calculateResizeHostPercentageWidth( domResizeHost, resizeHostRect ) → number

    Calculates a relative width of a domResizeHost compared to its ancestor in percents.

    Parameters

    domResizeHost : HTMLElement

    Resize host DOM element.

    resizeHostRect : Rect

    Defaults to ...

    Returns

    number

    Percentage value between 0 and 100.

  • Chevron-right icon

    findOptimalInsertionRange( selection, model ) → ModelRange

    Returns a model range which is optimal (in terms of UX) for inserting a widget block.

    For instance, if a selection is in the middle of a paragraph, the collapsed range before this paragraph will be returned so that it is not split. If the selection is at the end of a paragraph, the collapsed range after this paragraph will be returned.

    Note: If the selection is placed in an empty block, the range in that block will be returned. If that range is then passed to insertContent, the block will be fully replaced by the inserted widget block.

    Parameters

    selection : ModelSelection | ModelDocumentSelection

    The selection based on which the insertion position should be calculated.

    model : Model

    Model instance.

    Returns

    ModelRange

    The optimal range.

  • Chevron-right icon

    getLabel( element ) → string

    Returns the label of the provided element.

    Parameters

    element : ViewElement

    Returns

    string
  • Chevron-right icon

    isWidget( node ) → boolean

    Returns true if given ViewNode is an ViewElement and a widget.

    Parameters

    node : ViewTypeCheckable

    Returns

    boolean
  • Chevron-right icon

    setHighlightHandling( element, writer, add, remove ) → void

    Sets highlight handling methods. Uses WidgetHighlightStack to properly determine which highlight descriptor should be used at given time.

    Parameters

    element : ViewElement
    writer : ViewDowncastWriter
    add : ( element: ViewElement, descriptor: DowncastHighlightDescriptor, writer: ViewDowncastWriter ) => void

    Defaults to addHighlight

    remove : ( element: ViewElement, descriptor: DowncastHighlightDescriptor, writer: ViewDowncastWriter ) => void

    Defaults to removeHighlight

    Returns

    void
  • Chevron-right icon

    setLabel( element, labelOrCreator ) → void

    Sets label for given element. It can be passed as a plain string or a function returning a string. Function will be called each time label is retrieved by getLabel().

    Parameters

    element : ViewElement
    labelOrCreator : string | () => string

    Returns

    void
  • Chevron-right icon

    toWidget( element, writer, options = { [options.hasSelectionHandle], [options.label] } ) → ViewElement

    Converts the given ViewElement to a widget in the following way:

    This function needs to be used in conjunction with downcast conversion helpers like elementToElement(). Moreover, typically you will want to use toWidget() only for editingDowncast, while keeping the dataDowncast clean.

    For example, in order to convert a <widget> model element to <div class="widget"> in the view, you can define such converters:

    editor.conversion.for( 'editingDowncast' )
    	.elementToElement( {
    		model: 'widget',
    		view: ( modelItem, { writer } ) => {
    			const div = writer.createContainerElement( 'div', { class: 'widget' } );
    
    			return toWidget( div, writer, { label: 'some widget' } );
    		}
    	} );
    
    editor.conversion.for( 'dataDowncast' )
    	.elementToElement( {
    		model: 'widget',
    		view: ( modelItem, { writer } ) => {
    			return writer.createContainerElement( 'div', { class: 'widget' } );
    		}
    	} );
    
    Copy code

    See the full source code of the widget (with a nested editable) schema definition and converters in this sample.

    Parameters

    element : ViewElement
    writer : ViewDowncastWriter
    options : object

    Additional options.

    Properties
    [ options.hasSelectionHandle ] : boolean

    If true, the widget will have a selection handle added.

    [ options.label ] : string | () => string

    Element's label provided to the setLabel function. It can be passed as a plain string or a function returning a string. It represents the widget for assistive technologies (like screen readers).

    Defaults to {}

    Returns

    ViewElement

    Returns the same element.

  • Chevron-right icon

    toWidgetEditable( editable, writer, options = { [options.label], [options.withAriaRole] } ) → ViewEditableElement

    Adds functionality to the provided ViewEditableElement to act as a widget's editable:

    • sets the contenteditable attribute to true when isReadOnly is false, otherwise sets it to false,
    • adds the ck-editor__editable and ck-editor__nested-editable CSS classes,
    • adds the ck-editor__nested-editable_focused CSS class when the editable is focused and removes it when it is blurred.
    • implements the view highlight on widget's editable.
    • sets the role attribute to textbox for accessibility purposes.

    Similarly to toWidget() this function should be used in editingDowncast only and it is usually used together with elementToElement().

    For example, in order to convert a <nested> model element to <div class="nested"> in the view, you can define such converters:

    editor.conversion.for( 'editingDowncast' )
    	.elementToElement( {
    		model: 'nested',
    		view: ( modelItem, { writer } ) => {
    			const div = writer.createEditableElement( 'div', { class: 'nested' } );
    
    			return toWidgetEditable( nested, writer, { label: 'label for editable' } );
    		}
    	} );
    
    editor.conversion.for( 'dataDowncast' )
    	.elementToElement( {
    		model: 'nested',
    		view: ( modelItem, { writer } ) => {
    			return writer.createContainerElement( 'div', { class: 'nested' } );
    		}
    	} );
    
    Copy code

    See the full source code of the widget (with nested editable) schema definition and converters in this sample.

    Parameters

    editable : ViewEditableElement
    writer : ViewDowncastWriter
    options : object

    Additional options.

    Properties
    [ options.label ] : string

    Editable's label used by assistive technologies (e.g. screen readers).

    [ options.withAriaRole ] : boolean

    Whether to add the role="textbox" attribute on the editable. Defaults to true.

    Defaults to {}

    Returns

    ViewEditableElement

    Returns the same element that was provided in the editable parameter

  • Chevron-right icon

    A util to be used in order to map view positions to correct model positions when implementing a widget which renders non-empty view element for an empty model element.

    For example:

    // Model:
    <placeholder type="name"></placeholder>
    
    // View:
    <span class="placeholder">name</span>
    
    Copy code

    In such case, view positions inside <span> cannot be correctly mapped to the model (because the model element is empty). To handle mapping positions inside <span class="placeholder"> to the model use this util as follows:

    // Model:
    <placeholder type="name"></placeholder>
    
    // View:
    <span class="placeholder">name</span>
    
    Copy code

    The callback will try to map the view offset of selection to an expected model position.

    1. When the position is at the end (or in the middle) of the inline widget:
    // Model:
    <placeholder type="name"></placeholder>
    
    // View:
    <span class="placeholder">name</span>
    
    Copy code
    1. When the position is at the beginning of the inline widget:
    // Model:
    <placeholder type="name"></placeholder>
    
    // View:
    <span class="placeholder">name</span>
    
    Copy code

    Parameters

    model : Model

    Model instance on which the callback operates.

    viewElementMatcher : ( element: ViewElement ) => boolean

    Function that is passed a view element and should return true if the custom mapping should be applied to the given view element.

    Returns

    GetCallback<MapperViewToModelPositionEvent>