diff -u b/core/misc/tabledrag.es6.js b/core/misc/tabledrag.es6.js --- b/core/misc/tabledrag.es6.js +++ b/core/misc/tabledrag.es6.js @@ -510,7 +510,7 @@ // Up arrow. case 38: // Safari up arrow. - case 63232: + case 63232: { let $previousRow = $(self.rowObject.element).prev('tr:first-of-type'); let previousRow = $previousRow.get(0); while (previousRow && $previousRow.is(':hidden')) { @@ -549,7 +549,7 @@ handle.trigger('focus'); } break; - + } // Right arrow. case 39: // Safari right arrow. @@ -561,7 +561,7 @@ // Down arrow. case 40: // Safari down arrow. - case 63233: + case 63233: { let $nextRow = $(self.rowObject.group).eq(-1).next('tr:first-of-type'); let nextRow = $nextRow.get(0); while (nextRow && $nextRow.is(':hidden')) { @@ -599,6 +599,7 @@ handle.trigger('focus'); } break; + } } /* eslint-enable no-fallthrough */ @@ -1037,7 +1038,7 @@ targetElement.value = sourceElement.value; break; - case 'order': + case 'order': { const siblings = this.rowObject.findSiblings(rowSettings); if ($(targetElement).is('select')) { // Get a list of acceptable values. @@ -1067,6 +1068,7 @@ }); } break; + } } } }; diff -u b/core/misc/tabledrag.js b/core/misc/tabledrag.js --- b/core/misc/tabledrag.js +++ b/core/misc/tabledrag.js @@ -289,39 +289,41 @@ case 38: case 63232: - var $previousRow = $(self.rowObject.element).prev('tr:first-of-type'); - var previousRow = $previousRow.get(0); - while (previousRow && $previousRow.is(':hidden')) { - $previousRow = $(previousRow).prev('tr:first-of-type'); - previousRow = $previousRow.get(0); - } - if (previousRow) { - self.safeBlur = false; - self.rowObject.direction = 'up'; - keyChange = true; - - if ($(item).is('.tabledrag-root')) { - groupHeight = 0; - while (previousRow && $previousRow.find('.js-indentation').length) { - $previousRow = $(previousRow).prev('tr:first-of-type'); - previousRow = $previousRow.get(0); - groupHeight += $previousRow.is(':hidden') ? 0 : previousRow.offsetHeight; - } - if (previousRow) { + { + var $previousRow = $(self.rowObject.element).prev('tr:first-of-type'); + var previousRow = $previousRow.get(0); + while (previousRow && $previousRow.is(':hidden')) { + $previousRow = $(previousRow).prev('tr:first-of-type'); + previousRow = $previousRow.get(0); + } + if (previousRow) { + self.safeBlur = false; + self.rowObject.direction = 'up'; + keyChange = true; + + if ($(item).is('.tabledrag-root')) { + groupHeight = 0; + while (previousRow && $previousRow.find('.js-indentation').length) { + $previousRow = $(previousRow).prev('tr:first-of-type'); + previousRow = $previousRow.get(0); + groupHeight += $previousRow.is(':hidden') ? 0 : previousRow.offsetHeight; + } + if (previousRow) { + self.rowObject.swap('before', previousRow); + + window.scrollBy(0, -groupHeight); + } + } else if (self.table.tBodies[0].rows[0] !== previousRow || $previousRow.is('.draggable')) { self.rowObject.swap('before', previousRow); - - window.scrollBy(0, -groupHeight); + self.rowObject.interval = null; + self.rowObject.indent(0); + window.scrollBy(0, -parseInt(item.offsetHeight, 10)); } - } else if (self.table.tBodies[0].rows[0] !== previousRow || $previousRow.is('.draggable')) { - self.rowObject.swap('before', previousRow); - self.rowObject.interval = null; - self.rowObject.indent(0); - window.scrollBy(0, -parseInt(item.offsetHeight, 10)); - } - handle.trigger('focus'); + handle.trigger('focus'); + } + break; } - break; case 39: case 63235: @@ -331,39 +333,41 @@ case 40: case 63233: - var $nextRow = $(self.rowObject.group).eq(-1).next('tr:first-of-type'); - var nextRow = $nextRow.get(0); - while (nextRow && $nextRow.is(':hidden')) { - $nextRow = $(nextRow).next('tr:first-of-type'); - nextRow = $nextRow.get(0); - } - if (nextRow) { - self.safeBlur = false; - self.rowObject.direction = 'down'; - keyChange = true; - - if ($(item).is('.tabledrag-root')) { - groupHeight = 0; - var nextGroup = new self.row(nextRow, 'keyboard', self.indentEnabled, self.maxDepth, false); - if (nextGroup) { - $(nextGroup.group).each(function () { - groupHeight += $(this).is(':hidden') ? 0 : this.offsetHeight; - }); - var nextGroupRow = $(nextGroup.group).eq(-1).get(0); - self.rowObject.swap('after', nextGroupRow); + { + var $nextRow = $(self.rowObject.group).eq(-1).next('tr:first-of-type'); + var nextRow = $nextRow.get(0); + while (nextRow && $nextRow.is(':hidden')) { + $nextRow = $(nextRow).next('tr:first-of-type'); + nextRow = $nextRow.get(0); + } + if (nextRow) { + self.safeBlur = false; + self.rowObject.direction = 'down'; + keyChange = true; + + if ($(item).is('.tabledrag-root')) { + groupHeight = 0; + var nextGroup = new self.row(nextRow, 'keyboard', self.indentEnabled, self.maxDepth, false); + if (nextGroup) { + $(nextGroup.group).each(function () { + groupHeight += $(this).is(':hidden') ? 0 : this.offsetHeight; + }); + var nextGroupRow = $(nextGroup.group).eq(-1).get(0); + self.rowObject.swap('after', nextGroupRow); - window.scrollBy(0, parseInt(groupHeight, 10)); + window.scrollBy(0, parseInt(groupHeight, 10)); + } + } else { + self.rowObject.swap('after', nextRow); + self.rowObject.interval = null; + self.rowObject.indent(0); + window.scrollBy(0, parseInt(item.offsetHeight, 10)); } - } else { - self.rowObject.swap('after', nextRow); - self.rowObject.interval = null; - self.rowObject.indent(0); - window.scrollBy(0, parseInt(item.offsetHeight, 10)); - } - handle.trigger('focus'); + handle.trigger('focus'); + } + break; } - break; } if (self.rowObject && self.rowObject.changed === true) { @@ -658,29 +662,31 @@ break; case 'order': - var siblings = this.rowObject.findSiblings(rowSettings); - if ($(targetElement).is('select')) { - var values = []; - $(targetElement).find('option').each(function () { - values.push(this.value); - }); - var maxVal = values[values.length - 1]; - - $(siblings).find(targetClass).each(function () { - if (values.length > 0) { - this.value = values.shift(); - } else { - this.value = maxVal; - } - }); - } else { - var weight = parseInt($(siblings[0]).find(targetClass).val(), 10) || 0; - $(siblings).find(targetClass).each(function () { - this.value = weight; - weight++; - }); + { + var siblings = this.rowObject.findSiblings(rowSettings); + if ($(targetElement).is('select')) { + var values = []; + $(targetElement).find('option').each(function () { + values.push(this.value); + }); + var maxVal = values[values.length - 1]; + + $(siblings).find(targetClass).each(function () { + if (values.length > 0) { + this.value = values.shift(); + } else { + this.value = maxVal; + } + }); + } else { + var weight = parseInt($(siblings[0]).find(targetClass).val(), 10) || 0; + $(siblings).find(targetClass).each(function () { + this.value = weight; + weight++; + }); + } + break; } - break; } } }; diff -u b/core/misc/tableselect.es6.js b/core/misc/tableselect.es6.js --- b/core/misc/tableselect.es6.js +++ b/core/misc/tableselect.es6.js @@ -129,12 +129,11 @@ // Traverse through the sibling nodes. for (let i = from[mode]; i; i = i[mode]) { - let $i; + const $i = $(i); // Make sure that we're only dealing with elements. if (i.nodeType !== 1) { continue; } - $i = $(i); // Either add or remove the selected class based on the state of the // target checkbox. $i.toggleClass('selected', state); diff -u b/core/misc/tableselect.js b/core/misc/tableselect.js --- b/core/misc/tableselect.js +++ b/core/misc/tableselect.js @@ -74,12 +74,11 @@ var mode = from.rowIndex > to.rowIndex ? 'previousSibling' : 'nextSibling'; for (var i = from[mode]; i; i = i[mode]) { - var $i = void 0; + var $i = $(i); if (i.nodeType !== 1) { continue; } - $i = $(i); $i.toggleClass('selected', state); $i.find('input[type="checkbox"]').prop('checked', state); diff -u b/core/modules/editor/js/editor.formattedTextEditor.es6.js b/core/modules/editor/js/editor.formattedTextEditor.es6.js --- b/core/modules/editor/js/editor.formattedTextEditor.es6.js +++ b/core/modules/editor/js/editor.formattedTextEditor.es6.js @@ -140,7 +140,7 @@ } break; - case 'active': + case 'active': { const textElement = this.$textElement.get(0); const toolbarView = fieldModel.toolbarView; this.textEditor.attachInlineEditor( @@ -155,6 +155,7 @@ fieldModel.set('state', 'changed'); }); break; + } case 'changed': break; diff -u b/core/modules/image/js/editors/image.es6.js b/core/modules/image/js/editors/image.es6.js --- b/core/modules/image/js/editors/image.es6.js +++ b/core/modules/image/js/editors/image.es6.js @@ -70,7 +70,7 @@ }); break; - case 'active': + case 'active': { const self = this; // Indicate that this element is being edited by Quick Edit Image. @@ -117,6 +117,7 @@ this.renderToolbar(fieldModel); break; + } case 'changed': break; diff -u b/core/modules/quickedit/js/models/EntityModel.es6.js b/core/modules/quickedit/js/models/EntityModel.es6.js --- b/core/modules/quickedit/js/models/EntityModel.es6.js +++ b/core/modules/quickedit/js/models/EntityModel.es6.js @@ -189,7 +189,7 @@ this.set('isActive', true); break; - case 'committing': + case 'committing': { // The user indicated they want to save the entity. const fields = this.get('fields'); // For fields that are in an active state, transition them to @@ -207,8 +207,9 @@ fieldModel.set('state', 'saving'); }); break; + } - case 'deactivating': + case 'deactivating': { const changedFields = this.get('fields') .filter(fieldModel => _.intersection([fieldModel.get('state')], ['changed', 'invalid']).length); // If the entity contains unconfirmed or unsaved changes, return the @@ -250,6 +251,7 @@ }); } break; + } case 'closing': // Set all fields to the 'inactive' state. @@ -364,7 +366,7 @@ } break; - case 'committing': + case 'committing': { // If the field save returned a validation error, set the state of the // entity back to 'opened'. if (fieldState === 'invalid') { @@ -404,6 +406,7 @@ }); } break; + } case 'deactivating': // When setting the entity to 'closing', require that all fieldModels diff -u b/core/modules/quickedit/js/views/EditorView.es6.js b/core/modules/quickedit/js/views/EditorView.es6.js --- b/core/modules/quickedit/js/views/EditorView.es6.js +++ b/core/modules/quickedit/js/views/EditorView.es6.js @@ -118,7 +118,7 @@ // visible yet. break; - case 'activating': + case 'activating': { // The user has indicated he wants to do in-place editing: if // something needs to be loaded (CSS/JavaScript/server data/…), then // do so at this stage, and once the in-place editor is ready, @@ -132,6 +132,7 @@ fieldModel.set('state', 'active'); }); break; + } case 'active': // The user can now actually use the in-place editor. diff -u b/core/modules/quickedit/js/views/EntityToolbarView.es6.js b/core/modules/quickedit/js/views/EntityToolbarView.es6.js --- b/core/modules/quickedit/js/views/EntityToolbarView.es6.js +++ b/core/modules/quickedit/js/views/EntityToolbarView.es6.js @@ -230,7 +230,7 @@ delay = 250; break; - default: + default: { const fieldModels = this.model.get('fields').models; let topMostPosition = 1000000; let topMostField = null; @@ -245,6 +245,7 @@ of = topMostField.get('el'); delay = 50; break; + } } // Prepare to check the next possible element to position against. check++; only in patch2: unchanged: --- a/composer.json +++ b/composer.json @@ -5,7 +5,8 @@ "license": "GPL-2.0+", "require": { "composer/installers": "^1.0.24", - "wikimedia/composer-merge-plugin": "^1.4" + "wikimedia/composer-merge-plugin": "^1.4", + "drupal/jsonapi": "^1.3" }, "replace": { "drupal/core": "^8.5" only in patch2: unchanged: --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "97de1708c79f6205a295cfc9808c0c72", + "content-hash": "2fdbff82cf3c865c64db8c4d27421c34", "packages": [ { "name": "asm89/stack-cors", @@ -636,6 +636,68 @@ "time": "2014-09-09T13:34:57+00:00" }, { + "name": "drupal/jsonapi", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://git.drupal.org/project/jsonapi", + "reference": "8.x-1.3" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/jsonapi-8.x-1.3.zip", + "reference": "8.x-1.3", + "shasum": "cd3df010a305097e8fee08a2d1777bd6ad58c64a" + }, + "require": { + "drupal/core": "^8.2" + }, + "require-dev": { + "justinrainbow/json-schema": "^4.1" + }, + "type": "drupal-module", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + }, + "drupal": { + "version": "8.x-1.3", + "datestamp": "1505680144", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "notification-url": "https://packages.drupal.org/8/downloads", + "license": [ + "GPL-2.0+" + ], + "authors": [ + { + "name": "Wim Leers", + "homepage": "https://www.drupal.org/user/99777" + }, + { + "name": "dawehner", + "homepage": "https://www.drupal.org/user/99340" + }, + { + "name": "e0ipso", + "homepage": "https://www.drupal.org/user/550110" + }, + { + "name": "gabesullice", + "homepage": "https://www.drupal.org/user/2287430" + } + ], + "description": "Provides a JSON API standards-compliant API for accessing and manipulating Drupal content and configuration entities.", + "homepage": "https://www.drupal.org/project/jsonapi", + "support": { + "source": "http://cgit.drupalcode.org/jsonapi" + } + }, + { "name": "easyrdf/easyrdf", "version": "0.9.1", "source": { only in patch2: unchanged: --- a/core/modules/editor/js/editor.formattedTextEditor.js +++ b/core/modules/editor/js/editor.formattedTextEditor.js @@ -73,15 +73,17 @@ break; case 'active': - var textElement = this.$textElement.get(0); - var toolbarView = fieldModel.toolbarView; - this.textEditor.attachInlineEditor(textElement, this.textFormat, toolbarView.getMainWysiwygToolgroupId(), toolbarView.getFloatedWysiwygToolgroupId()); - - this.textEditor.onChange(textElement, function (htmlText) { - editorModel.set('currentValue', htmlText); - fieldModel.set('state', 'changed'); - }); - break; + { + var textElement = this.$textElement.get(0); + var toolbarView = fieldModel.toolbarView; + this.textEditor.attachInlineEditor(textElement, this.textFormat, toolbarView.getMainWysiwygToolgroupId(), toolbarView.getFloatedWysiwygToolgroupId()); + + this.textEditor.onChange(textElement, function (htmlText) { + editorModel.set('currentValue', htmlText); + fieldModel.set('state', 'changed'); + }); + break; + } case 'changed': break; only in patch2: unchanged: --- a/core/modules/image/js/editors/image.js +++ b/core/modules/image/js/editors/image.js @@ -50,41 +50,43 @@ break; case 'active': - var self = this; + { + var self = this; - this.$el.addClass('quickedit-image-element'); + this.$el.addClass('quickedit-image-element'); - var $dropzone = this.renderDropzone('upload', Drupal.t('Drop file here or click to upload')); + var $dropzone = this.renderDropzone('upload', Drupal.t('Drop file here or click to upload')); - $dropzone.on('dragenter', function (e) { - $(this).addClass('hover'); - }); - $dropzone.on('dragleave', function (e) { - $(this).removeClass('hover'); - }); - - $dropzone.on('drop', function (e) { - if (e.originalEvent.dataTransfer && e.originalEvent.dataTransfer.files.length) { + $dropzone.on('dragenter', function (e) { + $(this).addClass('hover'); + }); + $dropzone.on('dragleave', function (e) { $(this).removeClass('hover'); - self.uploadImage(e.originalEvent.dataTransfer.files[0]); - } - }); + }); - $dropzone.on('click', function (e) { - $('').trigger('click').on('change', function () { - if (this.files.length) { - self.uploadImage(this.files[0]); + $dropzone.on('drop', function (e) { + if (e.originalEvent.dataTransfer && e.originalEvent.dataTransfer.files.length) { + $(this).removeClass('hover'); + self.uploadImage(e.originalEvent.dataTransfer.files[0]); } }); - }); - $dropzone.on('dragover dragenter dragleave drop click', function (e) { - e.preventDefault(); - e.stopPropagation(); - }); + $dropzone.on('click', function (e) { + $('').trigger('click').on('change', function () { + if (this.files.length) { + self.uploadImage(this.files[0]); + } + }); + }); - this.renderToolbar(fieldModel); - break; + $dropzone.on('dragover dragenter dragleave drop click', function (e) { + e.preventDefault(); + e.stopPropagation(); + }); + + this.renderToolbar(fieldModel); + break; + } case 'changed': break; only in patch2: unchanged: --- a/core/modules/quickedit/js/models/EntityModel.js +++ b/core/modules/quickedit/js/models/EntityModel.js @@ -69,48 +69,52 @@ break; case 'committing': - var fields = this.get('fields'); + { + var fields = this.get('fields'); - fields.chain().filter(function (fieldModel) { - return _.intersection([fieldModel.get('state')], ['active']).length; - }).each(function (fieldModel) { - fieldModel.set('state', 'candidate'); - }); + fields.chain().filter(function (fieldModel) { + return _.intersection([fieldModel.get('state')], ['active']).length; + }).each(function (fieldModel) { + fieldModel.set('state', 'candidate'); + }); - fields.chain().filter(function (fieldModel) { - return _.intersection([fieldModel.get('state')], Drupal.quickedit.app.changedFieldStates).length; - }).each(function (fieldModel) { - fieldModel.set('state', 'saving'); - }); - break; + fields.chain().filter(function (fieldModel) { + return _.intersection([fieldModel.get('state')], Drupal.quickedit.app.changedFieldStates).length; + }).each(function (fieldModel) { + fieldModel.set('state', 'saving'); + }); + break; + } case 'deactivating': - var changedFields = this.get('fields').filter(function (fieldModel) { - return _.intersection([fieldModel.get('state')], ['changed', 'invalid']).length; - }); - - if ((changedFields.length || this.get('fieldsInTempStore').length) && !options.saved && !options.confirmed) { - this.set('state', 'opened', { confirming: true }); - - _.defer(function () { - Drupal.quickedit.app.confirmEntityDeactivation(entityModel); + { + var changedFields = this.get('fields').filter(function (fieldModel) { + return _.intersection([fieldModel.get('state')], ['changed', 'invalid']).length; }); - } else { - var invalidFields = this.get('fields').filter(function (fieldModel) { - return _.intersection([fieldModel.get('state')], ['invalid']).length; - }); - - entityModel.set('reload', this.get('fieldsInTempStore').length || invalidFields.length); - entityModel.get('fields').each(function (fieldModel) { - if (_.intersection([fieldModel.get('state')], ['candidate', 'highlighted']).length) { - fieldModel.trigger('change:state', fieldModel, fieldModel.get('state'), options); - } else { - fieldModel.set('state', 'candidate', options); - } - }); + if ((changedFields.length || this.get('fieldsInTempStore').length) && !options.saved && !options.confirmed) { + this.set('state', 'opened', { confirming: true }); + + _.defer(function () { + Drupal.quickedit.app.confirmEntityDeactivation(entityModel); + }); + } else { + var invalidFields = this.get('fields').filter(function (fieldModel) { + return _.intersection([fieldModel.get('state')], ['invalid']).length; + }); + + entityModel.set('reload', this.get('fieldsInTempStore').length || invalidFields.length); + + entityModel.get('fields').each(function (fieldModel) { + if (_.intersection([fieldModel.get('state')], ['candidate', 'highlighted']).length) { + fieldModel.trigger('change:state', fieldModel, fieldModel.get('state'), options); + } else { + fieldModel.set('state', 'candidate', options); + } + }); + } + break; } - break; case 'closing': options.reason = 'stop'; @@ -166,36 +170,38 @@ break; case 'committing': - if (fieldState === 'invalid') { - _.defer(function () { - entityModel.set('state', 'opened', { reason: 'invalid' }); - }); - } else { - this._updateInTempStoreAttributes(entityModel, fieldModel); - } - - var options = { - 'accept-field-states': Drupal.quickedit.app.readyFieldStates - }; - if (entityModel.set('isCommitting', true, options)) { - entityModel.save({ - success: function success() { - entityModel.set({ - state: 'deactivating', - isCommitting: false - }, { saved: true }); - }, - error: function error() { - entityModel.set('isCommitting', false); - - entityModel.set('state', 'opened', { reason: 'networkerror' }); - - var message = Drupal.t('Your changes to @entity-title could not be saved, either due to a website problem or a network connection problem.
Please try again.', { '@entity-title': entityModel.get('label') }); - Drupal.quickedit.util.networkErrorModal(Drupal.t('Network problem!'), message); - } - }); + { + if (fieldState === 'invalid') { + _.defer(function () { + entityModel.set('state', 'opened', { reason: 'invalid' }); + }); + } else { + this._updateInTempStoreAttributes(entityModel, fieldModel); + } + + var options = { + 'accept-field-states': Drupal.quickedit.app.readyFieldStates + }; + if (entityModel.set('isCommitting', true, options)) { + entityModel.save({ + success: function success() { + entityModel.set({ + state: 'deactivating', + isCommitting: false + }, { saved: true }); + }, + error: function error() { + entityModel.set('isCommitting', false); + + entityModel.set('state', 'opened', { reason: 'networkerror' }); + + var message = Drupal.t('Your changes to @entity-title could not be saved, either due to a website problem or a network connection problem.
Please try again.', { '@entity-title': entityModel.get('label') }); + Drupal.quickedit.util.networkErrorModal(Drupal.t('Network problem!'), message); + } + }); + } + break; } - break; case 'deactivating': _.defer(function () { only in patch2: unchanged: --- a/core/modules/quickedit/js/views/EditorView.js +++ b/core/modules/quickedit/js/views/EditorView.js @@ -38,13 +38,15 @@ break; case 'activating': - var loadDependencies = function loadDependencies(callback) { - callback(); - }; - loadDependencies(function () { - fieldModel.set('state', 'active'); - }); - break; + { + var loadDependencies = function loadDependencies(callback) { + callback(); + }; + loadDependencies(function () { + fieldModel.set('state', 'active'); + }); + break; + } case 'active': break; only in patch2: unchanged: --- a/core/modules/quickedit/js/views/EntityToolbarView.js +++ b/core/modules/quickedit/js/views/EntityToolbarView.js @@ -142,20 +142,22 @@ break; default: - var fieldModels = this.model.get('fields').models; - var topMostPosition = 1000000; - var topMostField = null; - - for (var i = 0; i < fieldModels.length; i++) { - var pos = fieldModels[i].get('el').getBoundingClientRect().top; - if (pos < topMostPosition) { - topMostPosition = pos; - topMostField = fieldModels[i]; + { + var fieldModels = this.model.get('fields').models; + var topMostPosition = 1000000; + var topMostField = null; + + for (var i = 0; i < fieldModels.length; i++) { + var pos = fieldModels[i].get('el').getBoundingClientRect().top; + if (pos < topMostPosition) { + topMostPosition = pos; + topMostField = fieldModels[i]; + } } + of = topMostField.get('el'); + delay = 50; + break; } - of = topMostField.get('el'); - delay = 50; - break; } check++;