annotate core/modules/quickedit/js/views/FieldToolbarView.es6.js @ 5:12f9dff5fda9 tip

Update to Drupal core 8.7.1
author Chris Cannam
date Thu, 09 May 2019 15:34:47 +0100
parents a9cd425dd02b
children
rev   line source
Chris@0 1 /**
Chris@0 2 * @file
Chris@0 3 * A Backbone View that provides an interactive toolbar (1 per in-place editor).
Chris@0 4 */
Chris@0 5
Chris@4 6 (function($, _, Backbone, Drupal) {
Chris@4 7 Drupal.quickedit.FieldToolbarView = Backbone.View.extend(
Chris@4 8 /** @lends Drupal.quickedit.FieldToolbarView# */ {
Chris@4 9 /**
Chris@4 10 * The edited element, as indicated by EditorView.getEditedElement.
Chris@4 11 *
Chris@4 12 * @type {jQuery}
Chris@4 13 */
Chris@4 14 $editedElement: null,
Chris@0 15
Chris@0 16 /**
Chris@4 17 * A reference to the in-place editor.
Chris@4 18 *
Chris@4 19 * @type {Drupal.quickedit.EditorView}
Chris@0 20 */
Chris@4 21 editorView: null,
Chris@0 22
Chris@4 23 /**
Chris@4 24 * @type {string}
Chris@4 25 */
Chris@4 26 _id: null,
Chris@0 27
Chris@4 28 /**
Chris@4 29 * @constructs
Chris@4 30 *
Chris@4 31 * @augments Backbone.View
Chris@4 32 *
Chris@4 33 * @param {object} options
Chris@4 34 * Options object to construct the field toolbar.
Chris@4 35 * @param {jQuery} options.$editedElement
Chris@4 36 * The element being edited.
Chris@4 37 * @param {Drupal.quickedit.EditorView} options.editorView
Chris@4 38 * The EditorView the toolbar belongs to.
Chris@4 39 */
Chris@4 40 initialize(options) {
Chris@4 41 this.$editedElement = options.$editedElement;
Chris@4 42 this.editorView = options.editorView;
Chris@4 43
Chris@4 44 /**
Chris@4 45 * @type {jQuery}
Chris@4 46 */
Chris@4 47 this.$root = this.$el;
Chris@4 48
Chris@4 49 // Generate a DOM-compatible ID for the form container DOM element.
Chris@4 50 this._id = `quickedit-toolbar-for-${this.model.id.replace(
Chris@4 51 /[/[\]]/g,
Chris@4 52 '_',
Chris@4 53 )}`;
Chris@4 54
Chris@4 55 this.listenTo(this.model, 'change:state', this.stateChange);
Chris@4 56 },
Chris@4 57
Chris@4 58 /**
Chris@4 59 * @inheritdoc
Chris@4 60 *
Chris@4 61 * @return {Drupal.quickedit.FieldToolbarView}
Chris@4 62 * The current FieldToolbarView.
Chris@4 63 */
Chris@4 64 render() {
Chris@4 65 // Render toolbar and set it as the view's element.
Chris@4 66 this.setElement(
Chris@4 67 $(
Chris@4 68 Drupal.theme('quickeditFieldToolbar', {
Chris@4 69 id: this._id,
Chris@4 70 }),
Chris@4 71 ),
Chris@4 72 );
Chris@4 73
Chris@4 74 // Attach to the field toolbar $root element in the entity toolbar.
Chris@4 75 this.$el.prependTo(this.$root);
Chris@4 76
Chris@4 77 return this;
Chris@4 78 },
Chris@4 79
Chris@4 80 /**
Chris@4 81 * Determines the actions to take given a change of state.
Chris@4 82 *
Chris@4 83 * @param {Drupal.quickedit.FieldModel} model
Chris@4 84 * The quickedit FieldModel
Chris@4 85 * @param {string} state
Chris@4 86 * The state of the associated field. One of
Chris@4 87 * {@link Drupal.quickedit.FieldModel.states}.
Chris@4 88 */
Chris@4 89 stateChange(model, state) {
Chris@4 90 const from = model.previous('state');
Chris@4 91 const to = state;
Chris@4 92 switch (to) {
Chris@4 93 case 'inactive':
Chris@4 94 break;
Chris@4 95
Chris@4 96 case 'candidate':
Chris@4 97 // Remove the view's existing element if we went to the 'activating'
Chris@4 98 // state or later, because it will be recreated. Not doing this would
Chris@4 99 // result in memory leaks.
Chris@4 100 if (from !== 'inactive' && from !== 'highlighted') {
Chris@4 101 this.$el.remove();
Chris@4 102 this.setElement();
Chris@4 103 }
Chris@4 104 break;
Chris@4 105
Chris@4 106 case 'highlighted':
Chris@4 107 break;
Chris@4 108
Chris@4 109 case 'activating':
Chris@4 110 this.render();
Chris@4 111
Chris@4 112 if (this.editorView.getQuickEditUISettings().fullWidthToolbar) {
Chris@4 113 this.$el.addClass('quickedit-toolbar-fullwidth');
Chris@4 114 }
Chris@4 115
Chris@4 116 if (this.editorView.getQuickEditUISettings().unifiedToolbar) {
Chris@4 117 this.insertWYSIWYGToolGroups();
Chris@4 118 }
Chris@4 119 break;
Chris@4 120
Chris@4 121 case 'active':
Chris@4 122 break;
Chris@4 123
Chris@4 124 case 'changed':
Chris@4 125 break;
Chris@4 126
Chris@4 127 case 'saving':
Chris@4 128 break;
Chris@4 129
Chris@4 130 case 'saved':
Chris@4 131 break;
Chris@4 132
Chris@4 133 case 'invalid':
Chris@4 134 break;
Chris@4 135 }
Chris@4 136 },
Chris@4 137
Chris@4 138 /**
Chris@4 139 * Insert WYSIWYG markup into the associated toolbar.
Chris@4 140 */
Chris@4 141 insertWYSIWYGToolGroups() {
Chris@4 142 this.$el
Chris@4 143 .append(
Chris@4 144 Drupal.theme('quickeditToolgroup', {
Chris@4 145 id: this.getFloatedWysiwygToolgroupId(),
Chris@4 146 classes: [
Chris@4 147 'wysiwyg-floated',
Chris@4 148 'quickedit-animate-slow',
Chris@4 149 'quickedit-animate-invisible',
Chris@4 150 'quickedit-animate-delay-veryfast',
Chris@4 151 ],
Chris@4 152 buttons: [],
Chris@4 153 }),
Chris@4 154 )
Chris@4 155 .append(
Chris@4 156 Drupal.theme('quickeditToolgroup', {
Chris@4 157 id: this.getMainWysiwygToolgroupId(),
Chris@4 158 classes: [
Chris@4 159 'wysiwyg-main',
Chris@4 160 'quickedit-animate-slow',
Chris@4 161 'quickedit-animate-invisible',
Chris@4 162 'quickedit-animate-delay-veryfast',
Chris@4 163 ],
Chris@4 164 buttons: [],
Chris@4 165 }),
Chris@4 166 );
Chris@4 167
Chris@4 168 // Animate the toolgroups into visibility.
Chris@4 169 this.show('wysiwyg-floated');
Chris@4 170 this.show('wysiwyg-main');
Chris@4 171 },
Chris@4 172
Chris@4 173 /**
Chris@4 174 * Retrieves the ID for this toolbar's container.
Chris@4 175 *
Chris@4 176 * Only used to make sane hovering behavior possible.
Chris@4 177 *
Chris@4 178 * @return {string}
Chris@4 179 * A string that can be used as the ID for this toolbar's container.
Chris@4 180 */
Chris@4 181 getId() {
Chris@4 182 return `quickedit-toolbar-for-${this._id}`;
Chris@4 183 },
Chris@4 184
Chris@4 185 /**
Chris@4 186 * Retrieves the ID for this toolbar's floating WYSIWYG toolgroup.
Chris@4 187 *
Chris@4 188 * Used to provide an abstraction for any WYSIWYG editor to plug in.
Chris@4 189 *
Chris@4 190 * @return {string}
Chris@4 191 * A string that can be used as the ID.
Chris@4 192 */
Chris@4 193 getFloatedWysiwygToolgroupId() {
Chris@4 194 return `quickedit-wysiwyg-floated-toolgroup-for-${this._id}`;
Chris@4 195 },
Chris@4 196
Chris@4 197 /**
Chris@4 198 * Retrieves the ID for this toolbar's main WYSIWYG toolgroup.
Chris@4 199 *
Chris@4 200 * Used to provide an abstraction for any WYSIWYG editor to plug in.
Chris@4 201 *
Chris@4 202 * @return {string}
Chris@4 203 * A string that can be used as the ID.
Chris@4 204 */
Chris@4 205 getMainWysiwygToolgroupId() {
Chris@4 206 return `quickedit-wysiwyg-main-toolgroup-for-${this._id}`;
Chris@4 207 },
Chris@4 208
Chris@4 209 /**
Chris@4 210 * Finds a toolgroup.
Chris@4 211 *
Chris@4 212 * @param {string} toolgroup
Chris@4 213 * A toolgroup name.
Chris@4 214 *
Chris@4 215 * @return {jQuery}
Chris@4 216 * The toolgroup element.
Chris@4 217 */
Chris@4 218 _find(toolgroup) {
Chris@4 219 return this.$el.find(`.quickedit-toolgroup.${toolgroup}`);
Chris@4 220 },
Chris@4 221
Chris@4 222 /**
Chris@4 223 * Shows a toolgroup.
Chris@4 224 *
Chris@4 225 * @param {string} toolgroup
Chris@4 226 * A toolgroup name.
Chris@4 227 */
Chris@4 228 show(toolgroup) {
Chris@4 229 const $group = this._find(toolgroup);
Chris@4 230 // Attach a transitionEnd event handler to the toolbar group so that
Chris@4 231 // update events can be triggered after the animations have ended.
Chris@4 232 $group.on(Drupal.quickedit.util.constants.transitionEnd, event => {
Chris@4 233 $group.off(Drupal.quickedit.util.constants.transitionEnd);
Chris@4 234 });
Chris@4 235 // The call to remove the class and start the animation must be started in
Chris@4 236 // the next animation frame or the event handler attached above won't be
Chris@4 237 // triggered.
Chris@4 238 window.setTimeout(() => {
Chris@4 239 $group.removeClass('quickedit-animate-invisible');
Chris@4 240 }, 0);
Chris@4 241 },
Chris@0 242 },
Chris@4 243 );
Chris@4 244 })(jQuery, _, Backbone, Drupal);