diff options
author | Ryan Ramage <ryan.ramage@gmail.com> | 2013-05-10 09:10:02 -0600 |
---|---|---|
committer | Ryan Ramage <ryan.ramage@gmail.com> | 2013-05-10 23:41:32 -0600 |
commit | 4615a788dcc1ab00d0f63b43530aa6921654c538 (patch) | |
tree | a79e3cae544a4768269e3fa9c933f6d71cfbd776 /src/fauxton/js/addons/config | |
parent | 65107660fa11b05d69476b76e69c66486b44bfea (diff) | |
download | couchdb-4615a788dcc1ab00d0f63b43530aa6921654c538.tar.gz |
Restructure to simpler jam/erica style.
- compile less files, templates into compiled requirejs
- Add simple rebuild command, to control minification,
- Add simple push command, to eash couchapp push.
Slight readme improvement
Diffstat (limited to 'src/fauxton/js/addons/config')
-rw-r--r-- | src/fauxton/js/addons/config/base.js | 28 | ||||
-rw-r--r-- | src/fauxton/js/addons/config/resources.js | 177 | ||||
-rw-r--r-- | src/fauxton/js/addons/config/routes.js | 44 | ||||
-rw-r--r-- | src/fauxton/js/addons/config/templates/dashboard.html | 52 | ||||
-rw-r--r-- | src/fauxton/js/addons/config/templates/item.html | 31 |
5 files changed, 332 insertions, 0 deletions
diff --git a/src/fauxton/js/addons/config/base.js b/src/fauxton/js/addons/config/base.js new file mode 100644 index 000000000..a4fa52f37 --- /dev/null +++ b/src/fauxton/js/addons/config/base.js @@ -0,0 +1,28 @@ +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// 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([ + "js/app", + + "js/api", + + // Modules + "js/addons/config/routes" +], + +function(app, FauxtonAPI, Config) { + Config.initialize = function() { + FauxtonAPI.addHeaderLink({title: "Config", href: "#_config"}); + }; + + return Config; +}); diff --git a/src/fauxton/js/addons/config/resources.js b/src/fauxton/js/addons/config/resources.js new file mode 100644 index 000000000..fcc3af36d --- /dev/null +++ b/src/fauxton/js/addons/config/resources.js @@ -0,0 +1,177 @@ +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// 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([ + "js/app", + "js/api", + "text!js/addons/config/templates/item.html", + "text!js/addons/config/templates/dashboard.html" +], + +function (app, FauxtonAPI) { + + var Config = FauxtonAPI.addon(); + + Config.Model = Backbone.Model.extend({}); + Config.OptionModel = Backbone.Model.extend({ + + url: function () { + return app.host + '/_config/' + this.get("section") + '/' + this.get("name"); + }, + + isNew: function () { return false; }, + + sync: function (method, model, options) { + + var params = { + url: model.url(), + contentType: 'application/json', + dataType: 'json', + data: JSON.stringify(model.get('value')) + }; + + if (method === 'delete') { + params.type = 'DELETE'; + } else { + params.type = 'PUT'; + } + + return $.ajax(params); + } + }); + + Config.Collection = Backbone.Collection.extend({ + model: Config.Model, + + url: function () { + return app.host + '/_config'; + }, + + parse: function (resp) { + return _.map(resp, function (section, section_name) { + return { + section: section_name, + options: _.map(section, function (option, option_name) { + return { + name: option_name, + value: option + }; + }) + }; + }); + } + }); + + Config.ViewItem = FauxtonAPI.View.extend({ + tagName: "tr", + className: "config-item", + template: "addons/config/templates/item", + + events: { + "click .edit-button": "editValue", + "click #delete-value": "deleteValue", + "click #cancel-value": "cancelEdit", + "click #save-value": "saveValue" + }, + + deleteValue: function (event) { + var result = confirm("Are you sure you want to delete this configuration value?"); + + if (!result) { return; } + + this.model.destroy(); + this.remove(); + }, + + editValue: function (event) { + this.$("#show-value").hide(); + this.$("#edit-value-form").show(); + }, + + saveValue: function (event) { + this.model.save({value: this.$(".value-input").val()}); + this.render(); + }, + + cancelEdit: function (event) { + this.$("#edit-value-form").hide(); + this.$("#show-value").show(); + }, + + serialize: function () { + return {option: this.model.toJSON()}; + } + + }); + + Config.View = FauxtonAPI.View.extend({ + template: "addons/config/templates/dashboard", + + events: { + "click #add-section": "addSection", + "submit #add-section-form": "submitForm" + }, + + submitForm: function (event) { + event.preventDefault(); + var option = new Config.OptionModel({ + section: this.$('input[name="section"]').val(), + name: this.$('input[name="name"]').val(), + value: this.$('input[name="value"]').val() + }); + + 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] + }); + } + + this.$("#add-section-modal").modal('hide'); + this.render(); + }, + + addSection: function (event) { + event.preventDefault(); + this.$("#add-section-modal").modal({show:true}); + }, + + beforeRender: function() { + this.collection.each(function(config) { + _.each(config.get("options"), function (option, index) { + this.insertView("table.config tbody", new Config.ViewItem({ + model: new Config.OptionModel({ + section: config.get("section"), + name: option.name, + value: option.value, + index: index + }) + })); + }, this); + }, this); + }, + + establish: function() { + return [this.collection.fetch()]; + } + }); + + return Config; +}); diff --git a/src/fauxton/js/addons/config/routes.js b/src/fauxton/js/addons/config/routes.js new file mode 100644 index 000000000..49f78fc88 --- /dev/null +++ b/src/fauxton/js/addons/config/routes.js @@ -0,0 +1,44 @@ +// Licensed under the Apache License, Version 2.0 (the "License"); you may not +// use this file except in compliance with the License. You may obtain a copy of +// the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// 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([ + "js/app", + + "js/api", + + // Modules + "js/addons/config/resources" +], + +function(app, FauxtonAPI, Config) { + var configRoute = function () { + var configs = new Config.Collection(); + + return { + layout: "one_pane", + crumbs: [ + {"name": "Config","link": "_config"} + ], + views: { + "#dashboard-content": new Config.View({collection: configs}) + }, + apiUrl: configs.url() + }; + }; + + Config.Routes = { + "_config": configRoute + }; + + return Config; + +}); diff --git a/src/fauxton/js/addons/config/templates/dashboard.html b/src/fauxton/js/addons/config/templates/dashboard.html new file mode 100644 index 000000000..7cff90a15 --- /dev/null +++ b/src/fauxton/js/addons/config/templates/dashboard.html @@ -0,0 +1,52 @@ +<!-- +Licensed under the Apache License, Version 2.0 (the "License"); you may not +use this file except in compliance with the License. You may obtain a copy of +the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +License for the specific language governing permissions and limitations under +the License. +--> + +<div class="row"> + <div class="span2 offset10"> + <button id="add-section" href="#" class="btn btn-primary button-margin"> + <i class="icon-plus icon-white"> </i> + Add Section + </button> + </div> +</div> +<table class="config table table-striped table-bordered"> + <thead> + <th> Section </th> + <th> Option </th> + <th> Value </th> + <th></th> + </thead> + <tbody> + </tbody> +</table> +<div id="add-section-modal" class="modal hide fade"> + <div class="modal-header"> + <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> + <h3>Create Config Option</h3> + </div> + <div class="modal-body"> + <form id="add-section-form" class="form well"> + <label>Section</label> + <input type="text" name="section" placeholder="Section"> + <span class="help-block">Enter an existing section name to add to it.</span> + <input type="text" name="name" placeholder="Name"> + <br/> + <input type="text" name="value" placeholder="Value"> + <div class="modal-footer"> + <button type="button" class="btn" data-dismiss="modal">Cancel</button> + <button type="submit" class="btn btn-primary"> Save </button> + </div> + </form> + </div> +</div> diff --git a/src/fauxton/js/addons/config/templates/item.html b/src/fauxton/js/addons/config/templates/item.html new file mode 100644 index 000000000..3e6e4eeb8 --- /dev/null +++ b/src/fauxton/js/addons/config/templates/item.html @@ -0,0 +1,31 @@ +<!-- +Licensed under the Apache License, Version 2.0 (the "License"); you may not +use this file except in compliance with the License. You may obtain a copy of +the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +License for the specific language governing permissions and limitations under +the License. +--> + +<% if (option.index === 0) {%> +<th> <%= option.section %> </th> +<% } else { %> +<td></td> +<% } %> +<td> <%= option.name %> </td> +<td> + <div id="show-value"> + <%= option.value %> <button class="edit-button"> Edit </button> + </div> + <div id="edit-value-form" style="display:none"> + <input class="value-input" type="text" value="<%= option.value %>" /> + <button id="save-value" class="btn btn-success btn-small"> Save </button> + <button id="cancel-value" class="btn btn-danger btn-small"> Cancel </button> + </div> +</td> +<td id="delete-value"> <i class="icon-trash"> </i> </td> |