Mercurial > hg > cmmr2012-drupal-site
diff core/modules/quickedit/js/views/AppView.js @ 0:c75dbcec494b
Initial commit from drush-created site
author | Chris Cannam |
---|---|
date | Thu, 05 Jul 2018 14:24:15 +0000 |
parents | |
children | a9cd425dd02b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/modules/quickedit/js/views/AppView.js Thu Jul 05 14:24:15 2018 +0000 @@ -0,0 +1,318 @@ +/** +* DO NOT EDIT THIS FILE. +* See the following change record for more information, +* https://www.drupal.org/node/2815083 +* @preserve +**/ + +(function ($, _, Backbone, Drupal) { + var reload = false; + + Drupal.quickedit.AppView = Backbone.View.extend({ + initialize: function initialize(options) { + this.activeFieldStates = ['activating', 'active']; + this.singleFieldStates = ['highlighted', 'activating', 'active']; + this.changedFieldStates = ['changed', 'saving', 'saved', 'invalid']; + this.readyFieldStates = ['candidate', 'highlighted']; + + this.listenTo(options.entitiesCollection, 'change:state', this.appStateChange); + this.listenTo(options.entitiesCollection, 'change:isActive', this.enforceSingleActiveEntity); + + this.listenTo(options.fieldsCollection, 'change:state', this.editorStateChange); + + this.listenTo(options.fieldsCollection, 'change:html', this.renderUpdatedField); + this.listenTo(options.fieldsCollection, 'change:html', this.propagateUpdatedField); + + this.listenTo(options.fieldsCollection, 'add', this.rerenderedFieldToCandidate); + + this.listenTo(options.fieldsCollection, 'destroy', this.teardownEditor); + }, + appStateChange: function appStateChange(entityModel, state) { + var app = this; + var entityToolbarView = void 0; + switch (state) { + case 'launching': + reload = false; + + entityToolbarView = new Drupal.quickedit.EntityToolbarView({ + model: entityModel, + appModel: this.model + }); + entityModel.toolbarView = entityToolbarView; + + entityModel.get('fields').each(function (fieldModel) { + app.setupEditor(fieldModel); + }); + + _.defer(function () { + entityModel.set('state', 'opening'); + }); + break; + + case 'closed': + entityToolbarView = entityModel.toolbarView; + + entityModel.get('fields').each(function (fieldModel) { + app.teardownEditor(fieldModel); + }); + + if (entityToolbarView) { + entityToolbarView.remove(); + delete entityModel.toolbarView; + } + + if (reload) { + reload = false; + location.reload(); + } + break; + } + }, + acceptEditorStateChange: function acceptEditorStateChange(from, to, context, fieldModel) { + var accept = true; + + if (context && (context.reason === 'stop' || context.reason === 'rerender')) { + if (from === 'candidate' && to === 'inactive') { + accept = true; + } + } else { + if (!Drupal.quickedit.FieldModel.followsStateSequence(from, to)) { + accept = false; + + if (_.indexOf(this.activeFieldStates, from) !== -1 && to === 'candidate') { + accept = true; + } else if ((from === 'changed' || from === 'invalid') && to === 'candidate') { + accept = true; + } else if (from === 'highlighted' && to === 'candidate') { + accept = true; + } else if (from === 'saved' && to === 'candidate') { + accept = true; + } else if (from === 'invalid' && to === 'saving') { + accept = true; + } else if (from === 'invalid' && to === 'activating') { + accept = true; + } + } + + if (accept) { + var activeField = void 0; + var activeFieldState = void 0; + + if ((this.readyFieldStates.indexOf(from) !== -1 || from === 'invalid') && this.activeFieldStates.indexOf(to) !== -1) { + activeField = this.model.get('activeField'); + if (activeField && activeField !== fieldModel) { + activeFieldState = activeField.get('state'); + + if (this.activeFieldStates.indexOf(activeFieldState) !== -1) { + activeField.set('state', 'candidate'); + } else if (activeFieldState === 'changed' || activeFieldState === 'invalid') { + activeField.set('state', 'saving'); + } + + if (from === 'invalid') { + this.model.set('activeField', fieldModel); + accept = false; + } + } + } else if (_.indexOf(this.activeFieldStates, from) !== -1 && to === 'candidate') { + if (context && context.reason === 'mouseleave') { + accept = false; + } + } else if ((from === 'changed' || from === 'invalid') && to === 'candidate') { + if (context && context.reason === 'mouseleave') { + accept = false; + } else if (context && context.confirmed) { + accept = true; + } + } + } + } + + return accept; + }, + setupEditor: function setupEditor(fieldModel) { + var entityModel = fieldModel.get('entity'); + var entityToolbarView = entityModel.toolbarView; + + var fieldToolbarRoot = entityToolbarView.getToolbarRoot(); + + var editorName = fieldModel.get('metadata').editor; + var editorModel = new Drupal.quickedit.EditorModel(); + var editorView = new Drupal.quickedit.editors[editorName]({ + el: $(fieldModel.get('el')), + model: editorModel, + fieldModel: fieldModel + }); + + var toolbarView = new Drupal.quickedit.FieldToolbarView({ + el: fieldToolbarRoot, + model: fieldModel, + $editedElement: $(editorView.getEditedElement()), + editorView: editorView, + entityModel: entityModel + }); + + var decorationView = new Drupal.quickedit.FieldDecorationView({ + el: $(editorView.getEditedElement()), + model: fieldModel, + editorView: editorView + }); + + fieldModel.editorView = editorView; + fieldModel.toolbarView = toolbarView; + fieldModel.decorationView = decorationView; + }, + teardownEditor: function teardownEditor(fieldModel) { + if (typeof fieldModel.editorView === 'undefined') { + return; + } + + fieldModel.toolbarView.remove(); + delete fieldModel.toolbarView; + + fieldModel.decorationView.remove(); + delete fieldModel.decorationView; + + fieldModel.editorView.remove(); + delete fieldModel.editorView; + }, + confirmEntityDeactivation: function confirmEntityDeactivation(entityModel) { + var that = this; + var discardDialog = void 0; + + function closeDiscardDialog(action) { + discardDialog.close(action); + + that.model.set('activeModal', null); + + if (action === 'save') { + entityModel.set('state', 'committing', { confirmed: true }); + } else { + entityModel.set('state', 'deactivating', { confirmed: true }); + + if (entityModel.get('reload')) { + reload = true; + entityModel.set('reload', false); + } + } + } + + if (!this.model.get('activeModal')) { + var $unsavedChanges = $('<div>' + Drupal.t('You have unsaved changes') + '</div>'); + discardDialog = Drupal.dialog($unsavedChanges.get(0), { + title: Drupal.t('Discard changes?'), + dialogClass: 'quickedit-discard-modal', + resizable: false, + buttons: [{ + text: Drupal.t('Save'), + click: function click() { + closeDiscardDialog('save'); + }, + + primary: true + }, { + text: Drupal.t('Discard changes'), + click: function click() { + closeDiscardDialog('discard'); + } + }], + + closeOnEscape: false, + create: function create() { + $(this).parent().find('.ui-dialog-titlebar-close').remove(); + }, + + beforeClose: false, + close: function close(event) { + $(event.target).remove(); + } + }); + this.model.set('activeModal', discardDialog); + + discardDialog.showModal(); + } + }, + editorStateChange: function editorStateChange(fieldModel, state) { + var from = fieldModel.previous('state'); + var to = state; + + if (_.indexOf(this.singleFieldStates, to) !== -1 && this.model.get('highlightedField') !== fieldModel) { + this.model.set('highlightedField', fieldModel); + } else if (this.model.get('highlightedField') === fieldModel && to === 'candidate') { + this.model.set('highlightedField', null); + } + + if (_.indexOf(this.activeFieldStates, to) !== -1 && this.model.get('activeField') !== fieldModel) { + this.model.set('activeField', fieldModel); + } else if (this.model.get('activeField') === fieldModel && to === 'candidate') { + if (from === 'changed' || from === 'invalid') { + fieldModel.editorView.revert(); + } + this.model.set('activeField', null); + } + }, + renderUpdatedField: function renderUpdatedField(fieldModel, html, options) { + var $fieldWrapper = $(fieldModel.get('el')); + var $context = $fieldWrapper.parent(); + + var renderField = function renderField() { + fieldModel.destroy(); + + $fieldWrapper.replaceWith(html); + + Drupal.attachBehaviors($context.get(0)); + }; + + if (!options.propagation) { + _.defer(function () { + fieldModel.set('state', 'candidate'); + + _.defer(function () { + fieldModel.set('state', 'inactive', { reason: 'rerender' }); + + renderField(); + }); + }); + } else { + renderField(); + } + }, + propagateUpdatedField: function propagateUpdatedField(updatedField, html, options) { + if (options.propagation) { + return; + } + + var htmlForOtherViewModes = updatedField.get('htmlForOtherViewModes'); + Drupal.quickedit.collections.fields.where({ logicalFieldID: updatedField.get('logicalFieldID') }).forEach(function (field) { + if (field === updatedField) {} else if (field.getViewMode() === updatedField.getViewMode()) { + field.set('html', updatedField.get('html')); + } else if (field.getViewMode() in htmlForOtherViewModes) { + field.set('html', htmlForOtherViewModes[field.getViewMode()], { propagation: true }); + } + }); + }, + rerenderedFieldToCandidate: function rerenderedFieldToCandidate(fieldModel) { + var activeEntity = Drupal.quickedit.collections.entities.findWhere({ isActive: true }); + + if (!activeEntity) { + return; + } + + if (fieldModel.get('entity') === activeEntity) { + this.setupEditor(fieldModel); + fieldModel.set('state', 'candidate'); + } + }, + enforceSingleActiveEntity: function enforceSingleActiveEntity(changedEntityModel) { + if (changedEntityModel.get('isActive') === false) { + return; + } + + changedEntityModel.collection.chain().filter(function (entityModel) { + return entityModel.get('isActive') === true && entityModel !== changedEntityModel; + }).each(function (entityModel) { + entityModel.set('state', 'deactivating'); + }); + } + }); +})(jQuery, _, Backbone, Drupal); \ No newline at end of file