From b792c17a93b58536334dd238267677558ad533ee Mon Sep 17 00:00:00 2001 From: Scott Baker Date: Sun, 7 Dec 2014 22:27:09 -0800 Subject: [PATCH] all detail templates replaced by generic --- .../core/xoslib/static/js/xosAdminSite.js | 36 ++- .../xoslib/static/js/xoslib/xos-backbone.js | 93 +++++-- .../core/xoslib/static/js/xoslib/xosHelper.js | 22 +- .../core/xoslib/templates/xosAdmin.html | 249 +++--------------- 4 files changed, 163 insertions(+), 237 deletions(-) diff --git a/planetstack/core/xoslib/static/js/xosAdminSite.js b/planetstack/core/xoslib/static/js/xosAdminSite.js index d265630..b9068b5 100644 --- a/planetstack/core/xoslib/static/js/xosAdminSite.js +++ b/planetstack/core/xoslib/static/js/xosAdminSite.js @@ -61,21 +61,44 @@ XOSAdminApp.updateNavigationPanel = function() { }; XOSAdminApp.buildViews = function() { + genericAddChildClass = XOSDetailView.extend({template: "#xos-add-template", + app: XOSAdminApp}); + XOSAdminApp["genericAddChildView"] = genericAddChildClass; + + genericDetailClass = XOSDetailView.extend({template: "#xos-detail-template", + app: XOSAdminApp}); + XOSAdminApp["genericDetailView"] = genericDetailClass; + for (var index in OBJS) { name = OBJS[index]; tr_template = '#xosAdmin-' + name + '-listitem-template'; table_template = '#xosAdmin-' + name + '-list-template'; detail_template = '#xosAdmin-' + name + '-detail-template'; + add_child_template = '#xosAdmin-' + name + '-add-child-template'; collection_name = name + "s"; region_name = name + "List"; detailNavLink = collection_name; - detailClass = XOSDetailView.extend({ - template: detail_template, - app: XOSAdminApp, - }); + if ($(detail_template).length) { + detailClass = XOSDetailView.extend({ + template: detail_template, + app: XOSAdminApp, + }); + } else { + detailClass = genericDetailClass; + } XOSAdminApp[collection_name + "DetailView"] = detailClass; - + + if ($(add_child_template).length) { + addClass = XOSDetailView.extend({ + template: add_child_template, + app: XOSAdminApp, + }); + } else { + addClass = genericAddChildClass; + } + XOSAdminApp[collection_name + "AddChildView"] = addClass; + itemViewClass = XOSItemView.extend({ detailClass: detailClass, template: tr_template, @@ -109,6 +132,7 @@ XOSAdminApp.initRouter = function() { api_command = "list" + firstCharUpper(collection_name); listViewName = collection_name + "ListView"; detailViewName = collection_name + "DetailView"; + addChildViewName = collection_name + "AddChildView"; api[api_command] = XOSAdminApp.createListHandler(listViewName, collection_name, "detail", collection_name); routes[nav_url] = api_command; @@ -126,7 +150,7 @@ XOSAdminApp.initRouter = function() { nav_url = "addChild" + firstCharUpper(name) + "/:parentModel/:parentField/:parentId"; api_command = "addChild" + firstCharUpper(name); - api[api_command] = XOSAdminApp.createAddChildHandler(detailViewName, collection_name); + api[api_command] = XOSAdminApp.createAddChildHandler(addChildViewName, collection_name); routes[nav_url] = api_command; nav_url = "delete" + firstCharUpper(name) + "/:id"; diff --git a/planetstack/core/xoslib/static/js/xoslib/xos-backbone.js b/planetstack/core/xoslib/static/js/xoslib/xos-backbone.js index de03ddf..1f4ca5b 100644 --- a/planetstack/core/xoslib/static/js/xoslib/xos-backbone.js +++ b/planetstack/core/xoslib/static/js/xoslib/xos-backbone.js @@ -301,6 +301,18 @@ if (! window.XOSLIB_LOADED ) { modelClassName = modelName; collectionClassName = modelName + "Collection"; + if (!attrs.addFields) { + attrs.addFields = attrs.detailFields; + } + + if (!attrs.inputType) { + attrs.inputType = {}; + } + + if (!attrs.foreignFields) { + attrs.foreignFields = {}; + } + if (!attrs.collectionName) { attrs.collectionName = modelName + "s"; } @@ -311,12 +323,13 @@ if (! window.XOSLIB_LOADED ) { for (key in attrs) { value = attrs[key]; - if ($.inArray(key, ["urlRoot", "modelName", "collectionName", "validate"])>=0) { + if ($.inArray(key, ["urlRoot", "modelName", "collectionName", "addFields", "detailFields", "foreignFields", "inputType", "relatedCollections", "foreignCollections"])>=0) { modelAttrs[key] = value; - } - if ($.inArray(key, ["urlRoot", "modelName", "collectionName", "relatedCollections", "foreignCollections"])>=0) { collectionAttrs[key] = value; } + if ($.inArray(key, ["validate"])) { + modelAttrs[key] = value; + } } if (xosdefaults && xosdefaults[modelName]) { @@ -345,11 +358,18 @@ if (! window.XOSLIB_LOADED ) { define_model(this, {urlRoot: SLIVER_API, relatedCollections: {"networkSlivers": "sliver"}, foreignCollections: ["slices", "deployments", "images", "nodes", "users"], - modelName: "sliver"}); + foreignFields: {"creator": "users", "image": "images", "node": "nodes", "deploymentNetwork": "deployments", "slice": "slices"}, + modelName: "sliver", + addFields: ["slice", "deploymentNetwork", "image", "node"], + detailFields: ["name", "instance_id", "instance_name", "slice", "deploymentNetwork", "image", "node", "creator"], + }); define_model(this, {urlRoot: SLICE_API, 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"], + inputType: {"enabled": "checkbox"}, modelName: "slice", xosValidate: function(attrs, options) { errors = XOSModel.prototype.xosValidate(this, attrs, options); @@ -368,56 +388,93 @@ if (! window.XOSLIB_LOADED ) { define_model(this, {urlRoot: SLICEDEPLOYMENT_API, foreignCollections: ["slices", "deployments"], - modelName: "sliceDeployment"}); + modelName: "sliceDeployment", + foreignFields: {"slice": "slices", "deployment": "deployments"}, + detailFields: ["slice", "deployment", "tenant_id"], + }); define_model(this, {urlRoot: SLICEPRIVILEGE_API, foreignCollections: ["slices", "users", "sliceRoles"], - modelName: "slicePrivilege"}); + modelName: "slicePrivilege", + foreignFields: {"user": "users", "slice": "slices", "role": "sliceRoles"}, + detailFields: ["user", "slice", "role"], + }); define_model(this, {urlRoot: SLICEROLE_API, - modelName: "sliceRole"}); + modelName: "sliceRole", + detailFields: ["role"], + }); define_model(this, {urlRoot: NODE_API, foreignCollections: ["sites", "deployments"], - modelName: "node"}); + modelName: "node", + foreignFields: {"site": "sites", "deployment": "deployments"}, + detailFields: ["name", "site", "deployment"], + }); define_model(this, {urlRoot: SITE_API, relatedCollections: {"users": "site", "slices": "site", "nodes": "site"}, - modelName: "site"}); + modelName: "site", + detailFields: ["name", "abbreviated_name", "url", "enabled", "is_public", "login_base"], + inputType: {"enabled": "checkbox", "is_public": "checkbox"}, + }); define_model(this, {urlRoot: USER_API, relatedCollections: {"slicePrivileges": "user", "slices": "owner", "userDeployments": "user"}, foreignCollections: ["sites"], - modelName: "user"}); + modelName: "user", + foreignFields: {"site": "sites"}, + detailFields: ["username", "firstname", "lastname", "phone", "user_url", "site"], + }); define_model(this, {urlRoot: USERDEPLOYMENT_API, foreignCollections: ["users","deployments"], - modelName: "userDeployment"}); + modelName: "userDeployment", + foreignFields: {"deployment": "deployments", "user": "users"}, + detailFields: ["user", "deployment", "kuser_id"], + }); define_model(this, { urlRoot: DEPLOYMENT_API, relatedCollections: {"nodes": "deployment", "slivers": "deploymentNetwork", "networkDeployments": "deployment", "userDeployments": "deployment"}, - modelName: "deployment"}); + modelName: "deployment", + detailFields: ["name", "backend_type", "admin_tenant"], + }); define_model(this, {urlRoot: IMAGE_API, model: this.image, - modelName: "image"}); + modelName: "image", + detailFields: ["name", "disk_format", "admin_tenant"], + }); define_model(this, {urlRoot: NETWORKTEMPLATE_API, - modelName: "networkTemplate"}); + modelName: "networkTemplate", + detailFields: ["name", "description", "visibility", "translation", "sharedNetworkName", "sharedNetworkId"], + }); define_model(this, {urlRoot: NETWORK_API, relatedCollections: {"networkDeployments": "network", "networkSlivers": "network"}, foreignCollections: ["slices", "networkTemplates"], - modelName: "network"}); + modelName: "network", + foreignFields: {"template": "networkTemplates", "owner": "slices"}, + detailFields: ["name", "template", "ports", "labels", "owner"], + }); define_model(this, {urlRoot: NETWORKSLIVER_API, - modelName: "networkSliver"}); + modelName: "networkSliver", + foreignFields: {"network": "networks", "sliver": "slivers"}, + detailFields: ["network", "sliver", "ip", "port_id"], + }); define_model(this, {urlRoot: NETWORKDEPLOYMENT_API, - modelName: "networkDeployment"}); + modelName: "networkDeployment", + foreignFields: {"network": "networks", "deployment": "deployments"}, + detailFields: ["network", "deployment", "net_id"], + }); define_model(this, {urlRoot: SERVICE_API, - modelName: "service"}); + modelName: "service", + detailFields: ["name", "description", "versionNumber"], + }); // enhanced REST define_model(this, {urlRoot: SLICEPLUS_API, diff --git a/planetstack/core/xoslib/static/js/xoslib/xosHelper.js b/planetstack/core/xoslib/static/js/xoslib/xosHelper.js index d2af0aa..8e45267 100644 --- a/planetstack/core/xoslib/static/js/xoslib/xosHelper.js +++ b/planetstack/core/xoslib/static/js/xoslib/xosHelper.js @@ -116,7 +116,7 @@ XOSApplication = Marionette.Application.extend({ } }, - createAddChildHandler: function(detailName, collection_name) { + createAddChildHandler: function(addChildName, collection_name) { var app=this; return function(parent_modelName, parent_fieldName, parent_id) { app.Router.showPreviousURL(); @@ -126,7 +126,7 @@ XOSApplication = Marionette.Application.extend({ console.log(parent_id); model = new xos[collection_name].model(); model.attributes[parent_fieldName] = parent_id; - detailViewClass = app[detailName]; + detailViewClass = app[addChildName]; var detailView = new detailViewClass({model: model, collection:xos[collection_name]}); detailView.dialog = $("xos-addchild-dialog"); app["addChildDetail"].show(detailView); @@ -136,10 +136,12 @@ XOSApplication = Marionette.Application.extend({ width: 640, buttons : { "Save" : function() { + var addDialog = this; + detailView.synchronous = true; + detailView.afterSave = function() { $(addDialog).dialog("close"); } detailView.save(); - $(this).dialog("close"); - // do something here + //$(this).dialog("close"); }, "Cancel" : function() { $(this).dialog("close"); @@ -503,6 +505,14 @@ XOSDetailView = Marionette.ItemView.extend({ _.each(errors, markErrors); }, + templateHelpers: function() { return { modelName: this.model.modelName, + collectionName: this.model.collectionName, + addFields: this.model.addFields, + detailFields: this.model.detailFields, + foreignFields: this.model.foreignFields, + inputType: this.model.inputType, + }}, + }); /* XOSItemView @@ -519,6 +529,10 @@ XOSItemView = Marionette.ItemView.extend({ templateHelpers: function() { return { modelName: this.model.modelName, collectionName: this.model.collectionName, + addFields: this.model.addFields, + detailFields: this.model.detailFields, + foreignFields: this.model.foreignFields, + inputType: this.model.inputType, }}, }); diff --git a/planetstack/core/xoslib/templates/xosAdmin.html b/planetstack/core/xoslib/templates/xosAdmin.html index 3d5d1a6..c2bf202 100644 --- a/planetstack/core/xoslib/templates/xosAdmin.html +++ b/planetstack/core/xoslib/templates/xosAdmin.html @@ -100,6 +100,46 @@ <%= text %> + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -682,22 +556,6 @@ <%= xosDeleteButtonTemplate({modelName: modelName, id: id}) %> - - - - - -