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