diff --git a/assets/js/src/newsletter_editor/blocks/base.js b/assets/js/src/newsletter_editor/blocks/base.js index fa05c66020..930c6472c2 100644 --- a/assets/js/src/newsletter_editor/blocks/base.js +++ b/assets/js/src/newsletter_editor/blocks/base.js @@ -22,6 +22,7 @@ define([ stale: [], // Attributes to be removed upon saving initialize: function initialize() { this.on('change', function onChange() { + this._updateDefaults(); App.getChannel().trigger('autoSave'); }); }, @@ -39,6 +40,9 @@ define([ // TODO: Investigate for a better solution return JSON.parse(JSON.stringify(jQuery.extend(blockDefaults, defaults || {}))); }, + _updateDefaults: function updateDefaults() { + App.getConfig().set('blockDefaults.' + this.get('type'), this.toJSON()); + }, toJSON: function toJSON() { // Remove stale attributes from resulting JSON object return _.omit(SuperModel.prototype.toJSON.call(this), this.stale); diff --git a/tests/javascript/newsletter_editor/blocks/button.spec.js b/tests/javascript/newsletter_editor/blocks/button.spec.js index 952b0d4b15..8157d1fabc 100644 --- a/tests/javascript/newsletter_editor/blocks/button.spec.js +++ b/tests/javascript/newsletter_editor/blocks/button.spec.js @@ -6,6 +6,7 @@ define([ 'newsletter_editor/blocks/button' ], function (App, ButtonBlock) { var EditorApplication = App; + var sandbox; describe('Button', function () { describe('model', function () { @@ -17,12 +18,14 @@ define([ blockDefaults: {} }); model = new (ButtonBlock.ButtonBlockModel)(); + sandbox = sinon.sandbox.create(); }); afterEach(function () { if (EditorApplication.getChannel) { delete EditorApplication.getChannel; } + sandbox.restore(); }); it('has a button type', function () { @@ -107,6 +110,14 @@ define([ mock.verify(); }); + it('updates blockDefaults.button when changed', function () { + var stub = sandbox.stub(EditorApplication.getConfig(), 'set'); + model.trigger('change'); + expect(stub.callCount).to.equal(1); + expect(stub.getCall(0).args[0]).to.equal('blockDefaults.button'); + expect(stub.getCall(0).args[1]).to.deep.equal(model.toJSON()); + }); + it('uses defaults from config when they are set', function () { global.stubConfig(EditorApplication, { blockDefaults: { diff --git a/tests/javascript/newsletter_editor/blocks/divider.spec.js b/tests/javascript/newsletter_editor/blocks/divider.spec.js index 24da961ae2..054c8ab593 100644 --- a/tests/javascript/newsletter_editor/blocks/divider.spec.js +++ b/tests/javascript/newsletter_editor/blocks/divider.spec.js @@ -6,6 +6,7 @@ define([ 'newsletter_editor/blocks/divider' ], function (App, DividerBlock) { var EditorApplication = App; + var sandbox; describe('Divider', function () { describe('model', function () { @@ -18,10 +19,12 @@ define([ }); global.stubAvailableStyles(EditorApplication); model = new (DividerBlock.DividerBlockModel)(); + sandbox = sinon.sandbox.create(); }); afterEach(function () { delete EditorApplication.getChannel; + sandbox.restore(); }); it('has a divider type', function () { @@ -94,6 +97,14 @@ define([ expect(innerModel.get('styles.block.borderWidth')).to.equal('7px'); expect(innerModel.get('styles.block.borderColor')).to.equal('#345678'); }); + + it('updates blockDefaults.divider when changed', function () { + var stub = sandbox.stub(EditorApplication.getConfig(), 'set'); + model.trigger('change'); + expect(stub.callCount).to.equal(1); + expect(stub.getCall(0).args[0]).to.equal('blockDefaults.divider'); + expect(stub.getCall(0).args[1]).to.deep.equal(model.toJSON()); + }); }); describe('block view', function () { diff --git a/tests/javascript/newsletter_editor/blocks/footer.spec.js b/tests/javascript/newsletter_editor/blocks/footer.spec.js index 9067a0cef1..0be258173d 100644 --- a/tests/javascript/newsletter_editor/blocks/footer.spec.js +++ b/tests/javascript/newsletter_editor/blocks/footer.spec.js @@ -10,12 +10,18 @@ define([ describe('Footer', function () { describe('model', function () { var model; + var sandbox; beforeEach(function () { global.stubChannel(EditorApplication); global.stubConfig(EditorApplication, { blockDefaults: {} }); model = new (FooterBlock.FooterBlockModel)(); + sandbox = sinon.sandbox.create(); + }); + + afterEach(function () { + sandbox.restore(); }); it('has a footer type', function () { @@ -113,6 +119,14 @@ define([ expect(innerModel.get('styles.link.fontColor')).to.equal('#345678'); expect(innerModel.get('styles.link.textDecoration')).to.equal('underline'); }); + + it('updates blockDefaults.footer when changed', function () { + var stub = sandbox.stub(EditorApplication.getConfig(), 'set'); + model.trigger('change'); + expect(stub.callCount).to.equal(1); + expect(stub.getCall(0).args[0]).to.equal('blockDefaults.footer'); + expect(stub.getCall(0).args[1]).to.deep.equal(model.toJSON()); + }); }); describe('block view', function () { diff --git a/tests/javascript/newsletter_editor/blocks/header.spec.js b/tests/javascript/newsletter_editor/blocks/header.spec.js index b540a4788d..b4c7e62da9 100644 --- a/tests/javascript/newsletter_editor/blocks/header.spec.js +++ b/tests/javascript/newsletter_editor/blocks/header.spec.js @@ -10,12 +10,17 @@ define([ describe('Header', function () { describe('model', function () { var model; + var sandbox; beforeEach(function () { global.stubChannel(EditorApplication); global.stubConfig(EditorApplication, { blockDefaults: {} }); model = new (HeaderBlock.HeaderBlockModel)(); + sandbox = sinon.sandbox.create(); + }); + afterEach(function () { + sandbox.restore(); }); it('has a header type', function () { @@ -113,6 +118,14 @@ define([ expect(innerModel.get('styles.link.fontColor')).to.equal('#345678'); expect(innerModel.get('styles.link.textDecoration')).to.equal('underline'); }); + + it('updates blockDefaults.header when changed', function () { + var stub = sandbox.stub(EditorApplication.getConfig(), 'set'); + model.trigger('change'); + expect(stub.callCount).to.equal(1); + expect(stub.getCall(0).args[0]).to.equal('blockDefaults.header'); + expect(stub.getCall(0).args[1]).to.deep.equal(model.toJSON()); + }); }); describe('block view', function () { diff --git a/tests/javascript/newsletter_editor/blocks/spacer.spec.js b/tests/javascript/newsletter_editor/blocks/spacer.spec.js index 7f695ec261..3db8f818f8 100644 --- a/tests/javascript/newsletter_editor/blocks/spacer.spec.js +++ b/tests/javascript/newsletter_editor/blocks/spacer.spec.js @@ -10,6 +10,7 @@ define([ describe('Spacer', function () { describe('model', function () { var model; + var sandbox; beforeEach(function () { global.stubChannel(EditorApplication); @@ -18,10 +19,12 @@ define([ }); global.stubAvailableStyles(EditorApplication); model = new (SpacerBlock.SpacerBlockModel)(); + sandbox = sinon.sandbox.create(); }); afterEach(function () { delete EditorApplication.getChannel; + sandbox.restore(); }); it('has spacer type', function () { @@ -72,6 +75,14 @@ define([ expect(model.get('styles.block.backgroundColor')).to.equal('#567890'); expect(model.get('styles.block.height')).to.equal('19px'); }); + + it('updates blockDefaults.spacer when changed', function () { + var stub = sandbox.stub(EditorApplication.getConfig(), 'set'); + model.trigger('change'); + expect(stub.callCount).to.equal(1); + expect(stub.getCall(0).args[0]).to.equal('blockDefaults.spacer'); + expect(stub.getCall(0).args[1]).to.deep.equal(model.toJSON()); + }); }); describe('block view', function () {