From aafb46a9ab2e06ec52c36c96c0471434c626892c Mon Sep 17 00:00:00 2001 From: Scott Baker Date: Tue, 9 Dec 2014 16:59:08 -0800 Subject: [PATCH] all list and listitem views now use generic templates --- .../core/xoslib/static/js/xosAdminSite.js | 50 +- .../xoslib/static/js/xoslib/xos-backbone.js | 22 +- .../core/xoslib/static/js/xoslib/xosHelper.js | 10 +- .../core/xoslib/templates/xosAdmin.html | 489 +----------------- 4 files changed, 81 insertions(+), 490 deletions(-) diff --git a/planetstack/core/xoslib/static/js/xosAdminSite.js b/planetstack/core/xoslib/static/js/xosAdminSite.js index b9068b5..5274a81 100644 --- a/planetstack/core/xoslib/static/js/xosAdminSite.js +++ b/planetstack/core/xoslib/static/js/xosAdminSite.js @@ -24,10 +24,6 @@ XOSAdminApp.addRegions({ addChildDetail: "#xos-addchild-detail" }); -XOSAdminApp.navigateToModel = function(app, detailClass, detailNavLink, model) { - XOSAdminApp.Router.navigate(detailNavLink + "/" + model.id, {trigger: true}); -}; - XOSAdminApp.navigate = function(what, modelName, modelId) { collection_name = modelName + "s"; if (what=="list") { @@ -69,6 +65,14 @@ XOSAdminApp.buildViews = function() { app: XOSAdminApp}); XOSAdminApp["genericDetailView"] = genericDetailClass; + genericItemViewClass = XOSItemView.extend({template: "#xos-listitem-template", + app: XOSAdminApp}); + XOSAdminApp["genericItemView"] = genericItemViewClass; + + genericListViewClass = XOSListView.extend({template: "#xos-list-template", + app: XOSAdminApp}); + XOSAdminApp["genericListView"] = genericListViewClass; + for (var index in OBJS) { name = OBJS[index]; tr_template = '#xosAdmin-' + name + '-listitem-template'; @@ -77,7 +81,6 @@ XOSAdminApp.buildViews = function() { add_child_template = '#xosAdmin-' + name + '-add-child-template'; collection_name = name + "s"; region_name = name + "List"; - detailNavLink = collection_name; if ($(detail_template).length) { detailClass = XOSDetailView.extend({ @@ -99,20 +102,29 @@ XOSAdminApp.buildViews = function() { } XOSAdminApp[collection_name + "AddChildView"] = addClass; - itemViewClass = XOSItemView.extend({ - detailClass: detailClass, - template: tr_template, - app: XOSAdminApp, - detailNavLink: detailNavLink, - }); - - listViewClass = XOSListView.extend({ - childView: itemViewClass, - template: table_template, - collection: xos[collection_name], - title: name + "s", - app: XOSAdminApp, - }); + if ($(tr_template).length) { + itemViewClass = XOSItemView.extend({ + template: tr_template, + app: XOSAdminApp, + }); + } else { + itemViewClass = genericItemViewClass; + } + + if ($(table_template).length) { + listViewClass = XOSListView.extend({ + childView: itemViewClass, + template: table_template, + collection: xos[collection_name], + title: name + "s", + app: XOSAdminApp, + }); + } else { + listViewClass = genericListViewClass.extend( { childView: itemViewClass, + collection: xos[collection_name], + title: name + "s", + } ); + } XOSAdminApp[collection_name + "ListView"] = listViewClass; diff --git a/planetstack/core/xoslib/static/js/xoslib/xos-backbone.js b/planetstack/core/xoslib/static/js/xoslib/xos-backbone.js index f02aed8..1303633 100644 --- a/planetstack/core/xoslib/static/js/xoslib/xos-backbone.js +++ b/planetstack/core/xoslib/static/js/xoslib/xos-backbone.js @@ -323,6 +323,7 @@ if (! window.XOSLIB_LOADED ) { attrs.inputType = attrs.inputType || {}; attrs.foreignFields = attrs.foreignFields || {}; attrs.readOnlyFields = attrs.readOnlyFields || []; + attrs.detailLinkFields = attrs.detailLinkFields || ["id","name"]; if (!attrs.collectionName) { attrs.collectionName = modelName + "s"; @@ -334,7 +335,7 @@ if (! window.XOSLIB_LOADED ) { for (key in attrs) { value = attrs[key]; - if ($.inArray(key, ["urlRoot", "modelName", "collectionName", "addFields", "detailFields", "foreignFields", "inputType", "relatedCollections", "foreignCollections"])>=0) { + if ($.inArray(key, ["urlRoot", "modelName", "collectionName", "listFields", "addFields", "detailFields", "foreignFields", "inputType", "relatedCollections", "foreignCollections"])>=0) { modelAttrs[key] = value; collectionAttrs[key] = value; } @@ -384,6 +385,7 @@ if (! window.XOSLIB_LOADED ) { foreignCollections: ["slices", "deployments", "images", "nodes", "users"], foreignFields: {"creator": "users", "image": "images", "node": "nodes", "deploymentNetwork": "deployments", "slice": "slices"}, modelName: "sliver", + listFields: ["id", "name", "instance_id", "instance_name", "slice", "deploymentNetwork", "image", "node", "flavor"], addFields: ["slice", "deploymentNetwork", "image", "node"], detailFields: ["name", "instance_id", "instance_name", "slice", "deploymentNetwork", "image", "node", "creator"], preSave: function() { if (!this.attributes.name && this.attributes.slice) { this.attributes.name = xos.idToName(this.attributes.slice, "slices", "name"); } }, @@ -393,7 +395,8 @@ if (! window.XOSLIB_LOADED ) { relatedCollections: {"slivers": "slice", "sliceDeployments": "slice", "slicePrivileges": "slice", "networks": "owner"}, foreignCollections: ["services", "sites"], foreignFields: {"service": "services", "site": "sites"}, - detailFields: ["name", "site", "enabled", "description", "url", "max_slivers"], + listFields: ["id", "name", "enabled", "description", "slice_url", "site", "max_slivers", "service"], + detailFields: ["name", "site", "enabled", "description", "slice_url", "max_slivers"], inputType: {"enabled": "checkbox"}, modelName: "slice", xosValidate: function(attrs, options) { @@ -415,6 +418,7 @@ if (! window.XOSLIB_LOADED ) { foreignCollections: ["slices", "deployments"], modelName: "sliceDeployment", foreignFields: {"slice": "slices", "deployment": "deployments"}, + listFields: ["id", "slice", "deployment", "tenant_id"], detailFields: ["slice", "deployment", "tenant_id"], }); @@ -422,11 +426,13 @@ if (! window.XOSLIB_LOADED ) { foreignCollections: ["slices", "users", "sliceRoles"], modelName: "slicePrivilege", foreignFields: {"user": "users", "slice": "slices", "role": "sliceRoles"}, + listFields: ["id", "user", "slice", "role"], detailFields: ["user", "slice", "role"], }); define_model(this, {urlRoot: SLICEROLE_API, modelName: "sliceRole", + listFields: ["id", "role"], detailFields: ["role"], }); @@ -434,12 +440,14 @@ if (! window.XOSLIB_LOADED ) { foreignCollections: ["sites", "deployments"], modelName: "node", foreignFields: {"site": "sites", "deployment": "deployments"}, + listFields: ["id", "name", "site", "deployment"], detailFields: ["name", "site", "deployment"], }); define_model(this, {urlRoot: SITE_API, relatedCollections: {"users": "site", "slices": "site", "nodes": "site"}, modelName: "site", + listFields: ["id", "name", "site_url", "enabled", "login_base", "is_public", "abbreviated_name"], detailFields: ["name", "abbreviated_name", "url", "enabled", "is_public", "login_base"], inputType: {"enabled": "checkbox", "is_public": "checkbox"}, }); @@ -449,6 +457,7 @@ if (! window.XOSLIB_LOADED ) { foreignCollections: ["sites"], modelName: "user", foreignFields: {"site": "sites"}, + listFields: ["id", "username", "firstname", "lastname", "phone", "user_url", "site"], detailFields: ["username", "firstname", "lastname", "phone", "user_url", "site"], }); @@ -456,23 +465,27 @@ if (! window.XOSLIB_LOADED ) { foreignCollections: ["users","deployments"], modelName: "userDeployment", foreignFields: {"deployment": "deployments", "user": "users"}, + listFields: ["id", "user", "deployment", "kuser_id"], detailFields: ["user", "deployment", "kuser_id"], }); define_model(this, { urlRoot: DEPLOYMENT_API, relatedCollections: {"nodes": "deployment", "slivers": "deploymentNetwork", "networkDeployments": "deployment", "userDeployments": "deployment"}, modelName: "deployment", + listFields: ["id", "name", "backend_type", "admin_tenant"], detailFields: ["name", "backend_type", "admin_tenant"], }); define_model(this, {urlRoot: IMAGE_API, model: this.image, modelName: "image", + listFields: ["id", "name", "disk_format", "container_format", "path"], detailFields: ["name", "disk_format", "admin_tenant"], }); define_model(this, {urlRoot: NETWORKTEMPLATE_API, modelName: "networkTemplate", + listFields: ["id", "name", "visibility", "translation", "sharedNetworkName", "sharedNetworkId"], detailFields: ["name", "description", "visibility", "translation", "sharedNetworkName", "sharedNetworkId"], }); @@ -481,27 +494,32 @@ if (! window.XOSLIB_LOADED ) { foreignCollections: ["slices", "networkTemplates"], modelName: "network", foreignFields: {"template": "networkTemplates", "owner": "slices"}, + listFields: ["id", "name", "template", "ports", "labels", "owner"], detailFields: ["name", "template", "ports", "labels", "owner"], }); define_model(this, {urlRoot: NETWORKSLIVER_API, modelName: "networkSliver", foreignFields: {"network": "networks", "sliver": "slivers"}, + listFields: ["id", "network", "sliver", "ip", "port_id"], detailFields: ["network", "sliver", "ip", "port_id"], }); define_model(this, {urlRoot: NETWORKDEPLOYMENT_API, modelName: "networkDeployment", foreignFields: {"network": "networks", "deployment": "deployments"}, + listFields: ["id", "network", "deployment", "net_id"], detailFields: ["network", "deployment", "net_id"], }); define_model(this, {urlRoot: SERVICE_API, modelName: "service", + listFields: ["id", "name", "enabled", "versionNumber", "published"], detailFields: ["name", "description", "versionNumber"], }); // enhanced REST + // XXX this really needs to somehow be combined with Slice, to avoid duplication define_model(this, {urlRoot: SLICEPLUS_API, relatedCollections: {'slivers': "slice"}, modelName: "slicePlus", diff --git a/planetstack/core/xoslib/static/js/xoslib/xosHelper.js b/planetstack/core/xoslib/static/js/xoslib/xosHelper.js index 9e69aa7..019bae9 100644 --- a/planetstack/core/xoslib/static/js/xoslib/xosHelper.js +++ b/planetstack/core/xoslib/static/js/xoslib/xosHelper.js @@ -530,8 +530,10 @@ XOSDetailView = Marionette.ItemView.extend({ templateHelpers: function() { return { modelName: this.model.modelName, collectionName: this.model.collectionName, addFields: this.model.addFields, + listFields: this.model.listFields, detailFields: this.model.detailFields, foreignFields: this.model.foreignFields, + detailLinkFields: this.model.detailLinkFields, inputType: this.model.inputType, model: this.model, }}, @@ -543,7 +545,6 @@ XOSDetailView = Marionette.ItemView.extend({ extend with: app - MarionetteApplication template - template (See XOSHelper.html) - detailClass - class of detail view, probably an XOSDetailView */ XOSItemView = Marionette.ItemView.extend({ @@ -552,9 +553,11 @@ XOSItemView = Marionette.ItemView.extend({ templateHelpers: function() { return { modelName: this.model.modelName, collectionName: this.model.collectionName, + listFields: this.model.listFields, addFields: this.model.addFields, detailFields: this.model.detailFields, foreignFields: this.model.foreignFields, + detailLinkFields: this.model.detailLinkFields, inputType: this.model.inputType, model: this.model, }}, @@ -634,7 +637,10 @@ XOSListView = FilteredCompositeView.extend({ templateHelpers: function() { return { title: this.title, - addChildHash: this.getAddChildHash() }; + addChildHash: this.getAddChildHash(), + foreignFields: this.collection.foreignFields, + listFields: this.collection.listFields, + detailLinkFields: this.collection.detailLinkFields, }; }, }); diff --git a/planetstack/core/xoslib/templates/xosAdmin.html b/planetstack/core/xoslib/templates/xosAdmin.html index 3848fc0..8047580 100644 --- a/planetstack/core/xoslib/templates/xosAdmin.html +++ b/planetstack/core/xoslib/templates/xosAdmin.html @@ -108,7 +108,7 @@ <% _.each(addFields, function(fieldName) { %> - <% readOnly = $.inArray(fieldName, model.readOnlyFields)>=0 ? " readonly" : ""; console.log(fieldName + " " + readOnly); console.log(model.readOnlyFields); %> + <% readOnly = $.inArray(fieldName, model.readOnlyFields)>=0 ? " readonly" : ""; %> <% if (fieldName in foreignFields) { %> <% } else if (inputType[fieldName] == "checkbox") { %> @@ -129,12 +129,13 @@
<%= fieldNameToHumanReadable(fieldName) %>:<%= idToSelect(fieldName, model.attributes[fieldName], foreignFields[fieldName], "humanReadableName", readOnly) %>
<% console.log(model); _.each(detailFields, function(fieldName) { %> + <% readOnly = $.inArray(fieldName, model.readOnlyFields)>=0 ? " readonly" : ""; console.log(fieldName + " " + readOnly); console.log(model.readOnlyFields); %> <% if (fieldName in foreignFields) { %> - + <% } else if (inputType[fieldName] == "checkbox") { %> - + <% } else { %> - + <% } %> <% }); %> @@ -143,478 +144,32 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- 2.43.0
<%= fieldNameToHumanReadable(fieldName) %>:<%= idToSelect(fieldName, model.attributes[fieldName], foreignFields[fieldName], "humanReadableName") %><%= idToSelect(fieldName, model.attributes[fieldName], foreignFields[fieldName], "humanReadableName", readOnly) %>><%= readOnly %>>>