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