Merge branch 'master' of git://git.planet-lab.org/plstackapi
[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
25 XOSAdminApp.navigateToModel = function(app, detailClass, detailNavLink, model) {
26      XOSAdminApp.Router.navigate(detailNavLink + "/" + model.id, {trigger: true});
27 };\r
28 \r
29 XOSAdminApp.navigate = function(what, modelName, modelId) {\r
30     collection_name = modelName + "s";\r
31     if (what=="list") {\r
32         XOSAdminApp.Router.navigate(collection_name, {trigger: true})\r
33     } else if (what=="detail") {\r
34         XOSAdminApp.Router.navigate(collection_name + "/" + modelId, {trigger: true})\r
35     } else if (what=="add") {\r
36         XOSAdminApp.Router.navigate("add" + firstCharUpper(modelName), {trigger: true})\r
37     }\r
38 }\r
39 \r
40 ICON_CLASSES = {home: "icon-home", deployments: "icon-deployment", sites: "icon-site", slices: "icon-slice", users: "icon-user"};\r
41 \r
42 XOSAdminApp.updateNavigationPanel = function() {\r
43     buttonTemplate=$("#xos-navbutton").html();\r
44     assert(buttonTemplate != undefined, "buttonTemplate is undefined");\r
45     html="<div class='left-nav'><ul>";\r
46     for (var index in NAV_OBJS) {\r
47         name = NAV_OBJS[index];\r
48         collection_name = name+"s";\r
49         nav_url = "#" + collection_name;\r
50         id = "nav-"+name;\r
51         icon_class = ICON_CLASSES[collection_name] || "icon-cog";\r
52 \r
53         html = html + _.template(buttonTemplate, {name: collection_name, router: "XOSAdminApp.Router", routeUrl: nav_url, iconClass: icon_class});\r
54     }\r
55 \r
56     html = html + "</ul>";\r
57 \r
58     $("#navigationPanel").html(html);\r
59 };\r
60 \r
61 XOSAdminApp.buildViews = function() {\r
62      for (var index in OBJS) {\r
63          name = OBJS[index];
64          tr_template = '#xosAdmin-' + name + '-listitem-template';
65          table_template = '#xosAdmin-' + name + '-list-template';
66          detail_template = '#xosAdmin-' + name + '-detail-template';
67          collection_name = name + "s";
68          region_name = name + "List";
69          detailNavLink = collection_name;
70
71          detailClass = XOSDetailView.extend({
72             template: detail_template,\r
73             app: XOSAdminApp,\r
74          });\r
75          XOSAdminApp[collection_name + "DetailView"] = detailClass;\r
76
77          itemViewClass = XOSItemView.extend({
78              detailClass: detailClass,
79              template: tr_template,
80              app: XOSAdminApp,
81              detailNavLink: detailNavLink,
82          });
83
84          listViewClass = XOSListView.extend({
85              childView: itemViewClass,
86              template: table_template,
87              collection: xos[collection_name],
88              title: name + "s",
89              app: XOSAdminApp,
90          });
91
92          XOSAdminApp[collection_name + "ListView"] = listViewClass;
93
94          xos[collection_name].fetch(); //startPolling();
95      }\r
96 };\r
97 \r
98 XOSAdminApp.initRouter = function() {\r
99     router = XOSRouter;\r
100     var api = {};\r
101     var routes = {};\r
102 \r
103     for (var index in OBJS) {\r
104         name = OBJS[index];\r
105         collection_name = name + "s";\r
106         nav_url = collection_name;\r
107         api_command = "list" + firstCharUpper(collection_name);\r
108         listViewName = collection_name + "ListView";\r
109         detailViewName = collection_name + "DetailView";\r
110 \r
111         api[api_command] = XOSAdminApp.listViewShower(listViewName, collection_name, "detail", collection_name);\r
112         routes[nav_url] = api_command;\r
113 \r
114         nav_url = collection_name + "/:id";\r
115         api_command = "detail" + firstCharUpper(collection_name);\r
116 \r
117         api[api_command] = XOSAdminApp.detailShower(detailViewName, collection_name, "detail", name);\r
118         routes[nav_url] = api_command;\r
119 \r
120         nav_url = "add" + firstCharUpper(name);\r
121         api_command = "add" + firstCharUpper(name);\r
122         api[api_command] = XOSAdminApp.addShower(detailViewName, collection_name, "detail", name);\r
123         routes[nav_url] = api_command;\r
124 \r
125         nav_url = "delete" + firstCharUpper(name) + "/:id";\r
126         api_command = "delete" + firstCharUpper(name);\r
127         api[api_command] = XOSAdminApp.deleteShower(collection_name, name);\r
128         routes[nav_url] = api_command;\r
129     };\r
130 \r
131     XOSAdminApp.Router = new router({ appRoutes: routes, controller: api });\r
132 };\r
133 \r
134 /* rewriteLinks\r
135 \r
136    Rewrite the links in the suit navbar from django-links to marionette\r
137    links. This let's us intercept the navbar and make it function within\r
138    this view rather than jumping back out to a django view.\r
139 */\r
140 \r
141 XOSAdminApp.rewriteLinks = function () {\r
142     $("a").each(function() {\r
143         href=$(this).attr("href");\r
144         rewrite_href=REWRITES[href];\r
145         if (rewrite_href) {\r
146             $(this).attr("href", rewrite_href);\r
147         }\r
148     });\r
149 };\r
150 \r
151 XOSAdminApp.startNavigation = function() {\r
152     Backbone.history.start();\r
153     XOSAdminApp.navigationStarted = true;\r
154 }\r
155 \r
156 XOSAdminApp.collectionLoadChange = function() {\r
157     stats = xos.getCollectionStatus();\r
158 \r
159     if (!XOSAdminApp.navigationStarted) {\r
160         if (stats["isLoaded"] + stats["failedLoad"] >= stats["startedLoad"]) {\r
161             XOSAdminApp.startNavigation();\r
162         } else {\r
163             $("#detail").html("<h3>Loading...</h3><div id='xos-startup-progress'></div>");\r
164             $("#xos-startup-progress").progressbar({value: stats["completedLoad"], max: stats["startedLoad"]});\r
165         }\r
166     }\r
167 };\r
168 \r
169 XOSAdminApp.on("start", function() {\r
170      XOSAdminApp.buildViews();
171
172      XOSAdminApp.initRouter();
173
174      XOSAdminApp.updateNavigationPanel();
175
176      XOSAdminApp.rewriteLinks();
177
178      // fire it once to initially show the progress bar
179      XOSAdminApp.collectionLoadChange();
180
181      // fire it each time the collection load status is updated
182      Backbone.on("xoslib:collectionLoadChange", XOSAdminApp.collectionLoadChange);
183 });
184
185 $(document).ready(function(){
186     XOSAdminApp.start();
187 });
188