Index: appengine/monorail/static/js/framework/framework-myprojects.js |
diff --git a/appengine/monorail/static/js/framework/framework-myprojects.js b/appengine/monorail/static/js/framework/framework-myprojects.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8979162f31efdc54e5b0e93030ded1637d4a6d0b |
--- /dev/null |
+++ b/appengine/monorail/static/js/framework/framework-myprojects.js |
@@ -0,0 +1,131 @@ |
+/* Copyright 2016 The Chromium Authors. All Rights Reserved. |
+ * |
+ * Use of this source code is governed by a BSD-style |
+ * license that can be found in the LICENSE file or at |
+ * https://developers.google.com/open-source/licenses/bsd |
+ */ |
+ |
+/** |
+ * @fileoverview This file initializes the "My favorites" drop down menu in the |
+ * user bar. It utilizes the menu widget defined in framework-menu.js. |
+ */ |
+ |
+/** @type {Menu} */ |
+var myprojects; |
+ |
+(function() { |
+ var target = document.getElementById('projects-dropdown'); |
+ |
+ if (!target) { |
+ return; |
+ } |
+ |
+ myprojects = new Menu(target, function() {}); |
+ |
+ myprojects.addEvent(window, 'load', CS_updateProjects); |
+ myprojects.addOnOpen(CS_updateProjects); |
+ myprojects.addEvent(window, 'load', function() { |
+ document.body.appendChild(myprojects.menu); |
+ }); |
+})(); |
+ |
+/** |
+ * Grabs the list of logged in user's projects to populate the "My favorites" |
+ * drop down menu. |
+ */ |
+function CS_updateProjects() { |
+ if (!myprojects) return; |
+ // Set a request token to prevent XSRF leaking of user project lists. |
+ if (CS_env.token) { |
+ var postUrl = '/hosting/projects.do'; |
+ CS_doPost(postUrl, CS_updateProjectsCallback, {}); |
+ } else { |
+ CS_updateProjectsCallback(null); |
+ } |
+} |
+ |
+/** |
+ * Updates the drop down menu based on the json data received. |
+ * @param {event} event with xhr Response with JSON data of list of projects. |
+ */ |
+function CS_updateProjectsCallback(event) { |
+ var xhr = event ? event.target : null; |
+ // Grab and show projects if user is signed in |
+ if (xhr) { |
+ if (xhr.readyState != 4 || xhr.status != 200) |
+ return; |
+ var projects = []; |
+ var starredProjects = []; |
+ |
+ var json = CS_parseJSON(xhr); |
+ for (var category in json) { |
+ switch (category) { |
+ case 'contributorto': |
+ case 'memberof': |
+ case 'ownerof': |
+ for (var i = 0; i < json[category].length; i++) { |
+ projects.push(json[category][i]); |
+ } |
+ break; |
+ |
+ case 'starred_projects': |
+ for (var i = 0; i < json[category].length; i++) { |
+ starredProjects.push(json[category][i]); |
+ } |
+ break; |
+ |
+ case 'error': |
+ return; |
+ |
+ default: |
+ break; |
+ } |
+ } |
+ |
+ myprojects.clear(); |
+ |
+ projects.sort(); |
+ for (var i = 0; i < projects.length; i++) { |
+ var url = '/p/' + projects[i] + '/'; |
+ myprojects.addItem(projects[i], url, 'projects', 'Projects'); |
+ } |
+ |
+ starredProjects.sort(); |
+ for (var i = 0; i < starredProjects.length; i++) { |
+ var url = '/p/' + starredProjects[i] + '/'; |
+ myprojects.addItem( |
+ starredProjects[i], url, 'starred_projects', 'Starred projects'); |
+ } |
+ |
+ if (projects.length == 0 && starredProjects.length == 0) { |
+ // If user has no project memberships then add default control. |
+ CS_addDefaultControl(); |
+ } else { |
+ // If there is atleast one project membership then add a 'All projects' |
+ // link that goes to hosting/ |
+ myprojects.addCategory('---', '---'); |
+ myprojects.addItem('All projects', '/hosting/', '---'); |
+ } |
+ |
+ // Otherwise, ask the user to sign in |
+ } else { |
+ myprojects.clear(); |
+ |
+ myprojects.addItem( |
+ 'Sign in to see your favorites', |
+ CS_env['login_url'], |
+ 'controls'); |
+ |
+ CS_addDefaultControl(); |
+ } |
+} |
+ |
+/** |
+ * Adds default control to the bottom of the "My favorites" menu. |
+ * It currently adds links to /more and /hosting. |
+ */ |
+function CS_addDefaultControl() { |
+ myprojects.addSeparator('controls', ''); |
+ myprojects.addItem('Find projects...', '/hosting/', |
+ 'controls'); |
+} |