mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
update card layouts
This commit is contained in:
parent
8f4f29888e
commit
bb38230c23
46 changed files with 1086 additions and 332 deletions
|
@ -97,6 +97,19 @@
|
|||
});
|
||||
}
|
||||
|
||||
function setDefault(page) {
|
||||
|
||||
var backdropContainer = $('.backdropContainer');
|
||||
|
||||
if (backdropContainer.length) {
|
||||
backdropContainer.css('backgroundImage', 'url(css/images/splash.jpg)');
|
||||
} else {
|
||||
$(document.body).prepend('<div class="backdropContainer" style="background-image:url(css/images/splash.jpg);top:0;"></div>');
|
||||
}
|
||||
|
||||
$(page).addClass('backdropPage staticBackdropPage');
|
||||
}
|
||||
|
||||
function clearBackdrop() {
|
||||
|
||||
$('.backdropContainer').css('backgroundImage', '');
|
||||
|
@ -213,7 +226,8 @@
|
|||
window.Backdrops = {
|
||||
|
||||
setBackdrops: setBackdrops,
|
||||
setBackdropUrl: setBackdropUrl
|
||||
setBackdropUrl: setBackdropUrl,
|
||||
setDefault: setDefault
|
||||
};
|
||||
|
||||
})(jQuery, document);
|
|
@ -146,8 +146,10 @@
|
|||
defaultShape: 'square',
|
||||
context: 'channels',
|
||||
showTitle: true,
|
||||
centerText: true,
|
||||
coverImage: true
|
||||
coverImage: true,
|
||||
cardLayout: true,
|
||||
showYear: true,
|
||||
lazy: true
|
||||
});
|
||||
|
||||
var elem = $('#items', page).html(html).lazyChildren();
|
||||
|
|
|
@ -21,14 +21,32 @@
|
|||
|
||||
updateFilterControls(page);
|
||||
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
context: 'channels',
|
||||
showTitle: true,
|
||||
centerText: true,
|
||||
preferThumb: true
|
||||
});
|
||||
var view = 'Thumb';
|
||||
|
||||
if (view == "Thumb") {
|
||||
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
context: 'channels',
|
||||
showTitle: true,
|
||||
centerText: true,
|
||||
preferThumb: true
|
||||
});
|
||||
|
||||
}
|
||||
else if (view == "ThumbCard") {
|
||||
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
preferThumb: true,
|
||||
context: 'channels',
|
||||
lazy: true,
|
||||
cardLayout: true,
|
||||
showTitle: true
|
||||
});
|
||||
}
|
||||
|
||||
$('#items', page).html(html).lazyChildren();
|
||||
|
||||
|
|
|
@ -2,12 +2,13 @@
|
|||
|
||||
function onLoggedIn() {
|
||||
|
||||
Dashboard.hideModalLoadingMsg();
|
||||
Dashboard.navigate('selectserver.html');
|
||||
}
|
||||
|
||||
function login(page, username, password) {
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
Dashboard.showModalLoadingMsg();
|
||||
|
||||
ConnectionManager.loginToConnect(username, password).done(function () {
|
||||
|
||||
|
@ -30,6 +31,8 @@
|
|||
|
||||
function handleConnectionResult(page, result) {
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
|
||||
switch (result.State) {
|
||||
|
||||
case MediaBrowser.ConnectionState.SignedIn:
|
||||
|
@ -71,12 +74,10 @@
|
|||
|
||||
function loadAppConnection(page) {
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
Dashboard.showModalLoadingMsg();
|
||||
|
||||
ConnectionManager.connect().done(function (result) {
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
|
||||
handleConnectionResult(page, result);
|
||||
|
||||
});
|
||||
|
@ -99,8 +100,7 @@
|
|||
}
|
||||
function loadMode(page, mode) {
|
||||
|
||||
$(document.body).prepend('<div class="backdropContainer" style="background-image:url(css/images/splash.jpg);top:0;"></div>');
|
||||
$(page).addClass('backdropPage staticBackdropPage');
|
||||
Backdrops.setDefault(page);
|
||||
|
||||
if (mode == 'welcome') {
|
||||
$('.connectLoginForm', page).hide();
|
||||
|
@ -119,13 +119,17 @@
|
|||
}
|
||||
}
|
||||
|
||||
function skip() {
|
||||
|
||||
Dashboard.navigate('selectserver.html');
|
||||
}
|
||||
|
||||
$(document).on('pageinit', "#connectLoginPage", function () {
|
||||
|
||||
var page = this;
|
||||
|
||||
$('.btnSkipConnect', page).on('click', function() {
|
||||
|
||||
Dashboard.navigate('connectlogin.html?mode=manualserver');
|
||||
$('.btnSkipConnect', page).on('click', function () {
|
||||
skip();
|
||||
});
|
||||
|
||||
}).on('pageshow', "#connectLoginPage", function () {
|
||||
|
@ -138,13 +142,9 @@
|
|||
$('.embyIntroDownloadMessage', page).html(Globalize.translate('EmbyIntroDownloadMessage', link));
|
||||
|
||||
if (Dashboard.isRunningInCordova()) {
|
||||
$('.newUsers', page).hide();
|
||||
$('.forgotPassword', page).hide();
|
||||
$('.skip', page).show();
|
||||
} else {
|
||||
$('.skip', page).hide();
|
||||
$('.newUsers', page).show();
|
||||
$('.forgotPassword', page).show();
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -157,18 +157,14 @@
|
|||
host += ':' + port;
|
||||
}
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
Dashboard.showModalLoadingMsg();
|
||||
|
||||
ConnectionManager.connectToAddress(host).done(function (result) {
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
|
||||
handleConnectionResult(page, result);
|
||||
|
||||
}).fail(function () {
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
|
||||
handleConnectionResult(page, {
|
||||
State: MediaBrowser.ConnectionState.Unavailable
|
||||
});
|
||||
|
|
|
@ -626,7 +626,7 @@
|
|||
imgUrl = 'css/images/clients/html5.png';
|
||||
}
|
||||
|
||||
return "<img src='" + imgUrl + "' alt='Emby Web Client' />";
|
||||
return "<img src='" + imgUrl + "' alt='Emby Mobile' />";
|
||||
}
|
||||
if (clientLowered == "mb-classic") {
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
(function ($, document) {
|
||||
|
||||
var view = LibraryBrowser.getDefaultItemsView('Poster', 'Poster');
|
||||
var view = LibraryBrowser.getDefaultItemsView('Poster', 'PosterCard');
|
||||
|
||||
// The base query options
|
||||
var query = {
|
||||
|
@ -46,6 +46,12 @@
|
|||
updateFilterControls();
|
||||
var trigger = false;
|
||||
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
if (view == 'Poster') {
|
||||
view = 'PosterCard';
|
||||
}
|
||||
}
|
||||
|
||||
if (view == "List") {
|
||||
|
||||
html = LibraryBrowser.getListViewHtml({
|
||||
|
|
|
@ -139,6 +139,8 @@
|
|||
|
||||
var html = '';
|
||||
|
||||
var cardLayout = AppInfo.hasLowImageBandwidth;
|
||||
|
||||
if (items.length) {
|
||||
html += '<div>';
|
||||
html += '<h1 style="display:inline-block; vertical-align:middle;" class="listHeader">' + Globalize.translate('HeaderLatestMedia') + '</h1>';
|
||||
|
@ -157,6 +159,9 @@
|
|||
showUnplayedIndicator: false,
|
||||
showChildCountIndicator: true,
|
||||
lazy: true,
|
||||
cardLayout: cardLayout,
|
||||
showTitle: cardLayout,
|
||||
showYear: cardLayout
|
||||
});
|
||||
html += '</div>';
|
||||
}
|
||||
|
@ -275,6 +280,8 @@
|
|||
|
||||
var html = '';
|
||||
|
||||
var cardLayout = AppInfo.hasLowImageBandwidth;
|
||||
|
||||
if (result.Items.length) {
|
||||
html += '<h1 class="listHeader">' + Globalize.translate('HeaderResume') + '</h1>';
|
||||
html += '<div>';
|
||||
|
@ -282,11 +289,12 @@
|
|||
items: result.Items,
|
||||
preferThumb: true,
|
||||
shape: 'backdrop',
|
||||
overlayText: screenWidth >= 800 && !AppInfo.hasLowImageBandwidth,
|
||||
overlayText: screenWidth >= 800 && !cardLayout,
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
context: 'home',
|
||||
lazy: true
|
||||
lazy: true,
|
||||
cardLayout: cardLayout
|
||||
});
|
||||
html += '</div>';
|
||||
}
|
||||
|
@ -542,10 +550,10 @@
|
|||
|
||||
function dismissWelcome(page, userId) {
|
||||
|
||||
ApiClient.getDisplayPreferences('home', userId, 'webclient').done(function (result) {
|
||||
getDisplayPreferences('home', userId).done(function (result) {
|
||||
|
||||
result.CustomPrefs[homePageTourKey] = homePageDismissValue;
|
||||
ApiClient.updateDisplayPreferences('home', result, userId, 'webclient');
|
||||
ApiClient.updateDisplayPreferences('home', result, userId, getDisplayPreferencesAppName());
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -635,7 +643,7 @@
|
|||
|
||||
var userId = Dashboard.getCurrentUserId();
|
||||
|
||||
ApiClient.getDisplayPreferences('home', userId, 'webclient').done(function (result) {
|
||||
getDisplayPreferences('home', userId).done(function (result) {
|
||||
|
||||
Dashboard.getCurrentUser().done(function (user) {
|
||||
|
||||
|
@ -648,4 +656,20 @@
|
|||
|
||||
});
|
||||
|
||||
function getDisplayPreferencesAppName() {
|
||||
|
||||
if (Dashboard.isRunningInCordova()) {
|
||||
return 'Emby Mobile';
|
||||
}
|
||||
|
||||
return 'webclient';
|
||||
}
|
||||
|
||||
function getDisplayPreferences(key, userId) {
|
||||
|
||||
return ApiClient.getDisplayPreferences(key, userId, getDisplayPreferencesAppName()).done(function (result) {
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
})(jQuery, document);
|
||||
|
|
|
@ -342,7 +342,7 @@
|
|||
|
||||
var chapters = item.Chapters || [];
|
||||
|
||||
if (!chapters.length) {
|
||||
if (!chapters.length || AppInfo.hasLowImageBandwidth) {
|
||||
$('#scenesCollapsible', page).hide();
|
||||
} else {
|
||||
$('#scenesCollapsible', page).show();
|
||||
|
@ -616,9 +616,11 @@
|
|||
|
||||
var promise;
|
||||
|
||||
var screenWidth = $(window).width();
|
||||
|
||||
var options = {
|
||||
userId: Dashboard.getCurrentUserId(),
|
||||
limit: 5,
|
||||
limit: screenWidth > 800 ? 5 : 4,
|
||||
fields: "PrimaryImageAspectRatio,UserData,SyncInfo"
|
||||
};
|
||||
|
||||
|
|
|
@ -55,6 +55,12 @@
|
|||
context = 'folders';
|
||||
}
|
||||
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
if (view == 'Poster') {
|
||||
view = 'PosterCard';
|
||||
}
|
||||
}
|
||||
|
||||
if (view == "Backdrop") {
|
||||
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
|
@ -75,6 +81,16 @@
|
|||
context: context
|
||||
});
|
||||
}
|
||||
else if (view == "PosterCard") {
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "auto",
|
||||
showTitle: true,
|
||||
context: context,
|
||||
cardLayout: true,
|
||||
showYear: true
|
||||
});
|
||||
}
|
||||
|
||||
var elem = $('#items', page).html(html).lazyChildren();
|
||||
|
||||
|
|
|
@ -1006,9 +1006,7 @@
|
|||
|
||||
var imagesPerRow = LibraryBrowser.getPostersPerRow(screenWidth);
|
||||
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
screenWidth *= .95;
|
||||
} else {
|
||||
if (!AppInfo.hasLowImageBandwidth) {
|
||||
screenWidth *= 1.25;
|
||||
}
|
||||
|
||||
|
@ -1565,7 +1563,8 @@
|
|||
if (options.cardLayout) {
|
||||
html += '<div class="cardText" style="text-align:right; float:right;">';
|
||||
// Render out the jqm classes so that we don't have to call trigger create
|
||||
html += '<button class="listviewMenuButton ui-btn ui-icon-ellipsis-v ui-btn-icon-notext ui-btn-inline ui-shadow ui-corner-all" type="button" data-inline="true" data-iconpos="notext" data-icon="ellipsis-v" style="margin: 4px 0 0;"></button>';
|
||||
//html += '<button class="listviewMenuButton ui-btn ui-icon-ellipsis-v ui-btn-icon-notext ui-btn-inline ui-shadow ui-corner-all" type="button" data-inline="true" data-iconpos="notext" data-icon="ellipsis-v" style="margin: 4px 0 0;"></button>';
|
||||
html += '<button class="listviewMenuButton imageButton btnCardOptions" type="button" data-role="none" style="margin: 4px 0 0;"><i class="fa fa-ellipsis-v"></i></button>';
|
||||
html += "</div>";
|
||||
}
|
||||
|
||||
|
@ -1618,15 +1617,19 @@
|
|||
lines.push(songLine);
|
||||
}
|
||||
|
||||
if (options.showPremiereDate && item.PremiereDate) {
|
||||
if (options.showPremiereDate) {
|
||||
|
||||
try {
|
||||
if (item.PremiereDate) {
|
||||
try {
|
||||
|
||||
lines.push(LibraryBrowser.getPremiereDateText(item));
|
||||
lines.push(LibraryBrowser.getPremiereDateText(item));
|
||||
|
||||
} catch (err) {
|
||||
} catch (err) {
|
||||
lines.push('');
|
||||
|
||||
}
|
||||
} else {
|
||||
lines.push('');
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -11,7 +11,8 @@
|
|||
return LibraryBrowser.getPosterViewHtml({
|
||||
items: channels,
|
||||
shape: "smallBackdrop",
|
||||
centerText: true
|
||||
centerText: true,
|
||||
lazy: true
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
(function ($, document) {
|
||||
|
||||
var view = LibraryBrowser.getDefaultItemsView('Poster', 'Poster');
|
||||
var view = LibraryBrowser.getDefaultItemsView('Poster', 'PosterCard');
|
||||
|
||||
// The base query options
|
||||
var query = {
|
||||
|
@ -53,6 +53,15 @@
|
|||
updateFilterControls(page);
|
||||
var trigger = false;
|
||||
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
if (view == 'Thumb') {
|
||||
view = 'ThumbCard';
|
||||
}
|
||||
else if (view == 'Poster') {
|
||||
view = 'PosterCard';
|
||||
}
|
||||
}
|
||||
|
||||
if (result.TotalRecordCount) {
|
||||
|
||||
if (view == "List") {
|
||||
|
@ -74,6 +83,17 @@
|
|||
lazy: true
|
||||
});
|
||||
}
|
||||
else if (view == "PosterCard") {
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "auto",
|
||||
context: 'movies',
|
||||
showTitle: true,
|
||||
cardLayout: true,
|
||||
lazy: true,
|
||||
showItemCounts: true
|
||||
});
|
||||
}
|
||||
else if (view == "Thumb") {
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
|
@ -85,6 +105,18 @@
|
|||
preferThumb: true
|
||||
});
|
||||
}
|
||||
else if (view == "ThumbCard") {
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
context: 'movies',
|
||||
showTitle: true,
|
||||
lazy: true,
|
||||
preferThumb: true,
|
||||
cardLayout: true,
|
||||
showItemCounts: true
|
||||
});
|
||||
}
|
||||
|
||||
$('.noItemsMessage', page).hide();
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
(function ($, document) {
|
||||
|
||||
var view = LibraryBrowser.getDefaultItemsView('Thumb', 'Thumb');
|
||||
var view = LibraryBrowser.getDefaultItemsView('Thumb', 'ThumbCard');
|
||||
|
||||
// The base query options
|
||||
var query = {
|
||||
|
@ -39,6 +39,15 @@
|
|||
|
||||
updateFilterControls(page);
|
||||
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
if (view == 'Thumb') {
|
||||
view = 'ThumbCard';
|
||||
}
|
||||
else if (view == 'Poster') {
|
||||
view = 'PosterCard';
|
||||
}
|
||||
}
|
||||
|
||||
if (view == "Thumb") {
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
|
@ -63,6 +72,17 @@
|
|||
lazy: true
|
||||
});
|
||||
}
|
||||
else if (view == "PosterCard") {
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "portrait",
|
||||
context: 'movies',
|
||||
showItemCounts: true,
|
||||
lazy: true,
|
||||
cardLayout: true,
|
||||
showTitle: true
|
||||
});
|
||||
}
|
||||
else if (view == "Poster") {
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
(function ($, document) {
|
||||
|
||||
var view = LibraryBrowser.getDefaultItemsView('Poster', 'Poster');
|
||||
var view = LibraryBrowser.getDefaultItemsView('Poster', 'PosterCard');
|
||||
|
||||
// The base query options
|
||||
var query = {
|
||||
|
@ -48,6 +48,15 @@
|
|||
updateFilterControls(page);
|
||||
var trigger = false;
|
||||
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
if (view == 'Thumb') {
|
||||
view = 'ThumbCard';
|
||||
}
|
||||
else if (view == 'Poster') {
|
||||
view = 'PosterCard';
|
||||
}
|
||||
}
|
||||
|
||||
if (view == "Thumb") {
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
|
@ -55,8 +64,7 @@
|
|||
preferThumb: true,
|
||||
context: 'movies',
|
||||
lazy: true,
|
||||
overlayText: true,
|
||||
showTitle: false
|
||||
overlayText: true
|
||||
});
|
||||
}
|
||||
else if (view == "ThumbCard") {
|
||||
|
@ -96,7 +104,6 @@
|
|||
items: result.Items,
|
||||
shape: "portrait",
|
||||
context: 'movies',
|
||||
showTitle: false,
|
||||
centerText: true,
|
||||
lazy: true,
|
||||
overlayText: true
|
||||
|
|
|
@ -1,10 +1,29 @@
|
|||
(function ($, document) {
|
||||
|
||||
function getView() {
|
||||
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
return 'PosterCard';
|
||||
}
|
||||
|
||||
return 'PosterCard';
|
||||
}
|
||||
|
||||
function getResumeView() {
|
||||
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
return 'ThumbCard';
|
||||
}
|
||||
|
||||
return 'ThumbCard';
|
||||
}
|
||||
|
||||
function loadLatest(page, userId, parentId) {
|
||||
|
||||
var limit = AppInfo.hasLowImageBandwidth ?
|
||||
15 :
|
||||
18;
|
||||
var limit = 18;
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
limit = 10;
|
||||
}
|
||||
|
||||
var options = {
|
||||
|
||||
|
@ -18,13 +37,34 @@
|
|||
|
||||
ApiClient.getJSON(ApiClient.getUrl('Users/' + userId + '/Items/Latest', options)).done(function (items) {
|
||||
|
||||
$('#recentlyAddedItems', page).html(LibraryBrowser.getPosterViewHtml({
|
||||
items: items,
|
||||
lazy: true,
|
||||
shape: 'portrait',
|
||||
overlayText: false
|
||||
var view = getView();
|
||||
var html = '';
|
||||
|
||||
})).lazyChildren().trigger('create');
|
||||
if (view == 'PosterCard') {
|
||||
|
||||
html += LibraryBrowser.getPosterViewHtml({
|
||||
items: items,
|
||||
lazy: true,
|
||||
shape: 'portrait',
|
||||
overlayText: false,
|
||||
showTitle: true,
|
||||
showYear: true,
|
||||
cardLayout: true
|
||||
|
||||
});
|
||||
|
||||
} else if (view == 'Poster') {
|
||||
|
||||
html += LibraryBrowser.getPosterViewHtml({
|
||||
items: items,
|
||||
shape: "portrait",
|
||||
centerText: true,
|
||||
lazy: true,
|
||||
overlayText: true
|
||||
});
|
||||
}
|
||||
|
||||
$('#recentlyAddedItems', page).html(html).lazyChildren().trigger('create');
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -55,15 +95,35 @@
|
|||
$('#resumableSection', page).hide();
|
||||
}
|
||||
|
||||
$('#resumableItems', page).html(LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
preferThumb: true,
|
||||
shape: 'backdrop',
|
||||
overlayText: true,
|
||||
showTitle: true,
|
||||
lazy: true
|
||||
var view = getResumeView();
|
||||
var html = '';
|
||||
|
||||
})).lazyChildren().trigger('create');
|
||||
if (view == 'ThumbCard') {
|
||||
|
||||
html += LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
preferThumb: true,
|
||||
shape: 'backdrop',
|
||||
showTitle: true,
|
||||
showYear: true,
|
||||
lazy: true,
|
||||
cardLayout: true
|
||||
|
||||
});
|
||||
|
||||
} else if (view == 'Thumb') {
|
||||
|
||||
html += LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
preferThumb: true,
|
||||
shape: 'backdrop',
|
||||
overlayText: true,
|
||||
showTitle: true,
|
||||
lazy: true
|
||||
});
|
||||
}
|
||||
|
||||
$('#resumableItems', page).html(html).lazyChildren().trigger('create');
|
||||
|
||||
});
|
||||
}
|
||||
|
@ -95,12 +155,32 @@
|
|||
html += '<h1 class="listHeader">' + title + '</h1>';
|
||||
|
||||
html += '<div>';
|
||||
html += LibraryBrowser.getPosterViewHtml({
|
||||
items: recommendation.Items,
|
||||
lazy: true,
|
||||
shape: 'portrait',
|
||||
overlayText: true
|
||||
});
|
||||
|
||||
var view = getView();
|
||||
|
||||
if (view == 'PosterCard') {
|
||||
|
||||
html += LibraryBrowser.getPosterViewHtml({
|
||||
items: recommendation.Items,
|
||||
lazy: true,
|
||||
shape: 'portrait',
|
||||
overlayText: false,
|
||||
showTitle: true,
|
||||
showYear: true,
|
||||
cardLayout: true
|
||||
|
||||
});
|
||||
|
||||
} else if (view == 'Poster') {
|
||||
|
||||
html += LibraryBrowser.getPosterViewHtml({
|
||||
items: recommendation.Items,
|
||||
shape: "portrait",
|
||||
centerText: true,
|
||||
lazy: true,
|
||||
overlayText: true
|
||||
});
|
||||
}
|
||||
html += '</div>';
|
||||
|
||||
return html;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
(function ($, document) {
|
||||
|
||||
var view = LibraryBrowser.getDefaultItemsView('Poster', 'Poster');
|
||||
var view = LibraryBrowser.getDefaultItemsView('PosterCard', 'PosterCard');
|
||||
|
||||
// The base query options
|
||||
var query = {
|
||||
|
@ -54,10 +54,10 @@
|
|||
items: result.Items,
|
||||
shape: "portrait",
|
||||
context: 'movies-trailers',
|
||||
showTitle: false,
|
||||
centerText: true,
|
||||
showTitle: true,
|
||||
showYear: true,
|
||||
lazy: true,
|
||||
overlayText: false
|
||||
cardLayout: true
|
||||
});
|
||||
|
||||
var elem = $('.itemsContainer', page).html(html).lazyChildren();
|
||||
|
|
|
@ -46,6 +46,12 @@
|
|||
updateFilterControls(page);
|
||||
var trigger = false;
|
||||
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
if (view == 'Poster') {
|
||||
view = 'PosterCard';
|
||||
}
|
||||
}
|
||||
|
||||
if (view == "List") {
|
||||
|
||||
html = LibraryBrowser.getListViewHtml({
|
||||
|
|
|
@ -44,6 +44,12 @@
|
|||
updateFilterControls(page);
|
||||
var trigger = false;
|
||||
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
if (view == 'Poster') {
|
||||
view = 'PosterCard';
|
||||
}
|
||||
}
|
||||
|
||||
if (view == "Poster") {
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
|
|
|
@ -47,6 +47,12 @@
|
|||
updateFilterControls(page);
|
||||
var trigger = false;
|
||||
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
if (view == 'Poster') {
|
||||
view = 'PosterCard';
|
||||
}
|
||||
}
|
||||
|
||||
if (view == "List") {
|
||||
|
||||
html = LibraryBrowser.getListViewHtml({
|
||||
|
|
|
@ -26,6 +26,13 @@
|
|||
$(document).scrollTop(0);
|
||||
|
||||
var html = '';
|
||||
var view = 'Thumb';
|
||||
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
if (view == 'Thumb') {
|
||||
view = 'ThumbCard';
|
||||
}
|
||||
}
|
||||
|
||||
$('.listTopPaging', page).html(LibraryBrowser.getQueryPagingHtml({
|
||||
startIndex: query.StartIndex,
|
||||
|
@ -38,15 +45,30 @@
|
|||
|
||||
updateFilterControls(page);
|
||||
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
preferThumb: true,
|
||||
context: 'music',
|
||||
showItemCounts: true,
|
||||
centerText: true,
|
||||
lazy: true
|
||||
});
|
||||
if (view == "Thumb") {
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
preferThumb: true,
|
||||
context: 'music',
|
||||
showItemCounts: true,
|
||||
centerText: true,
|
||||
lazy: true
|
||||
});
|
||||
}
|
||||
else if (view == "ThumbCard") {
|
||||
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
preferThumb: true,
|
||||
context: 'music',
|
||||
showItemCounts: true,
|
||||
cardLayout: true,
|
||||
lazy: true,
|
||||
showTitle: true
|
||||
});
|
||||
}
|
||||
|
||||
$('#items', page).html(html).lazyChildren();
|
||||
|
||||
|
|
|
@ -37,13 +37,37 @@
|
|||
|
||||
updateFilterControls(page);
|
||||
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "square",
|
||||
context: 'music',
|
||||
showTitle: true,
|
||||
centerText: true
|
||||
});
|
||||
var view = 'Poster';
|
||||
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
if (view == 'Poster') {
|
||||
view = 'PosterCard';
|
||||
}
|
||||
}
|
||||
|
||||
if (view == "Poster") {
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "square",
|
||||
context: 'music',
|
||||
showTitle: true,
|
||||
lazy: true,
|
||||
centerText: true
|
||||
});
|
||||
}
|
||||
else if (view == "PosterCard") {
|
||||
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "square",
|
||||
context: 'music',
|
||||
showTitle: true,
|
||||
centerText: true,
|
||||
cardLayout: true,
|
||||
lazy: true,
|
||||
showParentTitle: true
|
||||
});
|
||||
}
|
||||
|
||||
$('#items', page).html(html).trigger('create');
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
(function ($, document) {
|
||||
|
||||
var view = LibraryBrowser.getDefaultItemsView('Poster', 'Poster');
|
||||
var view = LibraryBrowser.getDefaultItemsView('Poster', 'PosterCard');
|
||||
|
||||
// The base query options
|
||||
var query = {
|
||||
|
@ -40,15 +40,36 @@
|
|||
|
||||
updateFilterControls(page);
|
||||
|
||||
// Poster
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "auto",
|
||||
context: getParameterByName('context') || 'photos',
|
||||
showTitle: query.MediaTypes != 'Photo',
|
||||
overlayText: true,
|
||||
lazy: true
|
||||
});
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
if (view == 'Poster') {
|
||||
view = 'PosterCard';
|
||||
}
|
||||
}
|
||||
|
||||
if (view == "Poster") {
|
||||
// Poster
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "auto",
|
||||
context: getParameterByName('context') || 'photos',
|
||||
showTitle: query.MediaTypes != 'Photo',
|
||||
overlayText: true,
|
||||
lazy: true
|
||||
});
|
||||
}
|
||||
else if (view == "PosterCard") {
|
||||
|
||||
// Poster
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "auto",
|
||||
context: getParameterByName('context') || 'photos',
|
||||
showTitle: true,
|
||||
lazy: true,
|
||||
cardLayout: true,
|
||||
showPremiereDate: true
|
||||
});
|
||||
}
|
||||
|
||||
var elem = $('#items', page).html(html).lazyChildren();
|
||||
|
||||
|
|
|
@ -154,7 +154,7 @@
|
|||
// Need the timeout because jquery mobile will not show a popup if there's currently already one in the process of closing
|
||||
setTimeout(function () {
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
Dashboard.hideModalLoadingMsg();
|
||||
Dashboard.alert({
|
||||
message: Globalize.translate('DefaultErrorMessage')
|
||||
});
|
||||
|
@ -164,12 +164,12 @@
|
|||
|
||||
function acceptInvitation(page, id) {
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
Dashboard.showModalLoadingMsg();
|
||||
|
||||
// Add/Update connect info
|
||||
ConnectionManager.acceptServer(id).done(function () {
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
Dashboard.hideModalLoadingMsg();
|
||||
loadPage(page);
|
||||
|
||||
}).fail(function () {
|
||||
|
@ -180,12 +180,12 @@
|
|||
|
||||
function deleteServer(page, id) {
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
Dashboard.showModalLoadingMsg();
|
||||
|
||||
// Add/Update connect info
|
||||
ConnectionManager.deleteServer(id).done(function () {
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
Dashboard.hideModalLoadingMsg();
|
||||
loadPage(page);
|
||||
|
||||
}).fail(function () {
|
||||
|
@ -197,12 +197,12 @@
|
|||
|
||||
function rejectInvitation(page, id) {
|
||||
|
||||
Dashboard.showLoadingMsg();
|
||||
Dashboard.showModalLoadingMsg();
|
||||
|
||||
// Add/Update connect info
|
||||
ConnectionManager.rejectServer(id).done(function () {
|
||||
|
||||
Dashboard.hideLoadingMsg();
|
||||
Dashboard.hideModalLoadingMsg();
|
||||
loadPage(page);
|
||||
|
||||
}).fail(function () {
|
||||
|
@ -372,6 +372,8 @@
|
|||
|
||||
Dashboard.showLoadingMsg();
|
||||
|
||||
Backdrops.setDefault(page);
|
||||
|
||||
ConnectionManager.getAvailableServers().done(function (servers) {
|
||||
|
||||
servers = servers.slice(0);
|
||||
|
@ -400,7 +402,17 @@
|
|||
loadInvitations(page);
|
||||
}
|
||||
|
||||
$(document).on('pageshow', "#selectServerPage", function () {
|
||||
$(document).on('pagebeforecreate', "#selectServerPage", function () {
|
||||
|
||||
var page = this;
|
||||
|
||||
if (ConnectionManager.isLoggedIntoConnect()) {
|
||||
$(page).addClass('libraryPage').addClass(' noSecondaryNavPage').removeClass('standalonePage');
|
||||
} else {
|
||||
$(page).removeClass('libraryPage').removeClass(' noSecondaryNavPage').addClass('standalonePage');
|
||||
}
|
||||
|
||||
}).on('pagebeforeshow', "#selectServerPage", function () {
|
||||
|
||||
var page = this;
|
||||
|
||||
|
|
|
@ -87,7 +87,7 @@ var Dashboard = {
|
|||
}
|
||||
Dashboard.hideLoadingMsg();
|
||||
|
||||
if (!Dashboard.suppressAjaxErrors) {
|
||||
if (!Dashboard.suppressAjaxErrors && data.type != 'GET') {
|
||||
|
||||
setTimeout(function () {
|
||||
|
||||
|
@ -428,6 +428,10 @@ var Dashboard = {
|
|||
|
||||
navigate: function (url, preserveQueryString) {
|
||||
|
||||
if (!url) {
|
||||
throw new Error('url cannot be null or empty');
|
||||
}
|
||||
|
||||
var queryString = getWindowLocationSearch();
|
||||
if (preserveQueryString && queryString) {
|
||||
url += queryString;
|
||||
|
@ -1363,10 +1367,10 @@ var Dashboard = {
|
|||
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
|
||||
quality -= 10;
|
||||
quality -= 20;
|
||||
|
||||
if (isBackdrop) {
|
||||
quality -= 10;
|
||||
quality -= 20;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1421,6 +1425,8 @@ var Dashboard = {
|
|||
|
||||
if (Dashboard.isRunningInCordova()) {
|
||||
|
||||
appName = "Emby Mobile";
|
||||
|
||||
deviceName = store.getItem('cordovaDeviceName');
|
||||
deviceId = store.getItem('cordovaDeviceId');
|
||||
}
|
||||
|
@ -1501,6 +1507,7 @@ var AppInfo = {};
|
|||
AppInfo.enableLatestChannelItems = true;
|
||||
AppInfo.enableStudioTabs = true;
|
||||
AppInfo.enablePeopleTabs = true;
|
||||
AppInfo.enableHomeFavoritesTab = true;
|
||||
AppInfo.enableTvEpisodesTab = true;
|
||||
AppInfo.enableMusicArtistsTab = true;
|
||||
AppInfo.enableHomeLatestTab = true;
|
||||
|
@ -1617,6 +1624,10 @@ var AppInfo = {};
|
|||
$(document.body).addClass('peopleTabDisabled');
|
||||
}
|
||||
|
||||
if (!AppInfo.enableHomeFavoritesTab) {
|
||||
$(document.body).addClass('homeFavoritesTabDisabled');
|
||||
}
|
||||
|
||||
if (!AppInfo.enableTvEpisodesTab) {
|
||||
$(document.body).addClass('tvEpisodesTabDisabled');
|
||||
}
|
||||
|
@ -1780,6 +1791,7 @@ var AppInfo = {};
|
|||
|
||||
$(onReady);
|
||||
}
|
||||
|
||||
})();
|
||||
|
||||
Dashboard.jQueryMobileInit();
|
||||
|
|
|
@ -103,7 +103,7 @@
|
|||
// cardScalable
|
||||
html += "</div>";
|
||||
|
||||
html += '<div class="cardFooter">';
|
||||
html += '<div class="cardFooter outerCardFooter">';
|
||||
|
||||
var textLines = [];
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
(function ($, document) {
|
||||
|
||||
var view = LibraryBrowser.getDefaultItemsView('Thumb', 'Thumb');
|
||||
var view = LibraryBrowser.getDefaultItemsView('Thumb', 'ThumbCard');
|
||||
|
||||
// The base query options
|
||||
var query = {
|
||||
|
@ -39,6 +39,15 @@
|
|||
|
||||
updateFilterControls(page);
|
||||
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
if (view == 'Thumb') {
|
||||
view = 'ThumbCard';
|
||||
}
|
||||
else if (view == 'Poster') {
|
||||
view = 'PosterCard';
|
||||
}
|
||||
}
|
||||
|
||||
if (view == "Thumb") {
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
|
@ -63,6 +72,17 @@
|
|||
lazy: true
|
||||
});
|
||||
}
|
||||
else if (view == "PosterCard") {
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "portrait",
|
||||
context: 'tv',
|
||||
showItemCounts: true,
|
||||
lazy: true,
|
||||
cardLayout: true,
|
||||
showTitle: true
|
||||
});
|
||||
}
|
||||
else if (view == "Poster") {
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
|
|
|
@ -1,5 +1,14 @@
|
|||
(function ($, document) {
|
||||
|
||||
function getView() {
|
||||
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
return 'ThumbCard';
|
||||
}
|
||||
|
||||
return 'Thumb';
|
||||
}
|
||||
|
||||
$(document).on('pagebeforeshow', "#tvNextUpPage", function () {
|
||||
|
||||
var userId = Dashboard.getCurrentUserId();
|
||||
|
@ -8,9 +17,11 @@
|
|||
|
||||
var page = this;
|
||||
|
||||
var limit = AppInfo.hasLowImageBandwidth ?
|
||||
20 :
|
||||
30;
|
||||
var limit = 30;
|
||||
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
limit = 16;
|
||||
}
|
||||
|
||||
var options = {
|
||||
|
||||
|
@ -24,18 +35,43 @@
|
|||
|
||||
ApiClient.getJSON(ApiClient.getUrl('Users/' + userId + '/Items/Latest', options)).done(function (items) {
|
||||
|
||||
$('#latestEpisodes', page).html(LibraryBrowser.getPosterViewHtml({
|
||||
items: items,
|
||||
shape: "backdrop",
|
||||
preferThumb: true,
|
||||
inheritThumb: false,
|
||||
showParentTitle: false,
|
||||
showUnplayedIndicator: false,
|
||||
showChildCountIndicator: true,
|
||||
overlayText: true,
|
||||
lazy: true
|
||||
var view = getView();
|
||||
var html = '';
|
||||
|
||||
})).lazyChildren();
|
||||
if (view == 'ThumbCard') {
|
||||
|
||||
html += LibraryBrowser.getPosterViewHtml({
|
||||
items: items,
|
||||
shape: "backdrop",
|
||||
preferThumb: true,
|
||||
inheritThumb: false,
|
||||
showUnplayedIndicator: false,
|
||||
showChildCountIndicator: true,
|
||||
overlayText: false,
|
||||
showParentTitle: true,
|
||||
lazy: true,
|
||||
showTitle: true,
|
||||
cardLayout: true
|
||||
});
|
||||
|
||||
} else if (view == 'Thumb') {
|
||||
|
||||
html += LibraryBrowser.getPosterViewHtml({
|
||||
items: items,
|
||||
shape: "backdrop",
|
||||
preferThumb: true,
|
||||
inheritThumb: false,
|
||||
showParentTitle: false,
|
||||
showUnplayedIndicator: false,
|
||||
showChildCountIndicator: true,
|
||||
overlayText: false,
|
||||
centerText: true,
|
||||
lazy: true,
|
||||
showTitle: false
|
||||
});
|
||||
}
|
||||
|
||||
$('#latestEpisodes', page).html(html).lazyChildren();
|
||||
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,5 +1,23 @@
|
|||
(function ($, document) {
|
||||
|
||||
function getView() {
|
||||
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
return 'ThumbCard';
|
||||
}
|
||||
|
||||
return 'Thumb';
|
||||
}
|
||||
|
||||
function getResumeView() {
|
||||
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
return 'PosterCard';
|
||||
}
|
||||
|
||||
return 'Poster';
|
||||
}
|
||||
|
||||
function reload(page) {
|
||||
|
||||
var context = '';
|
||||
|
@ -50,17 +68,37 @@
|
|||
$('.noNextUpItems', page).show();
|
||||
}
|
||||
|
||||
$('#nextUpItems', page).html(LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
overlayText: false,
|
||||
context: context,
|
||||
lazy: true,
|
||||
preferThumb: true
|
||||
var view = getView();
|
||||
var html = '';
|
||||
|
||||
})).lazyChildren();
|
||||
if (view == 'ThumbCard') {
|
||||
|
||||
html += LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
showTitle: true,
|
||||
preferThumb: true,
|
||||
showParentTitle: true,
|
||||
lazy: true,
|
||||
cardLayout: true,
|
||||
context: 'tv'
|
||||
});
|
||||
|
||||
} else if (view == 'Thumb') {
|
||||
|
||||
html += LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
overlayText: false,
|
||||
context: context,
|
||||
lazy: true,
|
||||
preferThumb: true
|
||||
});
|
||||
}
|
||||
|
||||
$('#nextUpItems', page).html(html).lazyChildren();
|
||||
|
||||
});
|
||||
}
|
||||
|
@ -99,16 +137,35 @@
|
|||
$('.nextUpHeader', page).addClass('firstListHeader');
|
||||
}
|
||||
|
||||
$('#resumableItems', page).html(LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
overlayText: screenWidth >= 800 && !AppInfo.hasLowImageBandwidth,
|
||||
lazy: true,
|
||||
context: 'tv'
|
||||
var view = getResumeView();
|
||||
var html = '';
|
||||
|
||||
})).lazyChildren();
|
||||
if (view == 'PosterCard') {
|
||||
|
||||
html += LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
lazy: true,
|
||||
cardLayout: true,
|
||||
context: 'tv'
|
||||
});
|
||||
|
||||
} else if (view == 'Poster') {
|
||||
|
||||
html += LibraryBrowser.getPosterViewHtml({
|
||||
items: result.Items,
|
||||
shape: "backdrop",
|
||||
showTitle: true,
|
||||
showParentTitle: true,
|
||||
overlayText: screenWidth >= 800 && !AppInfo.hasLowImageBandwidth,
|
||||
lazy: true,
|
||||
context: 'tv'
|
||||
});
|
||||
}
|
||||
|
||||
$('#resumableItems', page).html(html).lazyChildren();
|
||||
|
||||
});
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
(function ($, document) {
|
||||
|
||||
var view = LibraryBrowser.getDefaultItemsView('Poster', 'Poster');
|
||||
var view = LibraryBrowser.getDefaultItemsView('Poster', 'PosterCard');
|
||||
|
||||
// The base query options
|
||||
var query = {
|
||||
|
@ -43,6 +43,15 @@
|
|||
|
||||
updateFilterControls(page);
|
||||
|
||||
if (AppInfo.hasLowImageBandwidth) {
|
||||
if (view == 'Thumb') {
|
||||
view = 'ThumbCard';
|
||||
}
|
||||
else if (view == 'Poster') {
|
||||
view = 'PosterCard';
|
||||
}
|
||||
}
|
||||
|
||||
if (view == "Thumb") {
|
||||
|
||||
html = LibraryBrowser.getPosterViewHtml({
|
||||
|
@ -50,7 +59,8 @@
|
|||
shape: "backdrop",
|
||||
preferThumb: true,
|
||||
context: 'tv',
|
||||
lazy: true
|
||||
lazy: true,
|
||||
overlayText: true
|
||||
});
|
||||
|
||||
}
|
||||
|
@ -104,9 +114,9 @@
|
|||
items: result.Items,
|
||||
shape: "portrait",
|
||||
context: 'tv',
|
||||
showTitle: false,
|
||||
centerText: true,
|
||||
lazy: true
|
||||
lazy: true,
|
||||
overlayText: true
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
var page = this;
|
||||
|
||||
var limit = AppInfo.hasLowImageBandwidth ?
|
||||
20 :
|
||||
18 :
|
||||
40;
|
||||
|
||||
var query = {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue