blob: 71f667946c21c280b5ebe16f08d711f225f022e3 [file] [log] [blame]
<%--
~ 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>