You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ga...@apache.org on 2016/05/31 07:58:50 UTC
[22/27] fauxton commit: updated refs/heads/master to 0ca35da
http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/0ca35da7/app/addons/config/tests/configSpec.js
----------------------------------------------------------------------
diff --git a/app/addons/config/tests/configSpec.js b/app/addons/config/tests/configSpec.js
index 8e79c80..885ba24 100644
--- a/app/addons/config/tests/configSpec.js
+++ b/app/addons/config/tests/configSpec.js
@@ -9,157 +9,154 @@
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
-define([
- '../../../core/api',
- '../resources',
- '../views',
- '../../../../test/mocha/testUtils',
- 'sinon'
-], function (FauxtonAPI, Resources, Views, testUtils, sinon) {
- var assert = testUtils.assert,
- ViewSandbox = testUtils.ViewSandbox,
- collection;
+import FauxtonAPI from "../../../core/api";
+import Resources from "../resources";
+import Views from "../views";
+import testUtils from "../../../../test/mocha/testUtils";
+import sinon from "sinon";
+var assert = testUtils.assert,
+ ViewSandbox = testUtils.ViewSandbox,
+ collection;
+
+beforeEach(function () {
+ var optionModels = [];
+
+ _.each([1, 2, 3], function (i) {
+ var model = new Resources.OptionModel({
+ section: "foo" + i,
+ name: "bar" + i,
+ options: [{
+ name: "testname"
+ }]
+ }, {node: 'foo'});
+
+ optionModels.push(model);
+ });
- beforeEach(function () {
- var optionModels = [];
-
- _.each([1, 2, 3], function (i) {
- var model = new Resources.OptionModel({
- section: "foo" + i,
- name: "bar" + i,
- options: [{
- name: "testname"
- }]
- }, {node: 'foo'});
-
- optionModels.push(model);
+ collection = new Resources.Collection(optionModels, {node: 'foo'}, "foo");
+});
+
+describe("Config: Add Option Tray", function () {
+ var viewSandbox,
+ tray;
+
+ beforeEach(function (done) {
+ tray = new Views.AddConfigOptionsButton({
+ collection: collection
});
- collection = new Resources.Collection(optionModels, {node: 'foo'}, "foo");
+ viewSandbox = new ViewSandbox();
+ viewSandbox.renderView(tray, done);
});
- describe("Config: Add Option Tray", function () {
- var viewSandbox,
- tray;
-
- beforeEach(function (done) {
- tray = new Views.AddConfigOptionsButton({
- collection: collection
- });
+ afterEach(function () {
+ viewSandbox.remove();
+ });
- viewSandbox = new ViewSandbox();
- viewSandbox.renderView(tray, done);
- });
+ it("looks if entries are new", function () {
+ tray.$('input[name="section"]').val("foo1");
+ tray.$('input[name="name"]').val("testname");
+ assert.ok(tray.isUniqueEntryInSection(collection));
- afterEach(function () {
- viewSandbox.remove();
- });
+ tray.$('input[name="name"]').val("testname2");
+ assert.notOk(tray.isUniqueEntryInSection(collection));
+ });
- it("looks if entries are new", function () {
- tray.$('input[name="section"]').val("foo1");
- tray.$('input[name="name"]').val("testname");
- assert.ok(tray.isUniqueEntryInSection(collection));
+ it("does not send an error for a new section", function () {
+ tray.$('input[name="section"]').val("newsection");
+ tray.$('input[name="name"]').val("testname");
+ tray.$('input[name="value"]').val("testvalue");
+ var spy = sinon.spy(tray, "showError");
- tray.$('input[name="name"]').val("testname2");
- assert.notOk(tray.isUniqueEntryInSection(collection));
- });
+ tray.createConfigOption();
+ assert.notOk(spy.called);
+ });
+});
- it("does not send an error for a new section", function () {
- tray.$('input[name="section"]').val("newsection");
- tray.$('input[name="name"]').val("testname");
- tray.$('input[name="value"]').val("testvalue");
- var spy = sinon.spy(tray, "showError");
+describe("Config: Collection", function () {
+ it("looks if entries are new", function () {
+ assert.ok(collection.findEntryInSection("foo1", "testname"));
+ assert.notOk(collection.findEntryInSection("foo1", "testname2"));
+ });
- tray.createConfigOption();
- assert.notOk(spy.called);
- });
+ it("returns false if findEntryInSection does not have the section", function () {
+ assert.notOk(collection.findEntryInSection("foo-not-exists", "testname"));
});
+});
- describe("Config: Collection", function () {
- it("looks if entries are new", function () {
- assert.ok(collection.findEntryInSection("foo1", "testname"));
- assert.notOk(collection.findEntryInSection("foo1", "testname2"));
- });
+describe("Config: TableRow", function () {
+ var tabMenu, optionModel;
- it("returns false if findEntryInSection does not have the section", function () {
- assert.notOk(collection.findEntryInSection("foo-not-exists", "testname"));
+ beforeEach(function () {
+ optionModel = new Resources.OptionModel({
+ section: "foo",
+ name: "bar"
+ }, {node: 'foo'});
+
+ tabMenu = new Views.TableRow({
+ model: optionModel,
+ uniqueName: function () {
+ return false;
+ }
});
});
- describe("Config: TableRow", function () {
- var tabMenu, optionModel;
-
- beforeEach(function () {
- optionModel = new Resources.OptionModel({
- section: "foo",
- name: "bar"
- }, {node: 'foo'});
+ describe("editing Items", function () {
+ var viewSandbox;
+ beforeEach(function (done) {
+ viewSandbox = new ViewSandbox();
+ viewSandbox.renderView(tabMenu, done);
+ });
- tabMenu = new Views.TableRow({
- model: optionModel,
- uniqueName: function () {
- return false;
- }
- });
+ afterEach(function () {
+ viewSandbox.remove();
});
- describe("editing Items", function () {
- var viewSandbox;
- beforeEach(function (done) {
- viewSandbox = new ViewSandbox();
- viewSandbox.renderView(tabMenu, done);
- });
+ it("click on save should save the model and render", function () {
+ var renderSpy = sinon.stub(tabMenu, 'render');
+ var saveSpy = sinon.stub(optionModel, 'save');
- afterEach(function () {
- viewSandbox.remove();
+ var $fields = tabMenu.$('.js-edit-value').filter(function (el) {
+ return $(this).find('[name="value"]').length;
});
- it("click on save should save the model and render", function () {
- var renderSpy = sinon.stub(tabMenu, 'render');
- var saveSpy = sinon.stub(optionModel, 'save');
+ $fields.find('.js-edit-value').trigger('dblclick');
+ $fields.find('.js-save-value').trigger('click');
- var $fields = tabMenu.$('.js-edit-value').filter(function (el) {
- return $(this).find('[name="value"]').length;
- });
-
- $fields.find('.js-edit-value').trigger('dblclick');
- $fields.find('.js-save-value').trigger('click');
-
- assert.ok(renderSpy.calledOnce);
- assert.ok(saveSpy.calledOnce);
- });
+ assert.ok(renderSpy.calledOnce);
+ assert.ok(saveSpy.calledOnce);
+ });
- it("pressing enter should save the model and render", function () {
- var renderSpy = sinon.stub(tabMenu, 'render');
- var saveSpy = sinon.stub(optionModel, 'save');
+ it("pressing enter should save the model and render", function () {
+ var renderSpy = sinon.stub(tabMenu, 'render');
+ var saveSpy = sinon.stub(optionModel, 'save');
- var e = $.Event("keyup");
- e.keyCode = 13;
+ var e = $.Event("keyup");
+ e.keyCode = 13;
- var $fields = tabMenu.$('.js-edit-value').filter(function (el) {
- return $(this).find('[name="value"]').length;
- });
+ var $fields = tabMenu.$('.js-edit-value').filter(function (el) {
+ return $(this).find('[name="value"]').length;
+ });
- $fields.find('.js-value-input').trigger(e);
+ $fields.find('.js-value-input').trigger(e);
- assert.ok(renderSpy.calledOnce);
- assert.ok(saveSpy.calledOnce);
- });
+ assert.ok(renderSpy.calledOnce);
+ assert.ok(saveSpy.calledOnce);
+ });
- it("pressing Esc hides the field", function () {
- var e = $.Event("keyup");
- e.keyCode = 27;
- tabMenu.$('.js-value-input').trigger(e);
+ it("pressing Esc hides the field", function () {
+ var e = $.Event("keyup");
+ e.keyCode = 27;
+ tabMenu.$('.js-value-input').trigger(e);
- assert.ok(tabMenu.$('.js-edit-value-form').hasClass('js-hidden'));
- });
+ assert.ok(tabMenu.$('.js-edit-value-form').hasClass('js-hidden'));
+ });
- it("pressing Cancel hides the field", function () {
- tabMenu.$('.js-edit-value').trigger('dblclick');
- tabMenu.$('.js-cancel-value').trigger('click');
+ it("pressing Cancel hides the field", function () {
+ tabMenu.$('.js-edit-value').trigger('dblclick');
+ tabMenu.$('.js-cancel-value').trigger('click');
- assert.ok(tabMenu.$('.js-edit-value-form').hasClass('js-hidden'));
- });
+ assert.ok(tabMenu.$('.js-edit-value-form').hasClass('js-hidden'));
});
});
});
http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/0ca35da7/app/addons/config/views.js
----------------------------------------------------------------------
diff --git a/app/addons/config/views.js b/app/addons/config/views.js
index 7c2d7b9..398e396 100644
--- a/app/addons/config/views.js
+++ b/app/addons/config/views.js
@@ -10,264 +10,260 @@
// License for the specific language governing permissions and limitations under
// the License.
-define([
- "../../app",
- "../../core/api",
- "./resources",
- "../fauxton/components"
-],
-function (app, FauxtonAPI, Config, Components) {
- var Views = {};
-
- Views.TableRow = FauxtonAPI.View.extend({
- tagName: "tr",
- className: "config-item",
- template: "addons/config/templates/item",
- events: {
- "dblclick .js-edit-value": "editValue",
- "click .js-delete-value": "deleteValue",
- "click .js-cancel-value": "cancelEdit",
- "click .js-save-value": "saveAndRender",
- "keyup .js-value-input": "processKeyEvents"
- },
-
- deleteValue: function () {
- var collection = this.collection,
- result = confirm("Are you sure you want to delete this configuration value?");
-
- if (!result) { return; }
-
- this.model.destroy().done(function () {
- collection.fetch({reset: true}).done(function () {
- FauxtonAPI.Events.trigger("config:rerender");
- });
+import app from "../../app";
+import FauxtonAPI from "../../core/api";
+import Config from "./resources";
+import Components from "../fauxton/components";
+var Views = {};
+
+Views.TableRow = FauxtonAPI.View.extend({
+ tagName: "tr",
+ className: "config-item",
+ template: "addons/config/templates/item",
+ events: {
+ "dblclick .js-edit-value": "editValue",
+ "click .js-delete-value": "deleteValue",
+ "click .js-cancel-value": "cancelEdit",
+ "click .js-save-value": "saveAndRender",
+ "keyup .js-value-input": "processKeyEvents"
+ },
+
+ deleteValue: function () {
+ var collection = this.collection,
+ result = confirm("Are you sure you want to delete this configuration value?");
+
+ if (!result) { return; }
+
+ this.model.destroy().done(function () {
+ collection.fetch({reset: true}).done(function () {
+ FauxtonAPI.Events.trigger("config:rerender");
});
+ });
- this.remove();
- },
+ this.remove();
+ },
- editValue: function (event) {
- this.$(event.currentTarget).find(".js-show-value").addClass("js-hidden");
- this.$(event.currentTarget).find(".js-edit-value-form").removeClass("js-hidden");
- this.$(event.currentTarget).find(".js-value-input").focus();
- },
+ editValue: function (event) {
+ this.$(event.currentTarget).find(".js-show-value").addClass("js-hidden");
+ this.$(event.currentTarget).find(".js-edit-value-form").removeClass("js-hidden");
+ this.$(event.currentTarget).find(".js-value-input").focus();
+ },
- processKeyEvents: function (event) {
- // Enter key
- if (event.keyCode === 13) {
- return this.saveAndRender(event);
- }
- // Esc key
- if (event.keyCode === 27) {
- return this.discardValue(event);
- }
- },
-
- discardValue: function (event) {
- this.$(event.currentTarget).parents('td').find(".js-edit-value-form").addClass("js-hidden");
- this.$(event.currentTarget).parents('td').find(".js-show-value").removeClass("js-hidden");
- },
-
- cancelEdit: function (event) {
- this.discardValue(event);
- },
-
- serialize: function () {
- return {option: this.model.toJSON()};
- },
-
- saveAndRender: function (event) {
- var options = {},
- $input = this.$(event.currentTarget).parents('td').find(".js-value-input"),
- sectionName,
- nameInSectionExists;
-
- options[$input.attr('name')] = $input.val();
-
- if ($input.attr('name') === 'name') {
- sectionName = this.model.get("section");
- nameInSectionExists = this.collection.findEntryInSection(sectionName, $input.val());
- if (nameInSectionExists) {
- FauxtonAPI.addNotification({
- msg: "This config already exists, enter a unique name",
- type: "error",
- clear: true
- });
- } else {
- var newModel = this.model.clone();
- newModel.save(options);
- this.model.destroy();
- this.model = newModel;
- this.render();
- }
+ processKeyEvents: function (event) {
+ // Enter key
+ if (event.keyCode === 13) {
+ return this.saveAndRender(event);
+ }
+ // Esc key
+ if (event.keyCode === 27) {
+ return this.discardValue(event);
+ }
+ },
+
+ discardValue: function (event) {
+ this.$(event.currentTarget).parents('td').find(".js-edit-value-form").addClass("js-hidden");
+ this.$(event.currentTarget).parents('td').find(".js-show-value").removeClass("js-hidden");
+ },
+
+ cancelEdit: function (event) {
+ this.discardValue(event);
+ },
+
+ serialize: function () {
+ return {option: this.model.toJSON()};
+ },
+
+ saveAndRender: function (event) {
+ var options = {},
+ $input = this.$(event.currentTarget).parents('td').find(".js-value-input"),
+ sectionName,
+ nameInSectionExists;
+
+ options[$input.attr('name')] = $input.val();
+
+ if ($input.attr('name') === 'name') {
+ sectionName = this.model.get("section");
+ nameInSectionExists = this.collection.findEntryInSection(sectionName, $input.val());
+ if (nameInSectionExists) {
+ FauxtonAPI.addNotification({
+ msg: "This config already exists, enter a unique name",
+ type: "error",
+ clear: true
+ });
} else {
- this.model.save(options);
+ var newModel = this.model.clone();
+ newModel.save(options);
+ this.model.destroy();
+ this.model = newModel;
this.render();
}
+ } else {
+ this.model.save(options);
+ this.render();
}
+ }
- });
-
- Views.Table = FauxtonAPI.View.extend({
- template: "addons/config/templates/dashboard",
-
- initialize: function () {
- this.listenTo(FauxtonAPI.Events, "config:newSection", this.render);
- this.listenTo(FauxtonAPI.Events, "config:rerender", this.render);
- },
-
- beforeRender: function () {
- var collection = this.collection;
-
- this.collection.each(function (config) {
- _.each(config.get("options"), function (option, index) {
- this.insertView("table.config tbody", new Views.TableRow({
- collection: collection,
- model: new Config.OptionModel({
- section: config.get("section"),
- name: option.name,
- value: option.value,
- index: index
- }, {node: this.collection.node})
- }));
- }, this);
- }, this);
- },
-
- establish: function () {
- return [this.collection.fetch()];
- }
- });
-
- Views.ConfigHeader = FauxtonAPI.View.extend({
- template: 'addons/config/templates/header',
- className: 'header-right',
-
- initialize: function () {
- this.rightHeader = this.setView('#add-section-button', new Views.AddConfigOptionsButton({ collection: this.collection }));
- }
- });
-
-
- Views.AddConfigOptionsButton = Components.Tray.extend({
- template: 'addons/config/templates/add_config_option',
+});
- events: {
- 'click #js-create-config-section': 'createConfigOption'
- },
+Views.Table = FauxtonAPI.View.extend({
+ template: "addons/config/templates/dashboard",
+
+ initialize: function () {
+ this.listenTo(FauxtonAPI.Events, "config:newSection", this.render);
+ this.listenTo(FauxtonAPI.Events, "config:rerender", this.render);
+ },
+
+ beforeRender: function () {
+ var collection = this.collection;
+
+ this.collection.each(function (config) {
+ _.each(config.get("options"), function (option, index) {
+ this.insertView("table.config tbody", new Views.TableRow({
+ collection: collection,
+ model: new Config.OptionModel({
+ section: config.get("section"),
+ name: option.name,
+ value: option.value,
+ index: index
+ }, {node: this.collection.node})
+ }));
+ }, this);
+ }, this);
+ },
- initialize: function () {
- this.initTray({ toggleTrayBtnSelector: '#add-new-section' });
- },
+ establish: function () {
+ return [this.collection.fetch()];
+ }
+});
- processKey: function (e) {
- if (e.which === 13) {
- e.preventDefault();
- this.createConfigOption();
- }
- },
+Views.ConfigHeader = FauxtonAPI.View.extend({
+ template: 'addons/config/templates/header',
+ className: 'header-right',
- afterRender: function () {
- this.sectionNames = _.map(this.collection.toJSON(), function (item) {
- return item.section;
- });
+ initialize: function () {
+ this.rightHeader = this.setView('#add-section-button', new Views.AddConfigOptionsButton({ collection: this.collection }));
+ }
+});
- this.sectionTypeAhead = new Components.Typeahead({
- source: this.sectionNames,
- el: 'input[name="section"]'
- });
- this.sectionTypeAhead.render();
- },
- createConfigOption: function (e) {
- if (e) {
- e.preventDefault();
- }
+Views.AddConfigOptionsButton = Components.Tray.extend({
+ template: 'addons/config/templates/add_config_option',
- var section = this.$('input[name="section"]').val(),
- name = this.$('input[name="name"]').val(),
- value = this.$('input[name="value"]').val(),
- collection = this.collection;
-
- // perform a little validation, then submit
- if (!section) {
- this.showError('Please enter or select a section.');
- } else if (!name) {
- this.showError('Please add an option name.');
- } else if (this.isUniqueEntryInSection(collection)) {
- this.showError('The option have a unique name.');
- } else if (!value) {
- this.showError('Please add a value.');
- } else {
- this.submitForm();
- }
- },
+ events: {
+ 'click #js-create-config-section': 'createConfigOption'
+ },
- submitForm: function () {
+ initialize: function () {
+ this.initTray({ toggleTrayBtnSelector: '#add-new-section' });
+ },
- var option = new Config.OptionModel({
- section: this.$('input[name="section"]').val(),
- name: this.$('input[name="name"]').val(),
- value: this.$('input[name="value"]').val()
- }, {node: this.collection.node});
- option.save();
+ processKey: function (e) {
+ if (e.which === 13) {
+ e.preventDefault();
+ this.createConfigOption();
+ }
+ },
+
+ afterRender: function () {
+ this.sectionNames = _.map(this.collection.toJSON(), function (item) {
+ return item.section;
+ });
+
+ this.sectionTypeAhead = new Components.Typeahead({
+ source: this.sectionNames,
+ el: 'input[name="section"]'
+ });
+ this.sectionTypeAhead.render();
+ },
+
+ createConfigOption: function (e) {
+ if (e) {
+ e.preventDefault();
+ }
- var section = this.collection.find(function (section) {
- return section.get('section') === option.get('section');
+ var section = this.$('input[name="section"]').val(),
+ name = this.$('input[name="name"]').val(),
+ value = this.$('input[name="value"]').val(),
+ collection = this.collection;
+
+ // perform a little validation, then submit
+ if (!section) {
+ this.showError('Please enter or select a section.');
+ } else if (!name) {
+ this.showError('Please add an option name.');
+ } else if (this.isUniqueEntryInSection(collection)) {
+ this.showError('The option have a unique name.');
+ } else if (!value) {
+ this.showError('Please add a value.');
+ } else {
+ this.submitForm();
+ }
+ },
+
+ submitForm: function () {
+
+ var option = new Config.OptionModel({
+ section: this.$('input[name="section"]').val(),
+ name: this.$('input[name="name"]').val(),
+ value: this.$('input[name="value"]').val()
+ }, {node: this.collection.node});
+ option.save();
+
+ var section = this.collection.find(function (section) {
+ return section.get('section') === option.get('section');
+ });
+
+ if (section) {
+ section.get('options').push(option.attributes);
+ } else {
+ this.collection.add({
+ section: option.get('section'),
+ options: [option.attributes]
});
+ }
- if (section) {
- section.get('options').push(option.attributes);
- } else {
- this.collection.add({
- section: option.get('section'),
- options: [option.attributes]
- });
- }
-
- this.hideTray();
- FauxtonAPI.Events.trigger('config:newSection');
- },
+ this.hideTray();
+ FauxtonAPI.Events.trigger('config:newSection');
+ },
- isUniqueEntryInSection: function (collection) {
- var sectionName = this.$('input[name="section"]').val(),
- entry = this.$('input[name="name"]').val();
+ isUniqueEntryInSection: function (collection) {
+ var sectionName = this.$('input[name="section"]').val(),
+ entry = this.$('input[name="name"]').val();
- return collection.findEntryInSection(sectionName, entry);
- },
+ return collection.findEntryInSection(sectionName, entry);
+ },
- showError: function (msg) {
- FauxtonAPI.addNotification({
- msg: msg,
- type: 'error',
- clear: true
- });
- }
- });
-
- Views.Tabs = FauxtonAPI.View.extend({
- className: "sidenav",
- tagName: "nav",
- template: 'addons/config/templates/sidebartabs',
- initialize: function (options) {
- this.sidebarItems = options.sidebarItems;
- },
-
- setSelectedTab: function (selectedTab) {
- this.selectedTab = selectedTab;
- this.$('li').removeClass('active');
- this.$('a[data-type-select="' + this.selectedTab + '"]').parent("li").addClass('active');
- },
- afterRender: function () {
- this.setSelectedTab(this.selectedTab);
- },
-
- serialize: function () {
- return {
- sidebarItems: this.sidebarItems
- };
- }
- });
+ showError: function (msg) {
+ FauxtonAPI.addNotification({
+ msg: msg,
+ type: 'error',
+ clear: true
+ });
+ }
+});
- return Views;
+Views.Tabs = FauxtonAPI.View.extend({
+ className: "sidenav",
+ tagName: "nav",
+ template: 'addons/config/templates/sidebartabs',
+ initialize: function (options) {
+ this.sidebarItems = options.sidebarItems;
+ },
+
+ setSelectedTab: function (selectedTab) {
+ this.selectedTab = selectedTab;
+ this.$('li').removeClass('active');
+ this.$('a[data-type-select="' + this.selectedTab + '"]').parent("li").addClass('active');
+ },
+ afterRender: function () {
+ this.setSelectedTab(this.selectedTab);
+ },
+
+ serialize: function () {
+ return {
+ sidebarItems: this.sidebarItems
+ };
+ }
});
+
+export default Views;
http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/0ca35da7/app/addons/cors/actions.js
----------------------------------------------------------------------
diff --git a/app/addons/cors/actions.js b/app/addons/cors/actions.js
index 7773bd5..039cb67 100644
--- a/app/addons/cors/actions.js
+++ b/app/addons/cors/actions.js
@@ -9,190 +9,186 @@
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
-define([
- '../../core/api',
- './actiontypes',
- './resources'
-], function (FauxtonAPI, ActionTypes, Resources) {
-
-
- return {
- fetchAndEditCors: function (node) {
- var cors = new Resources.Config({node: node});
- var httpd = new Resources.Httpd({node: node});
-
- FauxtonAPI.when([cors.fetch(), httpd.fetch()]).then(function () {
- this.editCors({
- origins: cors.get('origins'),
- isEnabled: httpd.corsEnabled(),
- node: node
- });
- }.bind(this));
- },
-
- editCors: function (options) {
- FauxtonAPI.dispatch({
- type: ActionTypes.EDIT_CORS,
- options: options
- });
- },
-
- toggleEnableCors: function () {
- FauxtonAPI.dispatch({
- type: ActionTypes.TOGGLE_ENABLE_CORS
- });
- },
-
- addOrigin: function (origin) {
- FauxtonAPI.dispatch({
- type: ActionTypes.CORS_ADD_ORIGIN,
- origin: origin
- });
- },
-
- originChange: function (isAllOrigins) {
- FauxtonAPI.dispatch({
- type: ActionTypes.CORS_IS_ALL_ORIGINS,
- isAllOrigins: isAllOrigins
- });
- },
-
- deleteOrigin: function (origin) {
- FauxtonAPI.dispatch({
- type: ActionTypes.CORS_DELETE_ORIGIN,
- origin: origin
- });
- },
-
- updateOrigin: function (updatedOrigin, originalOrigin) {
- FauxtonAPI.dispatch({
- type: ActionTypes.CORS_UPDATE_ORIGIN,
- updatedOrigin: updatedOrigin,
- originalOrigin: originalOrigin
- });
- },
-
- methodChange: function (httpMethod) {
- FauxtonAPI.dispatch({
- type: ActionTypes.CORS_METHOD_CHANGE,
- httpMethod: httpMethod
- });
- },
-
- saveEnableCorsToHttpd: function (enableCors, node) {
- var enableOption = new Resources.ConfigModel({
- section: 'httpd',
- attribute: 'enable_cors',
- value: enableCors.toString(),
- node: node
- });
-
- return enableOption.save();
- },
-
- saveCorsOrigins: function (origins, node) {
- var allowOrigins = new Resources.ConfigModel({
- section: 'cors',
- attribute: 'origins',
- value: origins,
+import FauxtonAPI from "../../core/api";
+import ActionTypes from "./actiontypes";
+import Resources from "./resources";
+
+export default {
+ fetchAndEditCors: function (node) {
+ var cors = new Resources.Config({node: node});
+ var httpd = new Resources.Httpd({node: node});
+
+ FauxtonAPI.when([cors.fetch(), httpd.fetch()]).then(function () {
+ this.editCors({
+ origins: cors.get('origins'),
+ isEnabled: httpd.corsEnabled(),
node: node
});
+ }.bind(this));
+ },
+
+ editCors: function (options) {
+ FauxtonAPI.dispatch({
+ type: ActionTypes.EDIT_CORS,
+ options: options
+ });
+ },
+
+ toggleEnableCors: function () {
+ FauxtonAPI.dispatch({
+ type: ActionTypes.TOGGLE_ENABLE_CORS
+ });
+ },
+
+ addOrigin: function (origin) {
+ FauxtonAPI.dispatch({
+ type: ActionTypes.CORS_ADD_ORIGIN,
+ origin: origin
+ });
+ },
+
+ originChange: function (isAllOrigins) {
+ FauxtonAPI.dispatch({
+ type: ActionTypes.CORS_IS_ALL_ORIGINS,
+ isAllOrigins: isAllOrigins
+ });
+ },
+
+ deleteOrigin: function (origin) {
+ FauxtonAPI.dispatch({
+ type: ActionTypes.CORS_DELETE_ORIGIN,
+ origin: origin
+ });
+ },
+
+ updateOrigin: function (updatedOrigin, originalOrigin) {
+ FauxtonAPI.dispatch({
+ type: ActionTypes.CORS_UPDATE_ORIGIN,
+ updatedOrigin: updatedOrigin,
+ originalOrigin: originalOrigin
+ });
+ },
+
+ methodChange: function (httpMethod) {
+ FauxtonAPI.dispatch({
+ type: ActionTypes.CORS_METHOD_CHANGE,
+ httpMethod: httpMethod
+ });
+ },
+
+ saveEnableCorsToHttpd: function (enableCors, node) {
+ var enableOption = new Resources.ConfigModel({
+ section: 'httpd',
+ attribute: 'enable_cors',
+ value: enableCors.toString(),
+ node: node
+ });
+
+ return enableOption.save();
+ },
+
+ saveCorsOrigins: function (origins, node) {
+ var allowOrigins = new Resources.ConfigModel({
+ section: 'cors',
+ attribute: 'origins',
+ value: origins,
+ node: node
+ });
+
+ return allowOrigins.save();
+ },
+
+ saveCorsCredentials: function (node) {
+ var allowCredentials = new Resources.ConfigModel({
+ section: 'cors',
+ attribute: 'credentials',
+ value: 'true',
+ node: node
+ });
+
+ return allowCredentials.save();
+ },
+
+ saveCorsHeaders: function (node) {
+ var corsHeaders = new Resources.ConfigModel({
+ section: 'cors',
+ attribute: 'headers',
+ value: 'accept, authorization, content-type, origin, referer',
+ node: node
+ });
+
+ return corsHeaders.save();
+ },
+
+ saveCorsMethods: function (node) {
+ var corsMethods = new Resources.ConfigModel({
+ section: 'cors',
+ attribute: 'methods',
+ value: 'GET, PUT, POST, HEAD, DELETE',
+ node: node
+ });
+
+ return corsMethods.save();
+ },
+
+ sanitizeOrigins: function (origins) {
+ if (_.isEmpty(origins)) {
+ return '';
+ }
- return allowOrigins.save();
- },
+ return origins.join(',');
+ },
- saveCorsCredentials: function (node) {
- var allowCredentials = new Resources.ConfigModel({
- section: 'cors',
- attribute: 'credentials',
- value: 'true',
- node: node
- });
+ toggleLoadingBarsToEnabled: function (state) {
+ FauxtonAPI.dispatch({
+ type: ActionTypes.CORS_SET_IS_LOADING,
+ isLoading: state
+ });
+ },
- return allowCredentials.save();
- },
+ saveCors: function (options) {
+ this.toggleLoadingBarsToEnabled(true);
- saveCorsHeaders: function (node) {
- var corsHeaders = new Resources.ConfigModel({
- section: 'cors',
- attribute: 'headers',
- value: 'accept, authorization, content-type, origin, referer',
- node: node
- });
+ var promises = [];
+ promises.push(this.saveEnableCorsToHttpd(options.enableCors, options.node));
- return corsHeaders.save();
- },
+ if (options.enableCors) {
+ promises.push(this.saveCorsOrigins(this.sanitizeOrigins(options.origins), options.node));
+ promises.push(this.saveCorsCredentials(options.node));
+ promises.push(this.saveCorsHeaders(options.node));
+ promises.push(this.saveCorsMethods(options.node));
+ }
- saveCorsMethods: function (node) {
- var corsMethods = new Resources.ConfigModel({
- section: 'cors',
- attribute: 'methods',
- value: 'GET, PUT, POST, HEAD, DELETE',
- node: node
+ FauxtonAPI.when(promises).then(function () {
+ FauxtonAPI.addNotification({
+ msg: 'Cors settings updated.',
+ type: 'success',
+ clear: true
});
- return corsMethods.save();
- },
+ this.hideDeleteDomainModal(); // just in case it was already open
+ this.toggleLoadingBarsToEnabled(false);
- sanitizeOrigins: function (origins) {
- if (_.isEmpty(origins)) {
- return '';
- }
-
- return origins.join(',');
- },
-
- toggleLoadingBarsToEnabled: function (state) {
- FauxtonAPI.dispatch({
- type: ActionTypes.CORS_SET_IS_LOADING,
- isLoading: state
+ }.bind(this), function () {
+ FauxtonAPI.addNotification({
+ msg: 'Error! Could not save your CORS settings. Please try again.',
+ type: 'error',
+ clear: true
});
- },
-
- saveCors: function (options) {
- this.toggleLoadingBarsToEnabled(true);
-
- var promises = [];
- promises.push(this.saveEnableCorsToHttpd(options.enableCors, options.node));
-
- if (options.enableCors) {
- promises.push(this.saveCorsOrigins(this.sanitizeOrigins(options.origins), options.node));
- promises.push(this.saveCorsCredentials(options.node));
- promises.push(this.saveCorsHeaders(options.node));
- promises.push(this.saveCorsMethods(options.node));
+ this.toggleLoadingBarsToEnabled(false);
+ }.bind(this));
+ },
+
+ showDeleteDomainModal: function (domain) {
+ FauxtonAPI.dispatch({
+ type: ActionTypes.CORS_SHOW_DELETE_DOMAIN_MODAL,
+ options: {
+ domain: domain
}
+ });
+ },
- FauxtonAPI.when(promises).then(function () {
- FauxtonAPI.addNotification({
- msg: 'Cors settings updated.',
- type: 'success',
- clear: true
- });
-
- this.hideDeleteDomainModal(); // just in case it was already open
- this.toggleLoadingBarsToEnabled(false);
-
- }.bind(this), function () {
- FauxtonAPI.addNotification({
- msg: 'Error! Could not save your CORS settings. Please try again.',
- type: 'error',
- clear: true
- });
- this.toggleLoadingBarsToEnabled(false);
- }.bind(this));
- },
-
- showDeleteDomainModal: function (domain) {
- FauxtonAPI.dispatch({
- type: ActionTypes.CORS_SHOW_DELETE_DOMAIN_MODAL,
- options: {
- domain: domain
- }
- });
- },
-
- hideDeleteDomainModal: function () {
- FauxtonAPI.dispatch({ type: ActionTypes.CORS_HIDE_DELETE_DOMAIN_MODAL });
- }
- };
-});
+ hideDeleteDomainModal: function () {
+ FauxtonAPI.dispatch({ type: ActionTypes.CORS_HIDE_DELETE_DOMAIN_MODAL });
+ }
+};
http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/0ca35da7/app/addons/cors/actiontypes.js
----------------------------------------------------------------------
diff --git a/app/addons/cors/actiontypes.js b/app/addons/cors/actiontypes.js
index d75109f..81ebd7f 100644
--- a/app/addons/cors/actiontypes.js
+++ b/app/addons/cors/actiontypes.js
@@ -9,17 +9,15 @@
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
-define([], function () {
- return {
- TOGGLE_ENABLE_CORS: 'TOGGLE_ENABLE_CORS',
- EDIT_CORS: 'EDIT_CORS',
- CORS_ADD_ORIGIN: 'CORS_ADD_ORIGIN',
- CORS_IS_ALL_ORIGINS: 'CORS_IS_ALL_ORIGINS',
- CORS_DELETE_ORIGIN: 'CORS_DELETE_ORIGIN',
- CORS_UPDATE_ORIGIN: 'CORS_UPDATE_ORIGIN',
- CORS_METHOD_CHANGE: 'CORS_METHOD_CHANGE',
- CORS_SET_IS_LOADING: 'CORS_SET_IS_LOADING',
- CORS_SHOW_DELETE_DOMAIN_MODAL: 'CORS_SHOW_DELETE_DOMAIN_MODAL',
- CORS_HIDE_DELETE_DOMAIN_MODAL: 'CORS_HIDE_DELETE_DOMAIN_MODAL'
- };
-});
+export default {
+ TOGGLE_ENABLE_CORS: 'TOGGLE_ENABLE_CORS',
+ EDIT_CORS: 'EDIT_CORS',
+ CORS_ADD_ORIGIN: 'CORS_ADD_ORIGIN',
+ CORS_IS_ALL_ORIGINS: 'CORS_IS_ALL_ORIGINS',
+ CORS_DELETE_ORIGIN: 'CORS_DELETE_ORIGIN',
+ CORS_UPDATE_ORIGIN: 'CORS_UPDATE_ORIGIN',
+ CORS_METHOD_CHANGE: 'CORS_METHOD_CHANGE',
+ CORS_SET_IS_LOADING: 'CORS_SET_IS_LOADING',
+ CORS_SHOW_DELETE_DOMAIN_MODAL: 'CORS_SHOW_DELETE_DOMAIN_MODAL',
+ CORS_HIDE_DELETE_DOMAIN_MODAL: 'CORS_HIDE_DELETE_DOMAIN_MODAL'
+};
http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/0ca35da7/app/addons/cors/base.js
----------------------------------------------------------------------
diff --git a/app/addons/cors/base.js b/app/addons/cors/base.js
index f3d13d7..6c32bd4 100644
--- a/app/addons/cors/base.js
+++ b/app/addons/cors/base.js
@@ -10,16 +10,11 @@
// License for the specific language governing permissions and limitations under
// the License.
-define([
- "../../app",
- "../../core/api",
- './assets/less/cors.less'
-],
+import app from "../../app";
+import FauxtonAPI from "../../core/api";
+import "./assets/less/cors.less";
+var CORS = FauxtonAPI.addon();
-function (app, FauxtonAPI) {
- var CORS = FauxtonAPI.addon();
+CORS.initialize = function () {};
- CORS.initialize = function () {};
-
- return CORS;
-});
+export default CORS;
http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/0ca35da7/app/addons/cors/components.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/cors/components.react.jsx b/app/addons/cors/components.react.jsx
index 760f5f6..8cd42d2 100644
--- a/app/addons/cors/components.react.jsx
+++ b/app/addons/cors/components.react.jsx
@@ -10,361 +10,358 @@
// License for the specific language governing permissions and limitations under
// the License.
-define([
- "../../app",
- "../../core/api",
- "react",
- "./stores",
- "./resources",
- "./actions",
- '../components/react-components.react',
- '../fauxton/components.react'
-], function (app, FauxtonAPI, React, Stores, Resources, Actions, ReactComponents, FauxtonComponents) {
- var LoadLines = ReactComponents.LoadLines;
- var ConfirmationModal = FauxtonComponents.ConfirmationModal;
-
- var corsStore = Stores.corsStore;
-
-
- var validateOrigin = function (origin) {
- if (!Resources.validateCORSDomain(origin)) {
- FauxtonAPI.addNotification({
- msg: 'Please enter a valid domain, starting with http/https.',
- type: 'error',
- clear: true
- });
-
- return false;
+import app from "../../app";
+import FauxtonAPI from "../../core/api";
+import React from "react";
+import Stores from "./stores";
+import Resources from "./resources";
+import Actions from "./actions";
+import ReactComponents from "../components/react-components.react";
+import FauxtonComponents from "../fauxton/components.react";
+var LoadLines = ReactComponents.LoadLines;
+var ConfirmationModal = FauxtonComponents.ConfirmationModal;
+
+var corsStore = Stores.corsStore;
+
+
+var validateOrigin = function (origin) {
+ if (!Resources.validateCORSDomain(origin)) {
+ FauxtonAPI.addNotification({
+ msg: 'Please enter a valid domain, starting with http/https.',
+ type: 'error',
+ clear: true
+ });
+
+ return false;
+ }
+
+ return true;
+};
+
+
+var OriginRow = React.createClass({
+
+ getInitialState: function () {
+ return {
+ edit: false,
+ updatedOrigin: this.props.origin
+ };
+ },
+
+ editOrigin: function (e) {
+ e.preventDefault();
+ this.setState({ edit: !this.state.edit });
+ },
+
+ updateOrigin: function (e) {
+ e.preventDefault();
+ if (!validateOrigin(this.state.updatedOrigin)) {
+ return;
}
+ this.props.updateOrigin(this.state.updatedOrigin, this.props.origin);
+ this.setState({ edit: false });
+ },
+
+ deleteOrigin: function (e) {
+ e.preventDefault();
+ Actions.showDeleteDomainModal(this.props.origin);
+ },
+
+ onInputChange: function (event) {
+ this.setState({ updatedOrigin: event.target.value });
+ },
+
+ onKeyUp: function (e) {
+ if (e.keyCode === 13) { //enter key
+ return this.updateOrigin(e);
+ }
+ },
- return true;
- };
-
-
- var OriginRow = React.createClass({
-
- getInitialState: function () {
- return {
- edit: false,
- updatedOrigin: this.props.origin
- };
- },
-
- editOrigin: function (e) {
- e.preventDefault();
- this.setState({ edit: !this.state.edit });
- },
-
- updateOrigin: function (e) {
- e.preventDefault();
- if (!validateOrigin(this.state.updatedOrigin)) {
- return;
- }
- this.props.updateOrigin(this.state.updatedOrigin, this.props.origin);
- this.setState({ edit: false });
- },
-
- deleteOrigin: function (e) {
- e.preventDefault();
- Actions.showDeleteDomainModal(this.props.origin);
- },
-
- onInputChange: function (event) {
- this.setState({ updatedOrigin: event.target.value });
- },
-
- onKeyUp: function (e) {
- if (e.keyCode === 13) { //enter key
- return this.updateOrigin(e);
- }
- },
-
- createOriginDisplay: function () {
- if (this.state.edit) {
- return (
- <div className="input-append edit-domain-section">
- <input type="text" name="update_origin_domain" onChange={this.onInputChange} onKeyUp={this.onKeyUp} value={this.state.updatedOrigin} />
- <button onClick={this.updateOrigin} className="btn btn-primary update-origin"> Update </button>
- </div>
- );
- }
- return <div className="js-url url-display">{this.props.origin}</div>;
- },
-
- render: function () {
- var display = this.createOriginDisplay();
+ createOriginDisplay: function () {
+ if (this.state.edit) {
return (
- <tr>
- <td>
- {display}
- </td>
- <td width="30">
- <span>
- <a className="fonticon-pencil" onClick={this.editOrigin} title="Click to edit" />
- </span>
- </td>
- <td width="30">
- <span>
- <a href="#" data-bypass="true" className="fonticon-trash" onClick={this.deleteOrigin} title="Click to delete" />
- </span>
- </td>
- </tr>
+ <div className="input-append edit-domain-section">
+ <input type="text" name="update_origin_domain" onChange={this.onInputChange} onKeyUp={this.onKeyUp} value={this.state.updatedOrigin} />
+ <button onClick={this.updateOrigin} className="btn btn-primary update-origin"> Update </button>
+ </div>
);
}
+ return <div className="js-url url-display">{this.props.origin}</div>;
+ },
+
+ render: function () {
+ var display = this.createOriginDisplay();
+ return (
+ <tr>
+ <td>
+ {display}
+ </td>
+ <td width="30">
+ <span>
+ <a className="fonticon-pencil" onClick={this.editOrigin} title="Click to edit" />
+ </span>
+ </td>
+ <td width="30">
+ <span>
+ <a href="#" data-bypass="true" className="fonticon-trash" onClick={this.deleteOrigin} title="Click to delete" />
+ </span>
+ </td>
+ </tr>
+ );
+ }
- });
-
- var OriginTable = React.createClass({
-
- createRows: function () {
- return _.map(this.props.origins, function (origin, i) {
- return <OriginRow
- updateOrigin={this.props.updateOrigin}
- key={i} origin={origin} />;
- }, this);
- },
+});
- render: function () {
- if (!this.props.origins) {
- return null;
- }
+var OriginTable = React.createClass({
- if (!this.props.isVisible || this.props.origins.length === 0) {
- return null;
- }
+ createRows: function () {
+ return _.map(this.props.origins, function (origin, i) {
+ return <OriginRow
+ updateOrigin={this.props.updateOrigin}
+ key={i} origin={origin} />;
+ }, this);
+ },
- var origins = this.createRows();
+ render: function () {
+ if (!this.props.origins) {
+ return null;
+ }
- return (
- <table id="origin-domain-table" className="table table-striped">
- <tbody>
- {origins}
- </tbody>
- </table>
- );
+ if (!this.props.isVisible || this.props.origins.length === 0) {
+ return null;
}
- });
+ var origins = this.createRows();
- var OriginInput = React.createClass({
- getInitialState: function () {
- return {
- origin: ''
- };
- },
+ return (
+ <table id="origin-domain-table" className="table table-striped">
+ <tbody>
+ {origins}
+ </tbody>
+ </table>
+ );
+ }
- onInputChange: function (e) {
- this.setState({origin: e.target.value});
- },
+});
- addOrigin: function (event) {
- event.preventDefault();
- if (!validateOrigin(this.state.origin)) {
- return;
- }
+var OriginInput = React.createClass({
+ getInitialState: function () {
+ return {
+ origin: ''
+ };
+ },
+
+ onInputChange: function (e) {
+ this.setState({origin: e.target.value});
+ },
+
+ addOrigin: function (event) {
+ event.preventDefault();
+ if (!validateOrigin(this.state.origin)) {
+ return;
+ }
- var url = Resources.normalizeUrls(this.state.origin);
+ var url = Resources.normalizeUrls(this.state.origin);
- this.props.addOrigin(url);
- this.setState({origin: ''});
- },
+ this.props.addOrigin(url);
+ this.setState({origin: ''});
+ },
- onKeyUp: function (e) {
- if (e.keyCode == 13) { //enter key
- return this.addOrigin(e);
- }
- },
+ onKeyUp: function (e) {
+ if (e.keyCode == 13) { //enter key
+ return this.addOrigin(e);
+ }
+ },
- render: function () {
- if (!this.props.isVisible) {
- return null;
- }
+ render: function () {
+ if (!this.props.isVisible) {
+ return null;
+ }
- return (
- <div id="origin-domains-container">
- <div className="origin-domains">
- <div className="input-append">
- <input type="text" name="new_origin_domain" onChange={this.onInputChange} onKeyUp={this.onKeyUp} value={this.state.origin} placeholder="e.g., https://site.com"/>
- <button onClick={this.addOrigin} className="btn btn-primary add-domain"> Add </button>
- </div>
+ return (
+ <div id="origin-domains-container">
+ <div className="origin-domains">
+ <div className="input-append">
+ <input type="text" name="new_origin_domain" onChange={this.onInputChange} onKeyUp={this.onKeyUp} value={this.state.origin} placeholder="e.g., https://site.com"/>
+ <button onClick={this.addOrigin} className="btn btn-primary add-domain"> Add </button>
</div>
</div>
- );
- }
+ </div>
+ );
+ }
- });
+});
- var Origins = React.createClass({
+var Origins = React.createClass({
- onOriginChange: function (event) {
- if (event.target.value === 'all' && this.props.isAllOrigins) {
- return; // do nothing if all origins is already selected
- }
- if (event.target.value === 'selected' && !this.props.isAllOrigins) {
- return; // do nothing if specific origins is already selected
- }
+ onOriginChange: function (event) {
+ if (event.target.value === 'all' && this.props.isAllOrigins) {
+ return; // do nothing if all origins is already selected
+ }
+ if (event.target.value === 'selected' && !this.props.isAllOrigins) {
+ return; // do nothing if specific origins is already selected
+ }
- this.props.originChange(event.target.value === 'all');
- },
+ this.props.originChange(event.target.value === 'all');
+ },
- render: function () {
+ render: function () {
- if (!this.props.corsEnabled) {
- return null;
- }
+ if (!this.props.corsEnabled) {
+ return null;
+ }
- return (
- <div>
- <p><strong> Origin Domains </strong> </p>
- <p>Databases will accept requests from these domains: </p>
- <label className="radio">
- <input type="radio" checked={this.props.isAllOrigins} value="all" onChange={this.onOriginChange} name="all-domains"/> All domains ( * )
- </label>
- <label className="radio">
- <input type="radio" checked={!this.props.isAllOrigins} value="selected" onChange={this.onOriginChange} name="selected-domains"/> Restrict to specific domains
- </label>
- </div>
- );
+ return (
+ <div>
+ <p><strong> Origin Domains </strong> </p>
+ <p>Databases will accept requests from these domains: </p>
+ <label className="radio">
+ <input type="radio" checked={this.props.isAllOrigins} value="all" onChange={this.onOriginChange} name="all-domains"/> All domains ( * )
+ </label>
+ <label className="radio">
+ <input type="radio" checked={!this.props.isAllOrigins} value="selected" onChange={this.onOriginChange} name="selected-domains"/> Restrict to specific domains
+ </label>
+ </div>
+ );
+ }
+});
+
+var CORSController = React.createClass({
+
+ getStoreState: function () {
+ return {
+ corsEnabled: corsStore.isEnabled(),
+ origins: corsStore.getOrigins(),
+ isAllOrigins: corsStore.isAllOrigins(),
+ configChanged: corsStore.hasConfigChanged(),
+ shouldSaveChange: corsStore.shouldSaveChange(),
+ node: corsStore.getNode(),
+ isLoading: corsStore.getIsLoading(),
+ deleteDomainModalVisible: corsStore.isDeleteDomainModalVisible(),
+ domainToDelete: corsStore.getDomainToDelete()
+ };
+ },
+
+ getInitialState: function () {
+ return this.getStoreState();
+ },
+
+ componentDidMount: function () {
+ corsStore.on('change', this.onChange, this);
+ },
+
+ componentWillUnmount: function () {
+ corsStore.off('change', this.onChange);
+ },
+
+ componentDidUpdate: function () {
+ if (this.state.shouldSaveChange) {
+ this.save();
}
- });
-
- var CORSController = React.createClass({
-
- getStoreState: function () {
- return {
- corsEnabled: corsStore.isEnabled(),
- origins: corsStore.getOrigins(),
- isAllOrigins: corsStore.isAllOrigins(),
- configChanged: corsStore.hasConfigChanged(),
- shouldSaveChange: corsStore.shouldSaveChange(),
- node: corsStore.getNode(),
- isLoading: corsStore.getIsLoading(),
- deleteDomainModalVisible: corsStore.isDeleteDomainModalVisible(),
- domainToDelete: corsStore.getDomainToDelete()
- };
- },
-
- getInitialState: function () {
- return this.getStoreState();
- },
-
- componentDidMount: function () {
- corsStore.on('change', this.onChange, this);
- },
-
- componentWillUnmount: function () {
- corsStore.off('change', this.onChange);
- },
-
- componentDidUpdate: function () {
- if (this.state.shouldSaveChange) {
- this.save();
- }
- },
-
- onChange: function () {
- this.setState(this.getStoreState());
- },
-
- enableCorsChange: function () {
- if (this.state.corsEnabled && !_.isEmpty(this.state.origins) ) {
- var result = window.confirm(app.i18n.en_US['cors-disable-cors-prompt']);
- if (!result) { return; }
- }
-
- Actions.toggleEnableCors();
- },
-
- save: function () {
- Actions.saveCors({
- enableCors: this.state.corsEnabled,
- origins: this.state.origins,
- node: this.state.node
- });
- },
-
- originChange: function (isAllOrigins) {
- if (isAllOrigins && !_.isEmpty(this.state.origins)) {
- var result = window.confirm('Are you sure? Switching to all origin domains will overwrite your specific origin domains.');
- if (!result) { return; }
- }
-
- Actions.originChange(isAllOrigins);
- },
-
- addOrigin: function (origin) {
- Actions.addOrigin(origin);
- },
-
- updateOrigin: function (updatedOrigin, originalOrigin) {
- Actions.updateOrigin(updatedOrigin, originalOrigin);
- },
-
- methodChange: function (httpMethod) {
- Actions.methodChange(httpMethod);
- },
-
- deleteOrigin: function () {
- Actions.deleteOrigin(this.state.domainToDelete);
- },
-
- render: function () {
- var isVisible = _.all([this.state.corsEnabled, !this.state.isAllOrigins]);
-
- var originSettings = (
- <div id={this.state.corsEnabled ? 'collapsing-container' : ''}>
- <Origins corsEnabled={this.state.corsEnabled} originChange={this.originChange} isAllOrigins={this.state.isAllOrigins}/>
- <OriginTable updateOrigin={this.updateOrigin} isVisible={isVisible} origins={this.state.origins} />
- <OriginInput addOrigin={this.addOrigin} isVisible={isVisible} />
- </div>
- );
+ },
- if (this.state.isLoading) {
- originSettings = (<LoadLines />);
- }
- var deleteMsg = <span>Are you sure you want to delete <code>{_.escape(this.state.domainToDelete)}</code>?</span>;
+ onChange: function () {
+ this.setState(this.getStoreState());
+ },
- return (
- <div className="cors-page flex-body">
- <header id="cors-header">
- <p>{app.i18n.en_US['cors-notice']}</p>
- </header>
-
- <form id="corsForm" onSubmit={this.save}>
- <div className="cors-enable">
- {this.state.corsEnabled ? 'Cors is currently enabled.' : 'Cors is currently disabled.'}
- <br />
- <button
- type="button"
- className="enable-disable btn btn-success"
- onClick={this.enableCorsChange}
- disabled={this.state.isLoading ? 'disabled' : null}
- >
- {this.state.corsEnabled ? 'Disable CORS' : 'Enable CORS'}
- </button>
- </div>
- {originSettings}
- </form>
-
- <ConfirmationModal
- title="Confirm Deletion"
- visible={this.state.deleteDomainModalVisible}
- text={deleteMsg}
- buttonClass="btn-danger"
- onClose={Actions.hideDeleteDomainModal}
- onSubmit={this.deleteOrigin}
- successButtonLabel="Delete Domain" />
- </div>
- );
+ enableCorsChange: function () {
+ if (this.state.corsEnabled && !_.isEmpty(this.state.origins) ) {
+ var result = window.confirm(app.i18n.en_US['cors-disable-cors-prompt']);
+ if (!result) { return; }
+ }
+
+ Actions.toggleEnableCors();
+ },
+
+ save: function () {
+ Actions.saveCors({
+ enableCors: this.state.corsEnabled,
+ origins: this.state.origins,
+ node: this.state.node
+ });
+ },
+
+ originChange: function (isAllOrigins) {
+ if (isAllOrigins && !_.isEmpty(this.state.origins)) {
+ var result = window.confirm('Are you sure? Switching to all origin domains will overwrite your specific origin domains.');
+ if (!result) { return; }
}
- });
+ Actions.originChange(isAllOrigins);
+ },
- return {
- CORSController: CORSController,
- OriginInput: OriginInput,
- Origins: Origins,
- OriginTable: OriginTable,
- OriginRow: OriginRow
- };
+ addOrigin: function (origin) {
+ Actions.addOrigin(origin);
+ },
+
+ updateOrigin: function (updatedOrigin, originalOrigin) {
+ Actions.updateOrigin(updatedOrigin, originalOrigin);
+ },
+
+ methodChange: function (httpMethod) {
+ Actions.methodChange(httpMethod);
+ },
+
+ deleteOrigin: function () {
+ Actions.deleteOrigin(this.state.domainToDelete);
+ },
+
+ render: function () {
+ var isVisible = _.all([this.state.corsEnabled, !this.state.isAllOrigins]);
+
+ var originSettings = (
+ <div id={this.state.corsEnabled ? 'collapsing-container' : ''}>
+ <Origins corsEnabled={this.state.corsEnabled} originChange={this.originChange} isAllOrigins={this.state.isAllOrigins}/>
+ <OriginTable updateOrigin={this.updateOrigin} isVisible={isVisible} origins={this.state.origins} />
+ <OriginInput addOrigin={this.addOrigin} isVisible={isVisible} />
+ </div>
+ );
+
+ if (this.state.isLoading) {
+ originSettings = (<LoadLines />);
+ }
+ var deleteMsg = <span>Are you sure you want to delete <code>{_.escape(this.state.domainToDelete)}</code>?</span>;
+
+ return (
+ <div className="cors-page flex-body">
+ <header id="cors-header">
+ <p>{app.i18n.en_US['cors-notice']}</p>
+ </header>
+
+ <form id="corsForm" onSubmit={this.save}>
+ <div className="cors-enable">
+ {this.state.corsEnabled ? 'Cors is currently enabled.' : 'Cors is currently disabled.'}
+ <br />
+ <button
+ type="button"
+ className="enable-disable btn btn-success"
+ onClick={this.enableCorsChange}
+ disabled={this.state.isLoading ? 'disabled' : null}
+ >
+ {this.state.corsEnabled ? 'Disable CORS' : 'Enable CORS'}
+ </button>
+ </div>
+ {originSettings}
+ </form>
+
+ <ConfirmationModal
+ title="Confirm Deletion"
+ visible={this.state.deleteDomainModalVisible}
+ text={deleteMsg}
+ buttonClass="btn-danger"
+ onClose={Actions.hideDeleteDomainModal}
+ onSubmit={this.deleteOrigin}
+ successButtonLabel="Delete Domain" />
+ </div>
+ );
+ }
});
+
+
+export default {
+ CORSController: CORSController,
+ OriginInput: OriginInput,
+ Origins: Origins,
+ OriginTable: OriginTable,
+ OriginRow: OriginRow
+};
http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/0ca35da7/app/addons/cors/resources.js
----------------------------------------------------------------------
diff --git a/app/addons/cors/resources.js b/app/addons/cors/resources.js
index 7aa6194..73a2091 100644
--- a/app/addons/cors/resources.js
+++ b/app/addons/cors/resources.js
@@ -10,106 +10,101 @@
// License for the specific language governing permissions and limitations under
// the License.
-define([
- '../../app',
- '../../core/api'
-],
+import app from "../../app";
+import FauxtonAPI from "../../core/api";
+var CORS = FauxtonAPI.addon();
-function (app, FauxtonAPI) {
- var CORS = FauxtonAPI.addon();
+CORS.Config = FauxtonAPI.Model.extend({
+ url: function () {
+ if (!this.get('node')) {
+ throw new Error('node not set');
+ }
- CORS.Config = FauxtonAPI.Model.extend({
- url: function () {
- if (!this.get('node')) {
- throw new Error('node not set');
- }
+ return window.location.origin + '/_node/' + this.get('node') + '/_config/cors';
+ },
- return window.location.origin + '/_node/' + this.get('node') + '/_config/cors';
- },
+ parse: function (resp) {
+ var origins = !resp.origins ? [] : resp.origins.split(',');
- parse: function (resp) {
- var origins = !resp.origins ? [] : resp.origins.split(',');
+ return {
+ origins: origins,
+ methods: resp.methods,
+ credentials: resp.credentials,
+ headers: resp.headers
+ };
+ }
+});
- return {
- origins: origins,
- methods: resp.methods,
- credentials: resp.credentials,
- headers: resp.headers
- };
+CORS.Httpd = FauxtonAPI.Model.extend({
+ url: function () {
+ if (!this.get('node')) {
+ throw new Error('node not set');
}
- });
-
- CORS.Httpd = FauxtonAPI.Model.extend({
- url: function () {
- if (!this.get('node')) {
- throw new Error('node not set');
- }
- return window.location.origin + '/_node/' + this.get('node') + '/_config/httpd';
- },
+ return window.location.origin + '/_node/' + this.get('node') + '/_config/httpd';
+ },
- corsEnabled: function () {
- var enabledCors = this.get('enable_cors');
+ corsEnabled: function () {
+ var enabledCors = this.get('enable_cors');
- if (_.isUndefined(enabledCors)) {
- return false;
- }
-
- return enabledCors === 'true';
+ if (_.isUndefined(enabledCors)) {
+ return false;
}
- });
+ return enabledCors === 'true';
+ }
- CORS.ConfigModel = Backbone.Model.extend({
- documentation: 'cors',
+});
- url: function () {
- if (!this.get('node')) {
- throw new Error('node not set');
- }
+CORS.ConfigModel = Backbone.Model.extend({
+ documentation: 'cors',
- return app.host + '/_node/' + this.get('node') + '/_config/' +
- encodeURIComponent(this.get('section')) + '/' + encodeURIComponent(this.get('attribute'));
- },
+ url: function () {
+ if (!this.get('node')) {
+ throw new Error('node not set');
+ }
- isNew: function () { return false; },
+ return app.host + '/_node/' + this.get('node') + '/_config/' +
+ encodeURIComponent(this.get('section')) + '/' + encodeURIComponent(this.get('attribute'));
+ },
- sync: function (method, model, options) {
+ isNew: function () { return false; },
- var params = {
- url: model.url(),
- contentType: 'application/json',
- dataType: 'json',
- data: JSON.stringify(model.get('value'))
- };
+ sync: function (method, model, options) {
- if (method === 'delete') {
- params.type = 'DELETE';
- } else {
- params.type = 'PUT';
- }
+ var params = {
+ url: model.url(),
+ contentType: 'application/json',
+ dataType: 'json',
+ data: JSON.stringify(model.get('value'))
+ };
- return $.ajax(params);
+ if (method === 'delete') {
+ params.type = 'DELETE';
+ } else {
+ params.type = 'PUT';
}
- });
+ return $.ajax(params);
+ }
- // simple helper function to validate the user entered a valid domain starting with http(s)
- CORS.validateCORSDomain = function (str) {
- return (/^https?:\/\/(.*)(:\d{2,5})?$/).test(str);
- };
+});
- CORS.normalizeUrls = function (url) {
- var el = document.createElement('a');
- el.href = url;
+// simple helper function to validate the user entered a valid domain starting with http(s)
+CORS.validateCORSDomain = function (str) {
+ return (/^https?:\/\/(.*)(:\d{2,5})?$/).test(str);
+};
- if (/:/.test(url)) {
- return el.protocol + '//' + el.host;
- }
+CORS.normalizeUrls = function (url) {
+ var el = document.createElement('a');
+ el.href = url;
- return el.protocol + '//' + el.hostname;
- };
+ if (/:/.test(url)) {
+ return el.protocol + '//' + el.host;
+ }
- return CORS;
-});
+ return el.protocol + '//' + el.hostname;
+};
+
+export default CORS;
http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/0ca35da7/app/addons/cors/stores.js
----------------------------------------------------------------------
diff --git a/app/addons/cors/stores.js b/app/addons/cors/stores.js
index 4ee27bc..e8fdd62 100644
--- a/app/addons/cors/stores.js
+++ b/app/addons/cors/stores.js
@@ -10,184 +10,181 @@
// License for the specific language governing permissions and limitations under
// the License.
-define([
- "../../core/api",
- "./actiontypes"
-], function (FauxtonAPI, ActionTypes) {
-
- var CorsStore = FauxtonAPI.Store.extend({
-
- initialize: function () {
- this.reset();
- },
-
- reset: function () {
- this._deleteDomainModalVisible = false;
- this._domainToDelete = '';
- },
-
- editCors: function (options) {
- this._isEnabled = options.isEnabled;
- this._origins = options.origins;
- this._configChanged = false;
- this._shouldSaveChange = false;
- this._node = options.node;
- this._isLoading = false;
- },
-
- shouldSaveChange: function () {
- return this._shouldSaveChange;
- },
-
- hasConfigChanged: function () {
- return this._configChanged;
- },
-
- setConfigChanged: function () {
- this._configChanged = true;
- },
-
- setConfigSaved: function () {
- this._configChanged = false;
- },
-
- setIsLoading: function (state) {
- this._isLoading = state;
- this._shouldSaveChange = false;
- },
-
- getIsLoading: function () {
- return this._isLoading;
- },
-
- isEnabled: function () {
- return this._isEnabled;
- },
-
- addOrigin: function (origin) {
- this._origins.push(origin);
- },
-
- deleteOrigin: function (origin) {
- var index = _.indexOf(this._origins, origin);
-
- if (index === -1) { return; }
-
- this._origins.splice(index, 1);
- },
-
- originChange: function (isAllOrigins) {
- if (isAllOrigins) {
- this._origins = ['*'];
- return;
- }
-
- this._origins = [];
- },
-
- getOrigins: function () {
- return this._origins;
- },
-
- getNode: function () {
- return this._node;
- },
-
- isAllOrigins: function () {
- var origins = this.getOrigins();
- return _.include(origins, '*');
- },
-
- toggleEnableCors: function () {
- this._isEnabled = !this._isEnabled;
- },
-
- updateOrigin: function (updatedOrigin, originalOrigin) {
- this.deleteOrigin(originalOrigin);
- this.addOrigin(updatedOrigin);
- },
-
- showDeleteDomainModal: function (domain) {
- this._domainToDelete = domain;
- this._deleteDomainModalVisible = true;
- this._shouldSaveChange = false;
- },
-
- hideDeleteDomainModal: function () {
- this._deleteDomainModalVisible = false;
- this._shouldSaveChange = false;
- },
-
- isDeleteDomainModalVisible: function () {
- return this._deleteDomainModalVisible;
- },
-
- getDomainToDelete: function () {
- return this._domainToDelete;
- },
-
- dispatch: function (action) {
- // it should save after any change is triggered except for EDIT_CORS which is just to update
- // cors after the first change
- this._shouldSaveChange = true;
-
- switch (action.type) {
- case ActionTypes.EDIT_CORS:
- this.editCors(action.options);
- break;
-
- case ActionTypes.TOGGLE_ENABLE_CORS:
- this.toggleEnableCors();
- this.setConfigChanged();
- break;
-
- case ActionTypes.CORS_ADD_ORIGIN:
- this.addOrigin(action.origin);
- this.setConfigChanged();
- break;
-
- case ActionTypes.CORS_IS_ALL_ORIGINS:
- this.originChange(action.isAllOrigins);
- this.setConfigChanged();
- break;
-
- case ActionTypes.CORS_DELETE_ORIGIN:
- this.deleteOrigin(action.origin);
- this.setConfigChanged();
- break;
-
- case ActionTypes.CORS_UPDATE_ORIGIN:
- this.updateOrigin(action.updatedOrigin, action.originalOrigin);
- this.setConfigChanged();
- break;
-
- case ActionTypes.CORS_SET_IS_LOADING:
- this.setIsLoading(action.isLoading);
- break;
-
- case ActionTypes.CORS_SHOW_DELETE_DOMAIN_MODAL:
- this.showDeleteDomainModal(action.options.domain);
- break;
-
- case ActionTypes.CORS_HIDE_DELETE_DOMAIN_MODAL:
- this.hideDeleteDomainModal();
- break;
-
- default:
- return;
- }
-
- this.triggerChange();
+import FauxtonAPI from "../../core/api";
+import ActionTypes from "./actiontypes";
+
+var CorsStore = FauxtonAPI.Store.extend({
+
+ initialize: function () {
+ this.reset();
+ },
+
+ reset: function () {
+ this._deleteDomainModalVisible = false;
+ this._domainToDelete = '';
+ },
+
+ editCors: function (options) {
+ this._isEnabled = options.isEnabled;
+ this._origins = options.origins;
+ this._configChanged = false;
+ this._shouldSaveChange = false;
+ this._node = options.node;
+ this._isLoading = false;
+ },
+
+ shouldSaveChange: function () {
+ return this._shouldSaveChange;
+ },
+
+ hasConfigChanged: function () {
+ return this._configChanged;
+ },
+
+ setConfigChanged: function () {
+ this._configChanged = true;
+ },
+
+ setConfigSaved: function () {
+ this._configChanged = false;
+ },
+
+ setIsLoading: function (state) {
+ this._isLoading = state;
+ this._shouldSaveChange = false;
+ },
+
+ getIsLoading: function () {
+ return this._isLoading;
+ },
+
+ isEnabled: function () {
+ return this._isEnabled;
+ },
+
+ addOrigin: function (origin) {
+ this._origins.push(origin);
+ },
+
+ deleteOrigin: function (origin) {
+ var index = _.indexOf(this._origins, origin);
+
+ if (index === -1) { return; }
+
+ this._origins.splice(index, 1);
+ },
+
+ originChange: function (isAllOrigins) {
+ if (isAllOrigins) {
+ this._origins = ['*'];
+ return;
}
- });
+ this._origins = [];
+ },
+
+ getOrigins: function () {
+ return this._origins;
+ },
+
+ getNode: function () {
+ return this._node;
+ },
+
+ isAllOrigins: function () {
+ var origins = this.getOrigins();
+ return _.include(origins, '*');
+ },
+
+ toggleEnableCors: function () {
+ this._isEnabled = !this._isEnabled;
+ },
+
+ updateOrigin: function (updatedOrigin, originalOrigin) {
+ this.deleteOrigin(originalOrigin);
+ this.addOrigin(updatedOrigin);
+ },
+
+ showDeleteDomainModal: function (domain) {
+ this._domainToDelete = domain;
+ this._deleteDomainModalVisible = true;
+ this._shouldSaveChange = false;
+ },
+
+ hideDeleteDomainModal: function () {
+ this._deleteDomainModalVisible = false;
+ this._shouldSaveChange = false;
+ },
+
+ isDeleteDomainModalVisible: function () {
+ return this._deleteDomainModalVisible;
+ },
+
+ getDomainToDelete: function () {
+ return this._domainToDelete;
+ },
+
+ dispatch: function (action) {
+ // it should save after any change is triggered except for EDIT_CORS which is just to update
+ // cors after the first change
+ this._shouldSaveChange = true;
+
+ switch (action.type) {
+ case ActionTypes.EDIT_CORS:
+ this.editCors(action.options);
+ break;
+
+ case ActionTypes.TOGGLE_ENABLE_CORS:
+ this.toggleEnableCors();
+ this.setConfigChanged();
+ break;
+
+ case ActionTypes.CORS_ADD_ORIGIN:
+ this.addOrigin(action.origin);
+ this.setConfigChanged();
+ break;
+
+ case ActionTypes.CORS_IS_ALL_ORIGINS:
+ this.originChange(action.isAllOrigins);
+ this.setConfigChanged();
+ break;
+
+ case ActionTypes.CORS_DELETE_ORIGIN:
+ this.deleteOrigin(action.origin);
+ this.setConfigChanged();
+ break;
+
+ case ActionTypes.CORS_UPDATE_ORIGIN:
+ this.updateOrigin(action.updatedOrigin, action.originalOrigin);
+ this.setConfigChanged();
+ break;
+
+ case ActionTypes.CORS_SET_IS_LOADING:
+ this.setIsLoading(action.isLoading);
+ break;
+
+ case ActionTypes.CORS_SHOW_DELETE_DOMAIN_MODAL:
+ this.showDeleteDomainModal(action.options.domain);
+ break;
+
+ case ActionTypes.CORS_HIDE_DELETE_DOMAIN_MODAL:
+ this.hideDeleteDomainModal();
+ break;
+
+ default:
+ return;
+ }
+ this.triggerChange();
+ }
- var corsStore = new CorsStore();
+});
- corsStore.dispatchToken = FauxtonAPI.dispatcher.register(corsStore.dispatch.bind(corsStore));
- return {
- corsStore: corsStore
- };
-});
+var corsStore = new CorsStore();
+
+corsStore.dispatchToken = FauxtonAPI.dispatcher.register(corsStore.dispatch.bind(corsStore));
+
+export default {
+ corsStore: corsStore
+};
http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/0ca35da7/app/addons/cors/tests/actionsSpecs.js
----------------------------------------------------------------------
diff --git a/app/addons/cors/tests/actionsSpecs.js b/app/addons/cors/tests/actionsSpecs.js
index 47d31c6..9b4fb7a 100644
--- a/app/addons/cors/tests/actionsSpecs.js
+++ b/app/addons/cors/tests/actionsSpecs.js
@@ -9,122 +9,118 @@
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
-define([
- '../../../app',
- 'testUtils',
- '../../../core/api',
- '../actions',
- 'sinon'
-], function (app, testUtils, FauxtonAPI, Actions, sinon) {
- var assert = testUtils.assert;
+import app from "../../../app";
+import testUtils from "testUtils";
+import FauxtonAPI from "../../../core/api";
+import Actions from "../actions";
+import sinon from "sinon";
+var assert = testUtils.assert;
- describe('CORS actions', function () {
+describe('CORS actions', function () {
- describe('save', function () {
+ describe('save', function () {
- afterEach(function () {
- Actions.saveCorsOrigins.restore && Actions.saveCorsOrigins.restore();
+ afterEach(function () {
+ Actions.saveCorsOrigins.restore && Actions.saveCorsOrigins.restore();
+ });
+
+ it('should save cors enabled to httpd', function () {
+ var spy = sinon.spy(Actions, 'saveEnableCorsToHttpd');
+
+ Actions.saveCors({
+ enableCors: false
});
- it('should save cors enabled to httpd', function () {
- var spy = sinon.spy(Actions, 'saveEnableCorsToHttpd');
+ assert.ok(spy.calledWith(false));
+ });
- Actions.saveCors({
- enableCors: false
- });
+ it('does not save cors origins if cors not enabled', function () {
+ var spy = sinon.spy(Actions, 'saveCorsOrigins');
- assert.ok(spy.calledWith(false));
+ Actions.saveCors({
+ enableCors: false,
+ origins: ['*']
});
- it('does not save cors origins if cors not enabled', function () {
- var spy = sinon.spy(Actions, 'saveCorsOrigins');
+ assert.notOk(spy.calledOnce);
+ });
- Actions.saveCors({
- enableCors: false,
- origins: ['*']
- });
+ it('saves cors origins', function () {
+ var spy = sinon.spy(Actions, 'saveCorsOrigins');
- assert.notOk(spy.calledOnce);
+ Actions.saveCors({
+ enableCors: true,
+ origins: ['*']
});
- it('saves cors origins', function () {
- var spy = sinon.spy(Actions, 'saveCorsOrigins');
+ assert.ok(spy.calledWith('*'));
+ });
- Actions.saveCors({
- enableCors: true,
- origins: ['*']
- });
+ it('saves cors allow credentials', function () {
+ var spy = sinon.spy(Actions, 'saveCorsCredentials');
- assert.ok(spy.calledWith('*'));
+ Actions.saveCors({
+ enableCors: true,
+ origins: ['https://testdomain.com']
});
- it('saves cors allow credentials', function () {
- var spy = sinon.spy(Actions, 'saveCorsCredentials');
+ assert.ok(spy.calledOnce);
+ });
- Actions.saveCors({
- enableCors: true,
- origins: ['https://testdomain.com']
- });
+ it('saves cors headers', function () {
+ var spy = sinon.spy(Actions, 'saveCorsHeaders');
- assert.ok(spy.calledOnce);
+ Actions.saveCors({
+ enableCors: true,
+ origins: ['https://testdomain.com']
});
- it('saves cors headers', function () {
- var spy = sinon.spy(Actions, 'saveCorsHeaders');
+ assert.ok(spy.calledOnce);
+ });
- Actions.saveCors({
- enableCors: true,
- origins: ['https://testdomain.com']
- });
+ it('saves cors methods', function () {
+ var spy = sinon.spy(Actions, 'saveCorsMethods');
- assert.ok(spy.calledOnce);
+ Actions.saveCors({
+ enableCors: true,
+ origins: ['https://testdomain.com']
});
- it('saves cors methods', function () {
- var spy = sinon.spy(Actions, 'saveCorsMethods');
-
- Actions.saveCors({
- enableCors: true,
- origins: ['https://testdomain.com']
- });
+ assert.ok(spy.calledOnce);
- assert.ok(spy.calledOnce);
+ });
- });
+ it('shows notification on successful save', function () {
+ var stub = sinon.stub(FauxtonAPI, 'when');
+ var spy = sinon.spy(FauxtonAPI, 'addNotification');
+ var promise = FauxtonAPI.Deferred();
+ promise.resolve();
+ stub.returns(promise);
- it('shows notification on successful save', function () {
- var stub = sinon.stub(FauxtonAPI, 'when');
- var spy = sinon.spy(FauxtonAPI, 'addNotification');
- var promise = FauxtonAPI.Deferred();
- promise.resolve();
- stub.returns(promise);
-
- Actions.saveCors({
- enableCors: true,
- origins: ['https://testdomain.com']
- });
-
- assert.ok(spy.calledOnce);
- FauxtonAPI.when.restore();
- FauxtonAPI.addNotification.restore();
+ Actions.saveCors({
+ enableCors: true,
+ origins: ['https://testdomain.com']
});
+ assert.ok(spy.calledOnce);
+ FauxtonAPI.when.restore();
+ FauxtonAPI.addNotification.restore();
});
- describe('Sanitize origins', function () {
+ });
- it('joins array into string', function () {
- var origins = ['https://hello.com', 'https://hello2.com'];
+ describe('Sanitize origins', function () {
- assert.deepEqual(Actions.sanitizeOrigins(origins), origins.join(','));
- });
+ it('joins array into string', function () {
+ var origins = ['https://hello.com', 'https://hello2.com'];
- it('returns empty string for no origins', function () {
- var origins = [];
+ assert.deepEqual(Actions.sanitizeOrigins(origins), origins.join(','));
+ });
- assert.deepEqual(Actions.sanitizeOrigins(origins), '');
- });
+ it('returns empty string for no origins', function () {
+ var origins = [];
+
+ assert.deepEqual(Actions.sanitizeOrigins(origins), '');
});
});
-
});