@northernco/ckeditor5-anchor-drupal
Version:
Drupal CKEditor 5 integration
184 lines (153 loc) • 4.16 kB
JavaScript
/**
* @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
/**
* @module anchor/ui/anchoractionsview
*/
import { View } from 'ckeditor5/src/ui';
import { ViewCollection } from 'ckeditor5/src/ui';
import { ButtonView } from 'ckeditor5/src/ui';
import { FocusTracker } from 'ckeditor5/src/utils';
import { FocusCycler } from 'ckeditor5/src/ui';
import { KeystrokeHandler } from 'ckeditor5/src/utils';
import unanchorIcon from '../../theme/icons/unanchor.svg';
import { icons } from 'ckeditor5/src/core';
import '../../theme/anchoractions.css';
import '@ckeditor/ckeditor5-ui/theme/components/responsive-form/responsiveform.css';
/**
* The anchor actions view class. This view displays the anchor preview, allows
* unanchoring or editing the anchor.
*
* @extends module:ui/view~View
*/
export default class AnchorActionsView extends View {
/**
* @inheritDoc
*/
constructor( locale ) {
super( locale );
const t = locale.t;
/**
* Tracks information about DOM focus in the actions.
*
* @readonly
* @member {module:utils/focustracker~FocusTracker}
*/
this.focusTracker = new FocusTracker();
/**
* An instance of the {@link module:utils/keystrokehandler~KeystrokeHandler}.
*
* @readonly
* @member {module:utils/keystrokehandler~KeystrokeHandler}
*/
this.keystrokes = new KeystrokeHandler();
/**
* The unanchor button view.
*
* @member {module:ui/button/buttonview~ButtonView}
*/
this.unanchorButtonView = this._createButton( t( 'Unanchor' ), unanchorIcon, 'unanchor' );
/**
* The edit anchor button view.
*
* @member {module:ui/button/buttonview~ButtonView}
*/
this.editButtonView = this._createButton( t( 'Edit anchor' ), icons.pencil, 'edit' );
/**
* A collection of views that can be focused in the view.
*
* @readonly
* @protected
* @member {module:ui/viewcollection~ViewCollection}
*/
this._focusables = new ViewCollection();
/**
* Helps cycling over {@link #_focusables} in the view.
*
* @readonly
* @protected
* @member {module:ui/focuscycler~FocusCycler}
*/
this._focusCycler = new FocusCycler( {
focusables: this._focusables,
focusTracker: this.focusTracker,
keystrokeHandler: this.keystrokes,
actions: {
// Navigate fields backwards using the Shift + Tab keystroke.
focusPrevious: 'shift + tab',
// Navigate fields forwards using the Tab key.
focusNext: 'tab'
}
} );
this.setTemplate( {
tag: 'div',
attributes: {
class: [
'ck',
'ck-anchor-actions',
'ck-responsive-form'
],
// https://github.com/ckeditor/ckeditor5-anchor/issues/90
tabindex: '-1'
},
children: [
this.editButtonView,
this.unanchorButtonView
]
} );
}
/**
* @inheritDoc
*/
render() {
super.render();
const childViews = [
this.editButtonView,
this.unanchorButtonView
];
childViews.forEach( v => {
// Register the view as focusable.
this._focusables.add( v );
// Register the view in the focus tracker.
this.focusTracker.add( v.element );
} );
// Start listening for the keystrokes coming from #element.
this.keystrokes.listenTo( this.element );
}
/**
* Focuses the fist {@link #_focusables} in the actions.
*/
focus() {
this._focusCycler.focusFirst();
}
/**
* Creates a button view.
*
* @private
* @param {String} label The button label.
* @param {String} icon The button icon.
* @param {String} [eventName] An event name that the `ButtonView#execute` event will be delegated to.
* @returns {module:ui/button/buttonview~ButtonView} The button view instance.
*/
_createButton( label, icon, eventName ) {
const button = new ButtonView( this.locale );
button.set( {
label,
icon,
tooltip: true
} );
button.delegate( 'execute' ).to( this, eventName );
return button;
}
}
/**
* Fired when the {@link #editButtonView} is clicked.
*
* @event edit
*/
/**
* Fired when the {@link #unanchorButtonView} is clicked.
*
* @event unanchor
*/