synergy/client/app/js/configuration.js (296 lines of code) (raw):

"use strict"; (function () { /** * * Container for synergy configuration * @type Synergy */ function Synergy(SynergyHandlers) { var synergy = this; this.version = "1.0.12"; this.hostname = window.location.hostname; this.baseURL = this.hostname + "/synergy"; this.bugtrackingSystems = {}; this.issues = new function () { this.singleIssueLink = function (project, issue, includeText) { if (synergy.bugtrackingSystems.hasOwnProperty(project) && typeof synergy.bugtrackingSystems[project].getDisplayLink === "function") { return synergy.bugtrackingSystems[project].getDisplayLink(issue, includeText); } return ""; }; this.viewLinkObjects = function (project, issues, includeText) { if (issues instanceof Array) { return this.viewLink(project, issues); } var _all = []; for (var i in issues) { if (issues.hasOwnProperty(i)) { _all.push(issues[i]); } } return this.viewLink(project, _all, includeText); }; this.viewLink = function (project, issues, includeText) { if (synergy.bugtrackingSystems.hasOwnProperty(project) && typeof synergy.bugtrackingSystems[project].getMultiDisplayLink === "function") { return synergy.bugtrackingSystems[project].getMultiDisplayLink(issues, includeText); } return ""; }; this.reportLink = function (project, product, component, version, summary, caseId, suiteId) { if (synergy.bugtrackingSystems.hasOwnProperty(project) && typeof synergy.bugtrackingSystems[project].getReportLink === "function") { return synergy.bugtrackingSystems[project].getReportLink(product, component, version, summary, caseId, suiteId); } return ""; }; }; this.assignmentPage = 20; this.commentsPage = 30; this.adminRoles = ["admin", "manager"]; this.publisher = new SynergyHandlers.SynergyObserver(); this.logger = new SynergyHandlers.SynergyLogger(); this.httpTimeout = 60000; /** * Fallback for backward compatibility (in prev. versions of Synergy, specification didn't have project property * @type String */ this.product = "NetBeans"; /** * If true, Synergy will track how long was given case being tested and update estimated case duration with this value after submitting * @type Boolean */ this.trackCaseDuration = true; /** * Default number of miliseconds before cookie is expired * @type Number */ this.defaultCookiesExpiration = 12 * 60 * 60 * 1000; this.uploadFileLimit = 20000000; /** * For dialogs. Properties modal, modalBody and modalHeader are IDs (with #) of elements in modal div * Sample usage: $scope.SYNERGY.modal.update("Login failed", "Incorrect credentials, please try again" + data.toString()); $scope.SYNERGY.modal.show(); * @type type */ this.modal = { modal: "#myModal", modalBody: "#modal-body", modalHeader: "#myModalLabel", update: function (header, body) { $(this.modalHeader).text(header); $(this.modalBody).text(body); }, show: function () { $(this.modal).modal("toggle"); } }; this.server = new SynergyHandlers.SynergyServer({ "db": "../../server/api/db.php", "specifications": "../../server/api/specifications.php", "specification": "../../server/api/specification.php", "session": "../../server/api/login.php", "assignment": "../../server/api/assignment.php", "assignments": "../../server/api/assignments.php", "assignment_bugs": "../../server/api/assignment_bugs.php", "tribe_assignments": "../../server/api/tribe_assignments.php", "attachment": "../../server/api/attachment.php", "attachments": "../../server/api/attachments.php", "run_attachment": "../../server/api/run_attachment.php", "favorites": "../../server/api/favorites.php", "favorite": "../../server/api/favorite.php", "suite": "../../server/api/suite.php", "case": "../../server/api/case.php", "cases": "../../server/api/cases.php", "job": "../../server/api/job.php", "label": "../../server/api/label.php", "labels": "../../server/api/labels.php", "log": "../../server/api/log.php", "user": "../../server/api/user.php", "profile_img": "../../server/api/profile_img.php", "users": "../../server/api/users.php", "tribe": "../../server/api/tribe.php", "tribe_specification": "../../server/api/tribe_specification.php", "tribes": "../../server/api/tribes.php", "versions": "../../server/api/versions.php", "version": "../../server/api/version.php", "platform": "../../server/api/platform.php", "platforms": "../../server/api/platforms.php", "runs": "../../server/api/runs.php", "image": "../../server/api/image.php", "images": "../../server/api/images.php", "issue": "../../server/api/issue.php", "proxy": "../../server/api/proxy.php", "run": "../../server/api/run.php", "run_notifications": "../../server/api/run_notifications.php", "events": "../../server/api/events.php", "configuration": "../../server/api/configuration.php", "about": "../../server/api/about.php", "sanitizer": "../../server/api/sanitizer.php", "search": "../../server/api/search.php", "products": "../../server/api/products.php", "revisions": "../../server/api/revisions.php", "statistics": "../../server/api/statistics.php", "statistics_archived": "../../server/data/test_runs/", "statistics_fallback": "../../server/archive/test_runs_data/", "statistics_filter": "../../server/api/statistics_filter.php", "comments": "../../server/api/comments.php", "assignment_comments": "../../server/api/assignment_comments.php", "specification_request": "../../server/api/specification_request.php", "versionLength": "../../server/api/specification_length.php", "assignment_exists": "../../server/api/assignment_exists.php", "review": "../../server/api/review.php", "review_assignment": "../../server/api/review_assignment.php", "reviews": "../../server/api/reviews.php", "projects": "../../server/api/projects.php", "project": "../../server/api/project.php", "register": "../../server/api/register.php", "run_specifications": "../../server/api/run_specifications.php", "run_tribes": "../../server/api/run_tribes.php", "refresh": "../../server/api/refresh.php" }); /** * To specify server endpoints used by Synergy Client * */ /** * Holds information about current session and modifies page upon session state */ this.session = { isLoggedIn: false, username: "", firstName: "", lastName: "", role: "", created: "", session_id: "", token: "", cookieIsValid: function (creationTime) { return ((new Date().getTime() - parseInt(creationTime, 10)) < synergy.defaultCookiesExpiration); }, /** * Hides login form after successful login * */ hideLoginForm: function () { $("#synergy_login_form").css("display", "none"); $("#synergy_login_form_log").css("display", "none"); }, clearSession: function () { synergy.session.isLoggedIn = false; synergy.session.username = ""; synergy.session.lastName = ""; synergy.session.firstName = ""; synergy.session.role = ""; synergy.session.created = -1; synergy.session.session_id = ""; synergy.session.token = ""; synergy.session.showLoginForm(); synergy.session.hideUserMenu(); }, setSession: function (data) { synergy.session.hideLoginForm(); synergy.session.showUserMenu(data.username); synergy.session.isLoggedIn = true; synergy.session.username = data.username; synergy.session.lastName = data.lastName; synergy.session.firstName = data.firstName; synergy.session.role = data.role; synergy.session.session_id = data.session_id; synergy.session.token = data.session_id; synergy.session.created = data.created; }, showUserMenu: function (username) { $("#usermenu_user").html(username + "&nbsp;<b class=\"caret\" id=\"userCaret\"></b>"); $("#synergy_usermenu").css("display", "block"); }, showLoginForm: function () { $("#synergy_login_form").css("display", "block"); }, hideUserMenu: function () { $("#synergy_usermenu").css("display", "none"); }, hasAdminRights: function () { if (typeof synergy.session !== "undefined" && typeof synergy.session.role !== "undefined" && synergy.adminRoles.indexOf(synergy.session.role) > -1) { return true; } else { return false; } }, /** * Displays user menu that is shown if user is logged in * */ createUserMenu: function () { $("#synergy_session").append("<ul class=\"nav pull-right\"><li class=\"dropdown\"><a href=\"#\" class=\"dropdown-toggle btn-primary\" data-toggle=\"dropdown\" style=\"color: white\">" + synergy.session.username + " <b class=\"caret\"></b></a>" + "<ul class=\"dropdown-menu\"><li><a href=\"#favorites\">Favorites</a></li><li><span ng-click=\"logout();\">Logout</span></li>" + "</ul></li></ul>"); } }; /** * Some useful functions */ this.util = { /** * Converts associated array (object) to indexed based array * @param {type} data * @returns {Array|Synergy.util.toIndexedArray._a} */ toIndexedArray: function (data) { var _a = []; for (var i in data) { if (data.hasOwnProperty(i)) { _a.push(data[i]); } } return _a; }, /** * Sets cookie value * @param {type} name * @param {type} value */ setCookie: function (name, value) { var date = new Date(); date.setTime(date.getTime() + (synergy.defaultCookiesExpiration)); var expires = "; expires=" + date.toGMTString(); window.document.cookie = name + "=" + value + expires + "; path=/"; }, /** * Scrolls window so the beginning of element with given ID is visible in viewport * @param {type} elementID * @returns {undefined} */ scrollTo: function (elementID) { var positionX = 0; var positionY = 0; var navbar = window.document.getElementById("navbar-top"); var element = window.document.getElementById(elementID); while (element !== null) { positionX += element.offsetLeft; positionY += element.offsetTop; element = element.offsetParent; } window.scrollTo(positionX, positionY - navbar.offsetHeight); }, /** * Returns cookie value * @param {type} name * @returns {unresolved} */ getCookie: function (name) { name += "="; var ca = window.document.cookie.split(";"); for (var i = 0; i < ca.length; i++) { var c = ca[i]; while (c.charAt(0) === " ") { c = c.substring(1, c.length); } if (c.indexOf(name) === 0) { return c.substring(name.length, c.length); } } }, /** * Deletes cookie * @param {type} name * @returns {undefined} */ deleteCookie: function (name) { window.document.cookie = name + "=;; path=/"; }, encodeHTML: function () { // encodes all <pre> tags var pre = $("pre"); pre.html($("<div/>").text(pre.html).html()); } }; /** * Manipulates with cache used in Synergy. This implementation relies on localStorage */ this.cache = { /** * If value with given key exists, updates it. Otherwise new record is stored in localstorage */ "put": function (key, value) { if (window.localStorage) { window.localStorage.removeItem(key); try { window.localStorage.setItem(key, JSON.stringify(value)); } catch (e) { if (e.code === 22 || e.code === 21 || e.code === 20) { this.drop(); window.localStorage.setItem(key, JSON.stringify(value)); } } } }, /** * Removes everything from localStorage * @returns {undefined} */ "drop": function () { for (var i = 0, max = window.localStorage.length; i < max; i++) { window.localStorage.removeItem(window.localStorage.key(0)); } }, "clear": function (key) { if (window.localStorage) { window.localStorage.removeItem(key); } }, "get": function (key) { if (window.localStorage) { return JSON.parse(window.localStorage.getItem(key)); } return null; } }; /** * URL where should Synergy redirect you to login */ this.ssoLoginUrl = "https://netbeans.org/people/login?original_uri="; this.ssoLogoutUrl = "https://netbeans.org/people/logout?original_uri="; this.getLoginRedirectUrl = function (loginUrl, redirectUrl) { loginUrl += encodeURI(redirectUrl); return loginUrl + "?revalidate=1"; }; this.getLogoutRedirectUrl = function (logoutUrl, redirectUrl) { logoutUrl += encodeURI(redirectUrl); return logoutUrl + "?revalidate=1"; }; this.useSSO = false; } angular.module("synergy.core", ["synergy.handlers"]) .factory("SynergyCore", ["SynergyHandlers", function (SynergyHandlers) { var _appCore = null; return { init: function () { if (_appCore !== null) { throw new Error("Application already initialized"); } else { _appCore = new Synergy(SynergyHandlers); return _appCore; } } }; }]); })();