| <%-- |
| ~ Copyright (c) 2016 Google Inc. All Rights Reserved. |
| ~ |
| ~ Licensed under the Apache License, Version 2.0 (the "License"); you |
| ~ may not use this file except in compliance with the License. You may |
| ~ obtain a copy of the License at |
| ~ |
| ~ http://www.apache.org/licenses/LICENSE-2.0 |
| ~ |
| ~ Unless required by applicable law or agreed to in writing, software |
| ~ distributed under the License is distributed on an "AS IS" BASIS, |
| ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
| ~ implied. See the License for the specific language governing |
| ~ permissions and limitations under the License. |
| --%> |
| <%@ page contentType='text/html;charset=UTF-8' language='java' %> |
| <%@ taglib prefix='fn' uri='http://java.sun.com/jsp/jstl/functions' %> |
| <%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core'%> |
| |
| <html> |
| <link rel='stylesheet' href='/css/dashboard_main.css'> |
| <%@ include file='header.jsp' %> |
| <body> |
| <script> |
| var allTests = ${allTestsJson}; |
| var testSet = new Set(allTests); |
| var subscriptionMap = ${subscriptionMapJson}; |
| |
| var addFavorite = function() { |
| if ($(this).hasClass('disabled')) { |
| return; |
| } |
| var test = $('#input-box').val(); |
| if (!testSet.has(test) || test in subscriptionMap) { |
| return; |
| } |
| $('#add-button').addClass('disabled'); |
| $.post('/api/favorites', { testName: test}).then(function(data) { |
| if (!data.key) { |
| return; |
| } |
| subscriptionMap[test] = data.key; |
| var wrapper = $('<div></div>'); |
| var a = $('<a></a>') |
| .attr('href', '${resultsUrl}?testName=' + test); |
| var div = $('<div class="col s11 card hoverable option"></div>'); |
| div.addClass('valign-wrapper waves-effect'); |
| div.appendTo(a); |
| var span = $('<span class="entry valign"></span>').text(test); |
| span.appendTo(div); |
| a.appendTo(wrapper); |
| |
| var btnContainer = $('<div class="col s1 center btn-container"></div>'); |
| var silence = $('<a class="col s6 btn-flat notification-button active"></a>'); |
| silence.append('<i class="material-icons">notifications_active</i>'); |
| silence.attr('test', test); |
| silence.attr('title', 'Disable notifications'); |
| silence.appendTo(btnContainer); |
| silence.click(toggleNotifications); |
| |
| var clear = $('<a class="col s6 btn-flat remove-button"></a>'); |
| clear.append('<i class="material-icons">clear</i>'); |
| clear.attr('test', test); |
| clear.attr('title', 'Remove favorite'); |
| clear.appendTo(btnContainer); |
| clear.click(removeFavorite); |
| |
| btnContainer.appendTo(wrapper); |
| |
| wrapper.prependTo('#options').hide() |
| .slideDown(150); |
| $('#input-box').val(null); |
| Materialize.updateTextFields(); |
| }).always(function() { |
| $('#add-button').removeClass('disabled'); |
| }); |
| } |
| |
| var toggleNotifications = function() { |
| var self = $(this); |
| if (self.hasClass('disabled')) { |
| return; |
| } |
| self.addClass('disabled'); |
| var test = self.attr('test'); |
| if (!(test in subscriptionMap)) { |
| return; |
| } |
| var muteStatus = self.hasClass('active'); |
| var element = self; |
| $.post('/api/favorites', { userFavoritesKey: subscriptionMap[test], muteNotifications: muteStatus}).then(function(data) { |
| element = self.clone(); |
| if (element.hasClass('active')) { |
| element.find('i').text('notifications_off') |
| element.removeClass('active'); |
| element.addClass('inactive'); |
| element.attr('title', 'Enable notifications'); |
| } else { |
| element.find('i').text('notifications_active') |
| element.removeClass('inactive'); |
| element.addClass('active'); |
| element.attr('title', 'Disable notifications'); |
| } |
| element.click(toggleNotifications); |
| self.replaceWith(function() { |
| return element; |
| }); |
| }).always(function() { |
| element.removeClass('disabled'); |
| }); |
| } |
| |
| var removeFavorite = function() { |
| var self = $(this); |
| if (self.hasClass('disabled')) { |
| return; |
| } |
| var test = self.attr('test'); |
| if (!(test in subscriptionMap)) { |
| return; |
| } |
| self.addClass('disabled'); |
| $.ajax({ |
| url: '/api/favorites/' + subscriptionMap[test], |
| type: 'DELETE' |
| }).always(function() { |
| self.removeClass('disabled'); |
| }).then(function() { |
| delete subscriptionMap[test]; |
| self.parent().parent().slideUp(150, function() { |
| self.remove(); |
| }); |
| }); |
| } |
| |
| var addFavoriteButton = function() { |
| var self = $(this); |
| var test = self.attr('test'); |
| |
| $.post('/api/favorites', { testName: test}).then(function(data) { |
| if (data.key) { |
| subscriptionMap[test] = data.key; |
| |
| self.children().text("star"); |
| self.switchClass("add-fav-button", "min-fav-button", 0); |
| |
| self.off('click', addFavoriteButton); |
| self.on('click', removeFavoriteButton); |
| } |
| }) |
| .fail(function() { |
| alert( "Error occurred on registering your favorite test case!" ); |
| }); |
| } |
| |
| var removeFavoriteButton = function() { |
| var self = $(this); |
| var test = self.attr('test'); |
| |
| $.ajax({ |
| url: '/api/favorites/' + subscriptionMap[test], |
| type: 'DELETE' |
| }).then(function() { |
| delete subscriptionMap[test]; |
| |
| self.children().text("star_border"); |
| self.switchClass("min-fav-button", "add-fav-button", 0); |
| |
| self.off('click', removeFavoriteButton); |
| self.on('click', addFavoriteButton); |
| }); |
| } |
| |
| $.widget('custom.sizedAutocomplete', $.ui.autocomplete, { |
| _resizeMenu: function() { |
| this.menu.element.outerWidth($('#input-box').width()); |
| } |
| }); |
| |
| $(function() { |
| $('#input-box').sizedAutocomplete({ |
| source: allTests, |
| classes: { |
| 'ui-autocomplete': 'card' |
| } |
| }); |
| |
| $('#input-box').keyup(function(event) { |
| if (event.keyCode == 13) { // return button |
| $('#add-button').click(); |
| } |
| }); |
| |
| $('.remove-button').click(removeFavorite); |
| $('.notification-button').click(toggleNotifications); |
| $('#add-button').click(addFavorite); |
| |
| $('.add-fav-button').click(addFavoriteButton); |
| |
| $('.min-fav-button').click(removeFavoriteButton); |
| |
| $('#favoritesLink').click(function() { |
| window.open('/', '_self'); |
| }); |
| $('#allLink').click(function() { |
| window.open('/?showAll=true', '_self'); |
| }); |
| $('#acksLink').click(function() { |
| window.open('/show_test_acknowledgments', '_self'); |
| }); |
| }); |
| </script> |
| <div class='container wide'> |
| |
| <c:if test="${!showAll}"> |
| <ul id="guide_collapsible" class="collapsible" data-collapsible="accordion"> |
| <li> |
| <div class="collapsible-header"> |
| <i class="material-icons">library_books</i> |
| Notice |
| <span class="new badge right" style="position: inherit;">1</span> |
| </div> |
| <div class="collapsible-body"> |
| <div class='row'> |
| <div class='col s12' style="margin: 15px 0px 0px 30px;"> |
| <c:choose> |
| <c:when test="${fn:endsWith(serverName, 'googleplex.com')}"> |
| <c:set var="dataVersion" scope="page" value="new"/> |
| <c:choose> |
| <c:when test="${fn:startsWith(serverName, 'android-vts-internal')}"> |
| <c:set var="dataLink" scope="page" value="https://android-vts.appspot.com"/> |
| </c:when> |
| <c:when test="${fn:startsWith(serverName, 'android-vts-staging')}"> |
| <c:set var="dataLink" scope="page" value="https://android-vts-staging.appspot.com"/> |
| </c:when> |
| <c:otherwise> |
| <c:set var="dataLink" scope="page" value="https://android-vts-staging.appspot.com"/> |
| </c:otherwise> |
| </c:choose> |
| </c:when> |
| <c:when test="${fn:endsWith(serverName, 'appspot.com')}"> |
| <c:set var="dataVersion" scope="page" value="previous"/> |
| <c:choose> |
| <c:when test="${fn:startsWith(serverName, 'android-vts-staging')}"> |
| <c:set var="dataLink" scope="page" value="https://android-vts-staging.googleplex.com"/> |
| </c:when> |
| <c:when test="${fn:startsWith(serverName, 'android-vts')}"> |
| <c:set var="dataLink" scope="page" value="https://android-vts-internal.googleplex.com"/> |
| </c:when> |
| <c:otherwise> |
| <c:set var="dataLink" scope="page" value="https://android-vts-staging.googleplex.com"/> |
| </c:otherwise> |
| </c:choose> |
| </c:when> |
| <c:otherwise> |
| <c:set var="dataVersion" scope="page" value="local dev"/> |
| <c:set var="dataLink" scope="page" value="http://localhost"/> |
| </c:otherwise> |
| </c:choose> |
| Recently, we launched new appspot servers for dashboard. Thus you will have two diffrent versions of server for each staging and production data. |
| <br/> |
| If you want to find the <c:out value = "${dataVersion}"/> test data, please visit the next url <a href="<c:out value = "${dataLink}"/>"><c:out value = "${dataLink}"/></a>. |
| </div> |
| </div> |
| </div> |
| </li> |
| </ul> |
| </c:if> |
| |
| <c:choose> |
| <c:when test='${not empty error}'> |
| <div id='error-container' class='row card'> |
| <div class='col s12 center-align'> |
| <h5>${error}</h5> |
| </div> |
| </div> |
| </c:when> |
| <c:otherwise> |
| <div class='row home-tabs-row'> |
| <div class='col s12'> |
| <ul class='tabs'> |
| <li class='tab col s4' id='favoritesLink'><a class='${showAll ? "inactive" : "active"}'>Favorites</a></li> |
| <li class='tab col s4' id='allLink'><a class='${showAll ? "active" : "inactive"}'>All Tests</a></li> |
| <li class='tab col s4' id='acksLink'><a>Test Acknowledgements</a></li> |
| </ul> |
| </div> |
| </div> |
| <c:set var='width' value='${showAll ? 11 : 11}' /> |
| <c:if test='${not showAll}'> |
| <div class='row'> |
| <div class='input-field col s8'> |
| <input type='text' id='input-box'></input> |
| <label for='input-box'>Search for tests to add to favorites</label> |
| </div> |
| <div id='add-button-wrapper' class='col s1 valign-wrapper'> |
| <a id='add-button' class='btn-floating btn waves-effect waves-light red valign'><i class='material-icons'>add</i></a> |
| </div> |
| </div> |
| </c:if> |
| <div class='row' id='options'> |
| <c:forEach items='${testNames}' var='test'> |
| <div> |
| <a href='${resultsUrl}?testName=${test.name}'> |
| <div class='col s${width} card hoverable option valign-wrapper waves-effect'> |
| <span class='entry valign'>${test.name} |
| <c:if test='${test.failCount >= 0 && test.passCount >= 0}'> |
| <c:set var='color' value='${test.failCount > 0 ? "red" : (test.passCount > 0 ? "green" : "grey")}' /> |
| <span class='indicator right center ${color}'> |
| ${test.passCount} / ${test.passCount + test.failCount} |
| </span> |
| </c:if> |
| </span> |
| </div> |
| </a> |
| <c:choose> |
| <c:when test="${showAll}"> |
| <div class="col s1 center btn-container"> |
| <c:choose> |
| <c:when test="${test.isFavorite}"> |
| <a class="col s6 btn-flat min-fav-button" test="${test.name}" title="Remove favorite"> |
| <i class="material-icons">star</i> |
| </a> |
| </c:when> |
| <c:otherwise> |
| <a class="col s6 btn-flat add-fav-button" test="${test.name}" title="Add favorite"> |
| <i class="material-icons">star_border</i> |
| </a> |
| </c:otherwise> |
| </c:choose> |
| </div> |
| </c:when> |
| <c:otherwise> |
| <div class='col s1 center btn-container'> |
| <a class='col s6 btn-flat notification-button ${test.muteNotifications ? "inactive" : "active"}' test='${test.name}' title='${test.muteNotifications ? "Enable" : "Disable"} notifications'> |
| <i class='material-icons'>notifications_${test.muteNotifications ? "off" : "active"}</i> |
| </a> |
| <a class='col s6 btn-flat remove-button' test='${test.name}' title='Remove favorite'> |
| <i class='material-icons'>clear</i> |
| </a> |
| </div> |
| </c:otherwise> |
| </c:choose> |
| </div> |
| </c:forEach> |
| </div> |
| </c:otherwise> |
| </c:choose> |
| </div> |
| <%@ include file='footer.jsp' %> |
| </body> |
| </html> |