2 * DO NOT EDIT THIS FILE.
3 * See the following change record for more information,
4 * https://www.drupal.org/node/2815083
8 (function ($, _, Backbone, Drupal, debounce) {
9 Drupal.quickedit.EntityToolbarView = Backbone.View.extend({
10 _fieldToolbarRoot: null,
12 events: function events() {
14 'click button.action-save': 'onClickSave',
15 'click button.action-cancel': 'onClickCancel',
16 mouseenter: 'onMouseenter'
20 initialize: function initialize(options) {
22 this.appModel = options.appModel;
23 this.$entity = $(this.model.get('el'));
25 this.listenTo(this.model, 'change:isActive change:isDirty change:state', this.render);
27 this.listenTo(this.appModel, 'change:highlightedField change:activeField', this.render);
29 this.listenTo(this.model.get('fields'), 'change:state', this.fieldStateChange);
31 $(window).on('resize.quickedit scroll.quickedit drupalViewportOffsetChange.quickedit', debounce($.proxy(this.windowChangeHandler, this), 150));
33 $(document).on('drupalViewportOffsetChange.quickedit', function (event, offsets) {
35 that.$fence.css(offsets);
39 var $toolbar = this.buildToolbarEl();
40 this.setElement($toolbar);
41 this._fieldToolbarRoot = $toolbar.find('.quickedit-toolbar-field').get(0);
45 render: function render() {
46 if (this.model.get('isActive')) {
47 var $body = $('body');
48 if ($body.children('#quickedit-entity-toolbar').length === 0) {
49 $body.append(this.$el);
52 if ($body.children('#quickedit-toolbar-fence').length === 0) {
53 this.$fence = $(Drupal.theme('quickeditEntityToolbarFence')).css(Drupal.displace()).appendTo($body);
63 var $button = this.$el.find('.quickedit-button.action-save');
64 var isDirty = this.model.get('isDirty');
66 switch (this.model.get('state')) {
68 $button.removeClass('action-saving icon-throbber icon-end').text(Drupal.t('Save')).removeAttr('disabled').attr('aria-hidden', !isDirty);
72 $button.addClass('action-saving icon-throbber icon-end').text(Drupal.t('Saving')).attr('disabled', 'disabled');
76 $button.attr('aria-hidden', true);
82 remove: function remove() {
85 $(window).off('resize.quickedit scroll.quickedit drupalViewportOffsetChange.quickedit');
86 $(document).off('drupalViewportOffsetChange.quickedit');
88 Backbone.View.prototype.remove.call(this);
90 windowChangeHandler: function windowChangeHandler(event) {
93 fieldStateChange: function fieldStateChange(model, state) {
104 position: function position(element) {
105 clearTimeout(this.timer);
109 var edge = document.documentElement.dir === 'rtl' ? 'right' : 'left';
115 var horizontalPadding = 0;
117 var activeField = void 0;
118 var highlightedField = void 0;
127 activeField = Drupal.quickedit.app.model.get('activeField');
128 of = activeField && activeField.editorView && activeField.editorView.$formContainer && activeField.editorView.$formContainer.find('.quickedit-form');
132 of = activeField && activeField.editorView && activeField.editorView.getEditedElement();
133 if (activeField && activeField.editorView && activeField.editorView.getQuickEditUISettings().padding) {
134 horizontalPadding = 5;
139 highlightedField = Drupal.quickedit.app.model.get('highlightedField');
140 of = highlightedField && highlightedField.editorView && highlightedField.editorView.getEditedElement();
145 var fieldModels = this.model.get('fields').models;
146 var topMostPosition = 1000000;
147 var topMostField = null;
149 for (var i = 0; i < fieldModels.length; i++) {
150 var pos = fieldModels[i].get('el').getBoundingClientRect().top;
151 if (pos < topMostPosition) {
152 topMostPosition = pos;
153 topMostField = fieldModels[i];
156 of = topMostField.get('el');
164 function refinePosition(view, suggested, info) {
165 var isBelow = suggested.top > info.target.top;
166 info.element.element.toggleClass('quickedit-toolbar-pointer-top', isBelow);
168 if (view.$entity[0] === info.target.element[0]) {
169 var $field = view.$entity.find('.quickedit-editable').eq(isBelow ? -1 : 0);
170 if ($field.length > 0) {
171 suggested.top = isBelow ? $field.offset().top + $field.outerHeight(true) : $field.offset().top - info.element.element.outerHeight(true);
175 var fenceTop = view.$fence.offset().top;
176 var fenceHeight = view.$fence.height();
177 var toolbarHeight = info.element.element.outerHeight(true);
178 if (suggested.top < fenceTop) {
179 suggested.top = fenceTop;
180 } else if (suggested.top + toolbarHeight > fenceTop + fenceHeight) {
181 suggested.top = fenceTop + fenceHeight - toolbarHeight;
184 info.element.element.css({
185 left: Math.floor(suggested.left),
186 top: Math.floor(suggested.top)
190 function positionToolbar() {
192 my: edge + ' bottom',
194 at: edge + '+' + (1 + horizontalPadding) + ' top',
196 collision: 'flipfit',
197 using: refinePosition.bind(null, that),
200 'max-width': document.documentElement.clientWidth < 450 ? document.documentElement.clientWidth : 450,
202 'min-width': document.documentElement.clientWidth < 240 ? document.documentElement.clientWidth : 240,
207 this.timer = setTimeout(function () {
208 _.defer(positionToolbar);
211 onClickSave: function onClickSave(event) {
212 event.stopPropagation();
213 event.preventDefault();
215 this.model.set('state', 'committing');
217 onClickCancel: function onClickCancel(event) {
218 event.preventDefault();
219 this.model.set('state', 'deactivating');
221 onMouseenter: function onMouseenter(event) {
222 clearTimeout(this.timer);
224 buildToolbarEl: function buildToolbarEl() {
225 var $toolbar = $(Drupal.theme('quickeditEntityToolbar', {
226 id: 'quickedit-entity-toolbar'
229 $toolbar.find('.quickedit-toolbar-entity').prepend(Drupal.theme('quickeditToolgroup', {
232 label: Drupal.t('Save'),
234 classes: 'action-save quickedit-button icon',
239 label: Drupal.t('Close'),
240 classes: 'action-cancel quickedit-button icon icon-close icon-only'
245 left: this.$entity.offset().left,
246 top: this.$entity.offset().top
251 getToolbarRoot: function getToolbarRoot() {
252 return this._fieldToolbarRoot;
254 label: function label() {
256 var entityLabel = this.model.get('label');
258 var activeField = Drupal.quickedit.app.model.get('activeField');
259 var activeFieldLabel = activeField && activeField.get('metadata').label;
261 var highlightedField = Drupal.quickedit.app.model.get('highlightedField');
262 var highlightedFieldLabel = highlightedField && highlightedField.get('metadata').label;
264 if (activeFieldLabel) {
265 label = Drupal.theme('quickeditEntityToolbarLabel', {
266 entityLabel: entityLabel,
267 fieldLabel: activeFieldLabel
269 } else if (highlightedFieldLabel) {
270 label = Drupal.theme('quickeditEntityToolbarLabel', {
271 entityLabel: entityLabel,
272 fieldLabel: highlightedFieldLabel
275 label = Drupal.checkPlain(entityLabel);
278 this.$el.find('.quickedit-toolbar-label').html(label);
280 addClass: function addClass(toolgroup, classes) {
281 this._find(toolgroup).addClass(classes);
283 removeClass: function removeClass(toolgroup, classes) {
284 this._find(toolgroup).removeClass(classes);
286 _find: function _find(toolgroup) {
287 return this.$el.find('.quickedit-toolbar .quickedit-toolgroup.' + toolgroup);
289 show: function show(toolgroup) {
290 this.$el.removeClass('quickedit-animate-invisible');
293 })(jQuery, _, Backbone, Drupal, Drupal.debounce);