b9068b5d46b78a1a487a281b65795e0bc12c6a3d
[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'];
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
27 XOSAdminApp.navigateToModel = function(app, detailClass, detailNavLink, model) {
28      XOSAdminApp.Router.navigate(detailNavLink + "/" + model.id, {trigger: true});
29 };\r
30 \r
31 XOSAdminApp.navigate = function(what, modelName, modelId) {\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})\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      for (var index in OBJS) {\r
73          name = OBJS[index];
74          tr_template = '#xosAdmin-' + name + '-listitem-template';
75          table_template = '#xosAdmin-' + name + '-list-template';
76          detail_template = '#xosAdmin-' + name + '-detail-template';
77          add_child_template = '#xosAdmin-' + name + '-add-child-template';
78          collection_name = name + "s";
79          region_name = name + "List";
80          detailNavLink = collection_name;
81
82          if ($(detail_template).length) {
83              detailClass = XOSDetailView.extend({
84                 template: detail_template,\r
85                 app: XOSAdminApp,\r
86              });\r
87          } else {\r
88              detailClass = genericDetailClass;\r
89          }\r
90          XOSAdminApp[collection_name + "DetailView"] = detailClass;\r
91 \r
92          if ($(add_child_template).length) {\r
93              addClass = XOSDetailView.extend({
94                 template: add_child_template,\r
95                 app: XOSAdminApp,\r
96              });\r
97          } else {\r
98              addClass = genericAddChildClass;\r
99          }\r
100          XOSAdminApp[collection_name + "AddChildView"] = addClass;\r
101 \r
102          itemViewClass = XOSItemView.extend({
103              detailClass: detailClass,
104              template: tr_template,
105              app: XOSAdminApp,
106              detailNavLink: detailNavLink,
107          });
108
109          listViewClass = XOSListView.extend({
110              childView: itemViewClass,
111              template: table_template,
112              collection: xos[collection_name],
113              title: name + "s",
114              app: XOSAdminApp,
115          });
116
117          XOSAdminApp[collection_name + "ListView"] = listViewClass;
118
119          xos[collection_name].fetch(); //startPolling();
120      }\r
121 };\r
122 \r
123 XOSAdminApp.initRouter = function() {\r
124     router = XOSRouter;\r
125     var api = {};\r
126     var routes = {};\r
127 \r
128     for (var index in OBJS) {\r
129         name = OBJS[index];\r
130         collection_name = name + "s";\r
131         nav_url = collection_name;\r
132         api_command = "list" + firstCharUpper(collection_name);\r
133         listViewName = collection_name + "ListView";\r
134         detailViewName = collection_name + "DetailView";\r
135         addChildViewName = collection_name + "AddChildView";\r
136 \r
137         api[api_command] = XOSAdminApp.createListHandler(listViewName, collection_name, "detail", collection_name);\r
138         routes[nav_url] = api_command;\r
139 \r
140         nav_url = collection_name + "/:id";\r
141         api_command = "detail" + firstCharUpper(collection_name);\r
142 \r
143         api[api_command] = XOSAdminApp.createDetailHandler(detailViewName, collection_name, "detail", name);\r
144         routes[nav_url] = api_command;\r
145 \r
146         nav_url = "add" + firstCharUpper(name);\r
147         api_command = "add" + firstCharUpper(name);\r
148         api[api_command] = XOSAdminApp.createAddHandler(detailViewName, collection_name, "detail", name);\r
149         routes[nav_url] = api_command;\r
150 \r
151         nav_url = "addChild" + firstCharUpper(name) + "/:parentModel/:parentField/:parentId";\r
152         api_command = "addChild" + firstCharUpper(name);\r
153         api[api_command] = XOSAdminApp.createAddChildHandler(addChildViewName, collection_name);\r
154         routes[nav_url] = api_command;\r
155 \r
156         nav_url = "delete" + firstCharUpper(name) + "/:id";\r
157         api_command = "delete" + firstCharUpper(name);\r
158         api[api_command] = XOSAdminApp.createDeleteHandler(collection_name, name);\r
159         routes[nav_url] = api_command;\r
160     };\r
161 \r
162     XOSAdminApp.Router = new router({ appRoutes: routes, controller: api });\r
163 };\r
164 \r
165 /* rewriteLinks\r
166 \r
167    Rewrite the links in the suit navbar from django-links to marionette\r
168    links. This let's us intercept the navbar and make it function within\r
169    this view rather than jumping back out to a django view.\r
170 */\r
171 \r
172 XOSAdminApp.rewriteLinks = function () {\r
173     $("a").each(function() {\r
174         href=$(this).attr("href");\r
175         rewrite_href=REWRITES[href];\r
176         if (rewrite_href) {\r
177             $(this).attr("href", rewrite_href);\r
178         }\r
179     });\r
180 };\r
181 \r
182 XOSAdminApp.startNavigation = function() {\r
183     Backbone.history.start();\r
184     XOSAdminApp.navigationStarted = true;\r
185 }\r
186 \r
187 XOSAdminApp.collectionLoadChange = function() {\r
188     stats = xos.getCollectionStatus();\r
189 \r
190     if (!XOSAdminApp.navigationStarted) {\r
191         if (stats["isLoaded"] + stats["failedLoad"] >= stats["startedLoad"]) {\r
192             XOSAdminApp.startNavigation();\r
193         } else {\r
194             $("#detail").html("<h3>Loading...</h3><div id='xos-startup-progress'></div>");\r
195             $("#xos-startup-progress").progressbar({value: stats["completedLoad"], max: stats["startedLoad"]});\r
196         }\r
197     }\r
198 };\r
199 \r
200 XOSAdminApp.on("start", function() {\r
201      XOSAdminApp.buildViews();
202
203      XOSAdminApp.initRouter();
204
205      XOSAdminApp.updateNavigationPanel();
206
207      XOSAdminApp.rewriteLinks();
208
209      // fire it once to initially show the progress bar
210      XOSAdminApp.collectionLoadChange();
211
212      // fire it each time the collection load status is updated
213      Backbone.on("xoslib:collectionLoadChange", XOSAdminApp.collectionLoadChange);
214 });
215
216 $(document).ready(function(){
217     XOSAdminApp.start();
218 });
219