all list and listitem views now use generic templates
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 @@
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 @@
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 @@
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[collection_name + "AddChildView"] = addClass;
- itemViewClass = XOSItemView.extend({
- detailClass: detailClass,
- template: tr_template,
- app: XOSAdminApp,
- detailNavLink: detailNavLink,
- });
+ if ($(tr_template).length) {
+ itemViewClass = XOSItemView.extend({
+ template: tr_template,
+ app: XOSAdminApp,
+ });
+ } else {
+ itemViewClass = genericItemViewClass;
+ }
- listViewClass = XOSListView.extend({
- childView: itemViewClass,
- template: table_template,
- collection: xos[collection_name],
- title: name + "s",
- app: XOSAdminApp,
- });
+ 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
templateHelpers: function() {
return { title: this.title,
- addChildHash: this.getAddChildHash() };
+ addChildHash: this.getAddChildHash(),
+ foreignFields: this.collection.foreignFields,
+ listFields: this.collection.listFields,
+ detailLinkFields: this.collection.detailLinkFields, };
},
});