add default route for xosAdminDashboard
[plstackapi.git] / planetstack / core / xoslib / static / js / xosAdminSite.js
1 OBJS = ['deployment', 'image', 'networkTemplate', 'network', 'networkSliver', 'node', 'service', 'site', 'slice',  'slicePrivilege', 'sliver', 'user', 'sliceRole',  'flavor', 'controller', 'siteDeployment'];
2 // 'networkDeployment', 'userDeployment', 'sliceDeployment', 'imageDeployment'
3 NAV_OBJS = ['deployment', 'site', 'slice', 'user'];
4
5 REWRITES = {"/admin/core/deployment/": "#deployments",
6             "/admin/core/site/" : "#sites",
7             "/admin/core/slice/" : "#slices",
8             "/admin/core/user/" : "#users"};
9
10 XOSAdminApp = new XOSApplication({
11     logTableId: "#logTable",
12     statusMsgId: "#statusMsg",
13     hideTabsByDefault: true
14 });
15
16 XOSAdminApp.addRegions({
17     navigation: "#navigationPanel",
18
19     detail: "#detail",
20     linkedObjs1: "#linkedObjs1",
21     linkedObjs2: "#linkedObjs2",
22     linkedObjs3: "#linkedObjs3",
23     linkedObjs4: "#linkedObjs4",
24
25     addChildDetail: "#xos-addchild-detail",
26
27     rightButtonPanel: "#rightButtonPanel"
28 });
29
30 XOSAdminApp.navigate = function(what, modelName, modelId) {\r
31     console.log("XOSAsminApp.navigate");\r
32     collection_name = modelName + "s";\r
33     if (what=="list") {\r
34         XOSAdminApp.Router.navigate(collection_name, {trigger: true})\r
35     } else if (what=="detail") {\r
36         XOSAdminApp.Router.navigate(collection_name + "/" + modelId, {trigger: true})\r
37     } else if (what=="add") {\r
38         XOSAdminApp.Router.navigate("add" + firstCharUpper(modelName), {trigger: true, force: true})\r
39     }\r
40 }\r
41 \r
42 ICON_CLASSES = {home: "icon-home", deployments: "icon-deployment", sites: "icon-site", slices: "icon-slice", users: "icon-user"};\r
43 \r
44 XOSAdminApp.updateNavigationPanel = function() {\r
45     buttonTemplate=$("#xos-navbutton").html();\r
46     assert(buttonTemplate != undefined, "buttonTemplate is undefined");\r
47     html="<div class='left-nav'><ul>";\r
48     for (var index in NAV_OBJS) {\r
49         name = NAV_OBJS[index];\r
50         collection_name = name+"s";\r
51         nav_url = "#" + collection_name;\r
52         id = "nav-"+name;\r
53         icon_class = ICON_CLASSES[collection_name] || "icon-cog";\r
54 \r
55         html = html + _.template(buttonTemplate, {name: collection_name, router: "XOSAdminApp.Router", routeUrl: nav_url, iconClass: icon_class});\r
56     }\r
57 \r
58     html = html + "</ul>";\r
59 \r
60     $("#navigationPanel").html(html);\r
61 };\r
62 \r
63 XOSAdminApp.buildViews = function() {\r
64      genericAddChildClass = XOSDetailView.extend({template: "#xos-add-template",\r
65                                                         app: XOSAdminApp});\r
66      XOSAdminApp["genericAddChildView"] = genericAddChildClass;\r
67 \r
68      genericDetailClass = XOSDetailView.extend({template: "#xos-detail-template",\r
69                                                            app: XOSAdminApp});\r
70      XOSAdminApp["genericDetailView"] = genericDetailClass;\r
71 \r
72      genericItemViewClass = XOSItemView.extend({template: "#xos-listitem-template",\r
73                                                 app: XOSAdminApp});\r
74      XOSAdminApp["genericItemView"] = genericItemViewClass;\r
75 \r
76      //genericListViewClass = XOSListView.extend({template: "#xos-list-template",\r
77      //                                           app: XOSAdminApp});\r
78 \r
79      genericListViewClass = XOSDataTableView.extend({template: "#xos-list-template", app: XOSAdminApp});\r
80      XOSAdminApp["genericListView"] = genericListViewClass;\r
81 \r
82      for (var index in OBJS) {\r
83          name = OBJS[index];
84          tr_template = '#xosAdmin-' + name + '-listitem-template';
85          table_template = '#xosAdmin-' + name + '-list-template';
86          detail_template = '#xosAdmin-' + name + '-detail-template';
87          add_child_template = '#xosAdmin-' + name + '-add-child-template';
88          collection_name = name + "s";
89          region_name = name + "List";
90
91          if (window["XOSDetailView_" + name]) {
92              detailClass = window["XOSDetailView_" + name].extend({template: "#xos-detail-template",
93                                                                     app: XOSAdminApp});
94          } else {
95              detailClass = genericDetailClass;
96          }
97          if ($(detail_template).length) {
98              detailClass = detailClass.extend({
99                 template: detail_template,\r
100              });\r
101          }\r
102          XOSAdminApp[collection_name + "DetailView"] = detailClass;\r
103 \r
104          if (window["XOSDetailView_" + name]) {\r
105              addClass = window["XOSDetailView_" + name].extend({template: "#xos-add-template",
106                                                                     app: XOSAdminApp});
107          } else {
108              addClass = genericAddChildClass;
109          }
110          if ($(add_child_template).length) {
111              addClass = detailClass.extend({
112                 template: add_child_template,\r
113              });\r
114          }\r
115          XOSAdminApp[collection_name + "AddChildView"] = addClass;\r
116 \r
117          if ($(tr_template).length) {\r
118              itemViewClass = XOSItemView.extend({\r
119                  template: tr_template,\r
120                  app: XOSAdminApp,
121              });
122          } else {
123              itemViewClass = genericItemViewClass;
124          }
125
126          if ($(table_template).length) {
127              listViewClass = XOSListView.extend({
128                  childView: itemViewClass,
129                  template: table_template,
130                  collection: xos[collection_name],
131                  title: name + "s",
132                  app: XOSAdminApp,
133              });
134          } else {
135              listViewClass = genericListViewClass.extend( { childView: itemViewClass,
136                                                             collection: xos[collection_name],
137                                                             title: name + "s",
138                                                            } );
139          }
140
141          XOSAdminApp[collection_name + "ListView"] = listViewClass;
142
143          xos[collection_name].fetch(); //startPolling();
144      }\r
145 };\r
146 \r
147 XOSAdminApp.initRouter = function() {\r
148     router = XOSRouter;\r
149     var api = {};\r
150     var routes = {};\r
151 \r
152     for (var index in OBJS) {\r
153         name = OBJS[index];\r
154         collection_name = name + "s";\r
155         nav_url = collection_name;\r
156         api_command = "list" + firstCharUpper(collection_name);\r
157         listViewName = collection_name + "ListView";\r
158         detailViewName = collection_name + "DetailView";\r
159         addChildViewName = collection_name + "AddChildView";\r
160 \r
161         api[api_command] = XOSAdminApp.createListHandler(listViewName, collection_name, "detail", collection_name);\r
162         routes[nav_url] = api_command;\r
163 \r
164         nav_url = collection_name + "/:id";\r
165         api_command = "detail" + firstCharUpper(collection_name);\r
166 \r
167         api[api_command] = XOSAdminApp.createDetailHandler(detailViewName, collection_name, "detail", name);\r
168         routes[nav_url] = api_command;\r
169 \r
170         nav_url = "add" + firstCharUpper(name);\r
171         api_command = "add" + firstCharUpper(name);\r
172         api[api_command] = XOSAdminApp.createAddHandler(detailViewName, collection_name, "detail", name);\r
173         routes[nav_url] = api_command;\r
174 \r
175         nav_url = "addChild" + firstCharUpper(name) + "/:parentModel/:parentField/:parentId";\r
176         api_command = "addChild" + firstCharUpper(name);\r
177         api[api_command] = XOSAdminApp.createAddChildHandler(addChildViewName, collection_name);\r
178         routes[nav_url] = api_command;\r
179 \r
180         nav_url = "delete" + firstCharUpper(name) + "/:id";\r
181         api_command = "delete" + firstCharUpper(name);\r
182         api[api_command] = XOSAdminApp.createDeleteHandler(collection_name, name);\r
183         routes[nav_url] = api_command;\r
184     };\r
185 \r
186     routes["*part"] = "listSlices";\r
187 \r
188     XOSAdminApp.Router = new router({ appRoutes: routes, controller: api });\r
189 };\r
190 \r
191 /* rewriteLinks\r
192 \r
193    Rewrite the links in the suit navbar from django-links to marionette\r
194    links. This let's us intercept the navbar and make it function within\r
195    this view rather than jumping back out to a django view.\r
196 */\r
197 \r
198 XOSAdminApp.rewriteLinks = function () {\r
199     $("a").each(function() {\r
200         href=$(this).attr("href");\r
201         rewrite_href=REWRITES[href];\r
202         if (rewrite_href) {\r
203             $(this).attr("href", rewrite_href);\r
204         }\r
205     });\r
206 };\r
207 \r
208 XOSAdminApp.startNavigation = function() {\r
209     Backbone.history.start();\r
210     XOSAdminApp.navigationStarted = true;\r
211 }\r
212 \r
213 XOSAdminApp.collectionLoadChange = function() {\r
214     stats = xos.getCollectionStatus();\r
215 \r
216     if (!XOSAdminApp.navigationStarted) {\r
217         if (stats["isLoaded"] + stats["failedLoad"] >= stats["startedLoad"]) {\r
218             XOSAdminApp.startNavigation();\r
219         } else {\r
220             $("#detail").html("<h3>Loading...</h3><div id='xos-startup-progress'></div>");\r
221             $("#xos-startup-progress").progressbar({value: stats["completedLoad"], max: stats["startedLoad"]});\r
222         }\r
223     }\r
224 };\r
225 \r
226 XOSAdminApp.on("start", function() {\r
227      XOSAdminApp.buildViews();
228
229      XOSAdminApp.initRouter();
230
231      XOSAdminApp.updateNavigationPanel();
232
233      XOSAdminApp.rewriteLinks();
234
235      // fire it once to initially show the progress bar
236      XOSAdminApp.collectionLoadChange();
237
238      // fire it each time the collection load status is updated
239      Backbone.on("xoslib:collectionLoadChange", XOSAdminApp.collectionLoadChange);
240 });
241
242 $(document).ready(function(){
243     XOSAdminApp.start();
244 });
245