add default route for xosAdminDashboard
[plstackapi.git] / planetstack / core / xoslib / static / js / xosAdminSite.js
index e3457eb..f5c7566 100644 (file)
@@ -1,13 +1,17 @@
-OBJS = ['deployment', 'image', 'networkTemplate', 'network', 'networkSliver', 'networkDeployment', 'node', 'service', 'site', 'slice', 'sliceDeployment', 'slicePrivilege', 'sliver', 'user', 'sliceRole', 'userDeployment'];
+OBJS = ['deployment', 'image', 'networkTemplate', 'network', 'networkSliver', 'node', 'service', 'site', 'slice',  'slicePrivilege', 'sliver', 'user', 'sliceRole',  'flavor', 'controller', 'siteDeployment'];
+// 'networkDeployment', 'userDeployment', 'sliceDeployment', 'imageDeployment'
 NAV_OBJS = ['deployment', 'site', 'slice', 'user'];
 
-function assert(outcome, description) {
-    if (!outcome) {
-        console.log(description);
-    }
-}
+REWRITES = {"/admin/core/deployment/": "#deployments",
+            "/admin/core/site/" : "#sites",
+            "/admin/core/slice/" : "#slices",
+            "/admin/core/user/" : "#users"};
 
-XOSAdminApp = new XOSApplication();
+XOSAdminApp = new XOSApplication({
+    logTableId: "#logTable",
+    statusMsgId: "#statusMsg",
+    hideTabsByDefault: true
+});
 
 XOSAdminApp.addRegions({
     navigation: "#navigationPanel",
@@ -16,59 +20,123 @@ XOSAdminApp.addRegions({
     linkedObjs1: "#linkedObjs1",
     linkedObjs2: "#linkedObjs2",
     linkedObjs3: "#linkedObjs3",
-    linkedObjs4: "#linkedObjs4"
+    linkedObjs4: "#linkedObjs4",
+
+    addChildDetail: "#xos-addchild-detail",
+
+    rightButtonPanel: "#rightButtonPanel"
 });
 
-XOSAdminApp.navigateToModel = function(app, detailClass, detailNavLink, model) {
-     XOSAdminApp.Router.navigate(detailNavLink + "/" + model.id, {trigger: true});
-};\r
+XOSAdminApp.navigate = function(what, modelName, modelId) {\r
+    console.log("XOSAsminApp.navigate");\r
+    collection_name = modelName + "s";\r
+    if (what=="list") {\r
+        XOSAdminApp.Router.navigate(collection_name, {trigger: true})\r
+    } else if (what=="detail") {\r
+        XOSAdminApp.Router.navigate(collection_name + "/" + modelId, {trigger: true})\r
+    } else if (what=="add") {\r
+        XOSAdminApp.Router.navigate("add" + firstCharUpper(modelName), {trigger: true, force: true})\r
+    }\r
+}\r
+\r
+ICON_CLASSES = {home: "icon-home", deployments: "icon-deployment", sites: "icon-site", slices: "icon-slice", users: "icon-user"};\r
 \r
 XOSAdminApp.updateNavigationPanel = function() {\r
     buttonTemplate=$("#xos-navbutton").html();\r
     assert(buttonTemplate != undefined, "buttonTemplate is undefined");\r
-    html=""\r
+    html="<div class='left-nav'><ul>";\r
     for (var index in NAV_OBJS) {\r
         name = NAV_OBJS[index];\r
         collection_name = name+"s";\r
-        nav_url = "/" + collection_name;\r
+        nav_url = "#" + collection_name;\r
         id = "nav-"+name;\r
+        icon_class = ICON_CLASSES[collection_name] || "icon-cog";\r
 \r
-        html = html + _.template(buttonTemplate, {name: collection_name, router: "XOSAdminApp.Router", routeUrl: nav_url});\r
+        html = html + _.template(buttonTemplate, {name: collection_name, router: "XOSAdminApp.Router", routeUrl: nav_url, iconClass: icon_class});\r
     }\r
 \r
+    html = html + "</ul>";\r
+\r
     $("#navigationPanel").html(html);\r
 };\r
 \r
 XOSAdminApp.buildViews = function() {\r
+     genericAddChildClass = XOSDetailView.extend({template: "#xos-add-template",\r
+                                                        app: XOSAdminApp});\r
+     XOSAdminApp["genericAddChildView"] = genericAddChildClass;\r
+\r
+     genericDetailClass = XOSDetailView.extend({template: "#xos-detail-template",\r
+                                                           app: XOSAdminApp});\r
+     XOSAdminApp["genericDetailView"] = genericDetailClass;\r
+\r
+     genericItemViewClass = XOSItemView.extend({template: "#xos-listitem-template",\r
+                                                app: XOSAdminApp});\r
+     XOSAdminApp["genericItemView"] = genericItemViewClass;\r
+\r
+     //genericListViewClass = XOSListView.extend({template: "#xos-list-template",\r
+     //                                           app: XOSAdminApp});\r
+\r
+     genericListViewClass = XOSDataTableView.extend({template: "#xos-list-template", app: XOSAdminApp});\r
+     XOSAdminApp["genericListView"] = genericListViewClass;\r
+\r
      for (var index in OBJS) {\r
          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,\r
-            app: XOSAdminApp,\r
-         });\r
+         if (window["XOSDetailView_" + name]) {
+             detailClass = window["XOSDetailView_" + name].extend({template: "#xos-detail-template",
+                                                                    app: XOSAdminApp});
+         } else {
+             detailClass = genericDetailClass;
+         }
+         if ($(detail_template).length) {
+             detailClass = detailClass.extend({
+                template: detail_template,\r
+             });\r
+         }\r
          XOSAdminApp[collection_name + "DetailView"] = detailClass;\r
+\r
+         if (window["XOSDetailView_" + name]) {\r
+             addClass = window["XOSDetailView_" + name].extend({template: "#xos-add-template",
+                                                                    app: XOSAdminApp});
+         } else {
+             addClass = genericAddChildClass;
+         }
+         if ($(add_child_template).length) {
+             addClass = detailClass.extend({
+                template: add_child_template,\r
+             });\r
+         }\r
+         XOSAdminApp[collection_name + "AddChildView"] = addClass;\r
+\r
+         if ($(tr_template).length) {\r
+             itemViewClass = XOSItemView.extend({\r
+                 template: tr_template,\r
+                 app: XOSAdminApp,
+             });
+         } else {
+             itemViewClass = genericItemViewClass;
+         }
 
-         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 ($(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;
 
@@ -77,54 +145,84 @@ XOSAdminApp.buildViews = function() {
 };\r
 \r
 XOSAdminApp.initRouter = function() {\r
-    router = Marionette.AppRouter.extend({\r
-    });\r
-\r
+    router = XOSRouter;\r
     var api = {};\r
     var routes = {};\r
 \r
-    function listViewShower(listViewName) {\r
-        return function() {\r
-            XOSAdminApp.detail.show(new XOSAdminApp[listViewName]);\r
-        }\r
-    };\r
-\r
-    function detailShower(detailName, collection_name) {\r
-        shower = function(model_id) {\r
-            model = xos[collection_name].get(model_id);\r
-            if (model == undefined) {\r
-                $("#detail").html("not ready yet");\r
-                return;\r
-            }\r
-            detailViewClass = XOSAdminApp[detailName];\r
-            detailView = new detailViewClass({model: model});\r
-            XOSAdminApp.detail.show(detailView);\r
-            detailView.showLinkedItems();\r
-        }\r
-        return shower;\r
-    };\r
-\r
     for (var index in OBJS) {\r
         name = OBJS[index];\r
         collection_name = name + "s";\r
         nav_url = collection_name;\r
-        api_command = "list" + collection_name.charAt(0).toUpperCase() + collection_name.slice(1);\r
+        api_command = "list" + firstCharUpper(collection_name);\r
         listViewName = collection_name + "ListView";\r
         detailViewName = collection_name + "DetailView";\r
+        addChildViewName = collection_name + "AddChildView";\r
 \r
-        api[api_command] = listViewShower(listViewName);\r
+        api[api_command] = XOSAdminApp.createListHandler(listViewName, collection_name, "detail", collection_name);\r
         routes[nav_url] = api_command;\r
 \r
         nav_url = collection_name + "/:id";\r
-        api_command = "detail" + collection_name.charAt(0).toUpperCase() + collection_name.slice(1);\r
+        api_command = "detail" + firstCharUpper(collection_name);\r
 \r
-        api[api_command] = detailShower(detailViewName, collection_name);\r
+        api[api_command] = XOSAdminApp.createDetailHandler(detailViewName, collection_name, "detail", name);\r
+        routes[nav_url] = api_command;\r
+\r
+        nav_url = "add" + firstCharUpper(name);\r
+        api_command = "add" + firstCharUpper(name);\r
+        api[api_command] = XOSAdminApp.createAddHandler(detailViewName, collection_name, "detail", name);\r
+        routes[nav_url] = api_command;\r
+\r
+        nav_url = "addChild" + firstCharUpper(name) + "/:parentModel/:parentField/:parentId";\r
+        api_command = "addChild" + firstCharUpper(name);\r
+        api[api_command] = XOSAdminApp.createAddChildHandler(addChildViewName, collection_name);\r
+        routes[nav_url] = api_command;\r
+\r
+        nav_url = "delete" + firstCharUpper(name) + "/:id";\r
+        api_command = "delete" + firstCharUpper(name);\r
+        api[api_command] = XOSAdminApp.createDeleteHandler(collection_name, name);\r
         routes[nav_url] = api_command;\r
     };\r
 \r
+    routes["*part"] = "listSlices";\r
+\r
     XOSAdminApp.Router = new router({ appRoutes: routes, controller: api });\r
+};\r
+\r
+/* rewriteLinks\r
+\r
+   Rewrite the links in the suit navbar from django-links to marionette\r
+   links. This let's us intercept the navbar and make it function within\r
+   this view rather than jumping back out to a django view.\r
+*/\r
+\r
+XOSAdminApp.rewriteLinks = function () {\r
+    $("a").each(function() {\r
+        href=$(this).attr("href");\r
+        rewrite_href=REWRITES[href];\r
+        if (rewrite_href) {\r
+            $(this).attr("href", rewrite_href);\r
+        }\r
+    });\r
+};\r
+\r
+XOSAdminApp.startNavigation = function() {\r
+    Backbone.history.start();\r
+    XOSAdminApp.navigationStarted = true;\r
 }\r
 \r
+XOSAdminApp.collectionLoadChange = function() {\r
+    stats = xos.getCollectionStatus();\r
+\r
+    if (!XOSAdminApp.navigationStarted) {\r
+        if (stats["isLoaded"] + stats["failedLoad"] >= stats["startedLoad"]) {\r
+            XOSAdminApp.startNavigation();\r
+        } else {\r
+            $("#detail").html("<h3>Loading...</h3><div id='xos-startup-progress'></div>");\r
+            $("#xos-startup-progress").progressbar({value: stats["completedLoad"], max: stats["startedLoad"]});\r
+        }\r
+    }\r
+};\r
+\r
 XOSAdminApp.on("start", function() {\r
      XOSAdminApp.buildViews();
 
@@ -132,10 +230,13 @@ XOSAdminApp.on("start", function() {
 
      XOSAdminApp.updateNavigationPanel();
 
-     if (Backbone.history) {
-         console.log("history start");
-         Backbone.history.start();
-     }
+     XOSAdminApp.rewriteLinks();
+
+     // fire it once to initially show the progress bar
+     XOSAdminApp.collectionLoadChange();
+
+     // fire it each time the collection load status is updated
+     Backbone.on("xoslib:collectionLoadChange", XOSAdminApp.collectionLoadChange);
 });
 
 $(document).ready(function(){