You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ro...@apache.org on 2015/02/27 11:13:17 UTC
fauxton commit: updated refs/heads/master to b29ad53
Repository: couchdb-fauxton
Updated Branches:
refs/heads/master 3c4fa9568 -> b29ad53cf
Update the CSS and some controls for the CORS page:
- the 'update' input field for editing a domain name, now automatically
resizes and no longer overlaps the pencil/trashcan buttons
- users can hit 'enter' to validate and submit the 'Update' domain and
'Add' domain fields
- page does not return an empty origin, if "specific origins" is set, but
there are no domains on that list
closes COUCHDB-2569
Project: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/commit/b29ad53c
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/tree/b29ad53c
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/diff/b29ad53c
Branch: refs/heads/master
Commit: b29ad53cfc3df39dd91412ec01c54d75be6ceab6
Parents: 3c4fa95
Author: michellephung@gmail.com <mi...@gmail.com>
Authored: Fri Feb 6 15:47:56 2015 -0500
Committer: Robert Kowalski <ro...@apache.org>
Committed: Fri Feb 27 11:12:46 2015 +0100
----------------------------------------------------------------------
app/addons/cors/assets/less/cors.less | 14 ++++++++++
app/addons/cors/components.react.jsx | 30 ++++++++++++++++-----
app/addons/cors/resources.js | 16 ++++++-----
app/addons/cors/tests/componentsSpec.react.jsx | 11 ++++++--
app/addons/cors/tests/resourcesSpec.js | 16 +++++++----
app/addons/cors/views.js | 2 +-
6 files changed, 67 insertions(+), 22 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/b29ad53c/app/addons/cors/assets/less/cors.less
----------------------------------------------------------------------
diff --git a/app/addons/cors/assets/less/cors.less b/app/addons/cors/assets/less/cors.less
index ce6dc7e..0d48352 100644
--- a/app/addons/cors/assets/less/cors.less
+++ b/app/addons/cors/assets/less/cors.less
@@ -86,6 +86,20 @@
input[type='text'] {
width: 100%;
}
+
+ .input-append.edit-domain-section {
+ width : 100%;
+ margin-bottom: 0px;
+
+ input {
+ width: calc(100% ~"-" 82px);
+ /*
+ the 'update' button is 76 px wide,
+ so 82px gives it a little room
+ compatible browsers: http://caniuse.com/#feat=calc
+ */
+ }
+ }
}
#origin-domain-table {
http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/b29ad53c/app/addons/cors/components.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/cors/components.react.jsx b/app/addons/cors/components.react.jsx
index 583c8c0..65d7cfc 100644
--- a/app/addons/cors/components.react.jsx
+++ b/app/addons/cors/components.react.jsx
@@ -69,11 +69,17 @@ define([
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} value={this.state.updatedOrigin} />
+ <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>
);
@@ -152,6 +158,12 @@ define([
this.setState({origin: ''});
},
+ onKeyUp: function (e) {
+ if (e.keyCode == 13) { //enter key
+ return this.addOrigin(e);
+ }
+ },
+
render: function () {
if (!this.props.isVisible) {
return null;
@@ -161,7 +173,7 @@ define([
<div id= "origin-domains-container">
<div className= "origin-domains">
<div className="input-append">
- <input type="text" name="new_origin_domain" onChange={this.onInputChange} value={this.state.origin} placeholder="e.g., https://site.com"/>
+ <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>
@@ -174,6 +186,13 @@ define([
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
+ }
+
this.props.originChange(event.target.value === 'all');
},
@@ -188,10 +207,10 @@ define([
<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 origin domains ( * )
+ <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 origin domains
+ <input type="radio" checked={!this.props.isAllOrigins} value="selected" onChange={this.onOriginChange} name="selected-domains"/> Restrict to specific domains
</label>
</div>
);
@@ -309,9 +328,6 @@ define([
<OriginInput addOrigin={this.addOrigin} isVisible={isVisible} />
</div>
- <div className="form-actions">
- </div>
-
</form>
</div>
);
http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/b29ad53c/app/addons/cors/resources.js
----------------------------------------------------------------------
diff --git a/app/addons/cors/resources.js b/app/addons/cors/resources.js
index 4cf4f10..867c356 100644
--- a/app/addons/cors/resources.js
+++ b/app/addons/cors/resources.js
@@ -24,13 +24,15 @@ function (app, FauxtonAPI) {
return app.host + '/_config/cors';
},
- getOrigins: function () {
- var origins = this.get('origins');
- if (_.isUndefined(origins)) {
- return [];
- }
-
- return origins.split(',');
+ parse: function (resp) {
+ var origins = !resp.origins ? [] : resp.origins.split(',');
+
+ return {
+ origins: origins,
+ methods: resp.methods,
+ credentials: resp.credentials,
+ headers: resp.headers
+ };
}
});
http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/b29ad53c/app/addons/cors/tests/componentsSpec.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/cors/tests/componentsSpec.react.jsx b/app/addons/cors/tests/componentsSpec.react.jsx
index 5880257..20d84c3 100644
--- a/app/addons/cors/tests/componentsSpec.react.jsx
+++ b/app/addons/cors/tests/componentsSpec.react.jsx
@@ -108,7 +108,7 @@ define([
assert.ok(spy.calledWith(newOrigin));
});
- it('calls addOrogin AddOrigin on add click with valid domain', function () {
+ it('calls addOrigin on add click with valid domain', function () {
TestUtils.Simulate.change($(inputEl.getDOMNode()).find('input')[0],{target: {value: newOrigin}});
TestUtils.Simulate.click($(inputEl.getDOMNode()).find('.btn')[0]);
assert.ok(addOrigin.calledWith(newOrigin));
@@ -140,7 +140,14 @@ define([
assert.ok(changeOrigin.calledWith(true));
});
- it('calls change Origin on selected origins selected', function () {
+ it('calls changeOrigin() when you switch from "Allow All Origins" to "Select List of Origins"', function () {
+ //changeOrigin(true) = sets origins to ['*']
+ //changeOrigin(false) = sets origins to [] (an empty array which user can populate with URLs)
+
+ //this test begins with 'select origins' checked,
+ //1. render radio buttons with 'all origins'
+ originEl = TestUtils.renderIntoDocument(<Views.Origins corsEnabled={true} isAllOrigins={true} originChange={changeOrigin}/>, container);
+ //2. switch back to 'select origins'
TestUtils.Simulate.change($(originEl.getDOMNode()).find('input[value="selected"]')[0]);
assert.ok(changeOrigin.calledWith(false));
});
http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/b29ad53c/app/addons/cors/tests/resourcesSpec.js
----------------------------------------------------------------------
diff --git a/app/addons/cors/tests/resourcesSpec.js b/app/addons/cors/tests/resourcesSpec.js
index 2d2c8d0..2d61846 100644
--- a/app/addons/cors/tests/resourcesSpec.js
+++ b/app/addons/cors/tests/resourcesSpec.js
@@ -25,16 +25,22 @@ define([
it('Splits up origins into array', function () {
var origins = ['http://hello.com', 'http://another.co.a'];
- cors.set({origins: origins.join(',')});
-
- assert.deepEqual(cors.getOrigins(), origins);
+ cors.set(cors.parse({origins: origins.join(',')}));
+ assert.deepEqual(cors.get('origins'), origins);
});
it('returns empty array for undefined', function () {
-
- assert.deepEqual(cors.getOrigins(), []);
+ var origins = { origins : undefined };
+ cors.set(cors.parse(origins));
+ assert.deepEqual(cors.get('origins'), []);
});
+ it('does not return an empty string (empty origin), when "specific origins" is set, but there are no domains on that list', function () {
+ var emptyOrigins = {origins: ''};
+ cors.set(cors.parse(emptyOrigins));
+ assert.deepEqual(cors.get('origins') , []);
+ });
+
});
http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/b29ad53c/app/addons/cors/views.js
----------------------------------------------------------------------
diff --git a/app/addons/cors/views.js b/app/addons/cors/views.js
index 341b427..66e2f94 100644
--- a/app/addons/cors/views.js
+++ b/app/addons/cors/views.js
@@ -35,7 +35,7 @@ function (app, FauxtonAPI, CORS, Components, Actions) {
afterRender: function () {
Actions.editCors({
- origins: this.cors.getOrigins(),
+ origins: this.cors.get('origins'),
isEnabled: this.httpd.corsEnabled()
});
Components.renderCORS(this.el);