summaryrefslogtreecommitdiff
path: root/src/fauxton/js/addons/config
diff options
context:
space:
mode:
authorRyan Ramage <ryan.ramage@gmail.com>2013-05-10 09:10:02 -0600
committerRyan Ramage <ryan.ramage@gmail.com>2013-05-10 23:41:32 -0600
commit4615a788dcc1ab00d0f63b43530aa6921654c538 (patch)
treea79e3cae544a4768269e3fa9c933f6d71cfbd776 /src/fauxton/js/addons/config
parent65107660fa11b05d69476b76e69c66486b44bfea (diff)
downloadcouchdb-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.js28
-rw-r--r--src/fauxton/js/addons/config/resources.js177
-rw-r--r--src/fauxton/js/addons/config/routes.js44
-rw-r--r--src/fauxton/js/addons/config/templates/dashboard.html52
-rw-r--r--src/fauxton/js/addons/config/templates/item.html31
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">&times;</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>