1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

start to rework music tabs

This commit is contained in:
Luke Pulverenti 2015-09-03 12:39:24 -04:00
parent d09b8462c4
commit 387550a5cf
12 changed files with 566 additions and 1555 deletions

View file

@ -26,14 +26,14 @@
"web-component-tester": "*",
"webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
},
"homepage": "https://github.com/PolymerElements/paper-ripple",
"homepage": "https://github.com/polymerelements/paper-ripple",
"_release": "1.0.1",
"_resolution": {
"type": "version",
"tag": "v1.0.1",
"commit": "af19d904802437c305390bb03415c11661de3d0a"
},
"_source": "git://github.com/PolymerElements/paper-ripple.git",
"_source": "git://github.com/polymerelements/paper-ripple.git",
"_target": "^1.0.0",
"_originalSource": "PolymerElements/paper-ripple"
"_originalSource": "polymerelements/paper-ripple"
}

View file

@ -429,6 +429,42 @@ h1 a:hover {
margin: -10px 0 0 -10px;
}
input:not(.paper-input):not(.likePaperText):not([type='checkbox']):not([type='radio']) {
-webkit-appearance: none;
-webkit-font-smoothing: antialiased;
-webkit-rtl-ordering: logical;
-webkit-user-select: text;
box-sizing: border-box;
font-family: inherit;
font-size: inherit;
height: 28.5938px;
letter-spacing: normal;
line-height: 18.2px;
list-style-image: none;
list-style-position: outside;
list-style-type: none;
min-height: 28.6px;
padding-bottom: 5.2px;
padding-left: 5.2px;
padding-right: 5.2px;
padding-top: 5.2px;
text-align: left;
text-indent: 0px;
text-rendering: auto;
text-shadow: none;
text-transform: none;
white-space: nowrap;
word-spacing: 0px;
writing-mode: lr-tb;
-webkit-writing-mode: horizontal-tb;
background: white;
width: 100%;
border: 1px solid #ccc;
color: #000;
margin: 0 0 3px 0;
border-radius: 4px;
}
.smoothScrollX {
overflow-x: scroll;
-webkit-overflow-scrolling: touch;

View file

@ -1,66 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Emby</title>
</head>
<body>
<div id="musicGenresPage" data-role="page" class="page libraryPage" data-require="scripts/musicgenres">
<div class="libraryViewNav scopedLibraryViewNav">
<a href="musicrecommended.html"><iron-icon icon="info"></iron-icon>${TabSuggestions}</a>
<a href="musicalbums.html"><iron-icon icon="album"></iron-icon>${TabAlbums}</a>
<a href="musicalbumartists.html"><iron-icon icon="music-note"></iron-icon>${TabAlbumArtists}</a>
<a href="musicartists.html" class="musicArtistsTab"><iron-icon icon="music-note"></iron-icon>${TabArtists}</a>
<a href="songs.html" class="musicSongsTab"><iron-icon icon="music-note"></iron-icon>${TabSongs}</a>
<a href="#" class="ui-btn-active"><iron-icon icon="library-music"></iron-icon>${TabGenres}</a>
</div>
<div data-role="content">
<div class="viewSettings">
<div class="listTopPaging">
</div>
<div class="selectionCommands" style="display: none;">
<div class="selectionCommandsControlGroup">
<button class="btnAddToPlaylist" data-mini="true" data-icon="plus" data-inline="true" title="${ButtonAddToPlaylist}">${ButtonAddToPlaylist}</button>
<button class="btnSyncItems" data-mini="true" data-icon="refresh" data-inline="true" title="${ButtonSync}">${ButtonSync}</button>
</div>
</div>
</div>
<div id="items" class="itemsContainer paddedItemsContainer"></div>
</div>
<div data-role="panel" class="viewPanel" data-theme="a" data-position="right" data-display="overlay" data-position-fixed="true">
<form>
<div data-role="controlgroup" data-type="horizontal" data-mini="true" class="viewPanelTabs">
<a href="#" data-role="button" class="viewTabButton" data-tab="tabView">${TabView}</a>
<a href="#" data-role="button" class="viewTabButton" data-tab="tabFilter">${TabFilter}</a>
</div>
<div class="tabView viewTab">
<div>
<label for="selectPageSize">${LabelPageSize}</label>
<select id="selectPageSize" class="selectPageSize"></select>
</div>
</div>
<div class="tabFilter viewTab">
<fieldset data-role="controlgroup">
<legend>
${HeaderFilters}
</legend>
<input class="chkStandardFilter" type="checkbox" name="chkIsFavorite" id="chkIsFavorite" data-filter="IsFavorite" data-mini="true">
<label for="chkIsFavorite">${OptionFavorite}</label>
<input class="chkStandardFilter" type="checkbox" name="chkLikes" id="chkLikes" data-filter="Likes" data-mini="true">
<label for="chkLikes">${OptionLikes}</label>
<input class="chkStandardFilter" type="checkbox" name="chkDislikes" id="chkDislikes" data-filter="Dislikes" data-mini="true">
<label for="chkDislikes">${OptionDislikes}</label>
</fieldset>
</div>
</form>
</div>
</div>
</body>
</html>

View file

@ -4,18 +4,33 @@
<title>Emby</title>
</head>
<body>
<div id="musicRecommendedPage" data-role="page" class="page libraryPage backdropPage" data-backdroptype="musicartist" data-require="scripts/musicrecommended">
<div class="libraryViewNav scopedLibraryViewNav">
<a href="#" class="ui-btn-active"><iron-icon icon="info"></iron-icon>${TabSuggestions}</a>
<a href="musicalbums.html"><iron-icon icon="album"></iron-icon>${TabAlbums}</a>
<a href="musicalbumartists.html"><iron-icon icon="music-note"></iron-icon>${TabAlbumArtists}</a>
<a href="musicartists.html" class="musicArtistsTab"><iron-icon icon="music-note"></iron-icon>${TabArtists}</a>
<a href="songs.html" class="musicSongsTab"><iron-icon icon="music-note"></iron-icon>${TabSongs}</a>
<a href="musicgenres.html"><iron-icon icon="library-music"></iron-icon>${TabGenres}</a>
<div id="musicRecommendedPage" data-role="page" class="page libraryPage backdropPage pageWithAbsoluteTabs" data-backdroptype="musicartist" data-require="scripts/musicrecommended">
<div class="libraryViewNav libraryViewNavWithMinHeight">
<paper-tabs hidescrollbuttons noink>
<paper-tab><iron-icon icon="info"></iron-icon>${TabSuggestions}</paper-tab>
<paper-tab><iron-icon icon="local-movies"></iron-icon>${TabMovies}</paper-tab>
<paper-tab class="movieTrailersTab"><iron-icon icon="movie"></iron-icon>${TabTrailers}</paper-tab>
<paper-tab><iron-icon icon="video-library"></iron-icon>${TabCollections}</paper-tab>
<paper-tab><iron-icon icon="video-library"></iron-icon>${TabGenres}</paper-tab>
<paper-tab class="moviePeopleTab"><iron-icon icon="people"></iron-icon>${TabPeople}</paper-tab>
</paper-tabs>
<div class="legacyTabs scopedLibraryViewNav">
<a href="musicrecommended.html"><iron-icon icon="info"></iron-icon>${TabSuggestions}</a>
<a href="musicrecommended.html?tab=1"><iron-icon icon="album"></iron-icon>${TabAlbums}</a>
<a href="musicrecommended.html?tab=2"><iron-icon icon="music-note"></iron-icon>${TabAlbumArtists}</a>
<a href="musicrecommended.html?tab=3"><iron-icon icon="music-note"></iron-icon>${TabArtists}</a>
<a href="musicrecommended.html?tab=4"><iron-icon icon="music-note"></iron-icon>${TabSongs}</a>
<a href="musicrecommended.html?tab=5"><iron-icon icon="library-music"></iron-icon>${TabGenres}</a>
</div>
</div>
<div data-role="content">
<div class="ehsContent squareEhsContent">
<div class="pageBackground"></div>
<div class="ehsContent fullWidth">
<neon-animated-pages>
<neon-animatable>
<div class="pageTabContent" data-index="0">
<div class="homePageSection">
<h1 class="listHeader">${HeaderLatestMusic}</h1>
@ -44,6 +59,101 @@
</div>
</div>
</div>
</neon-animatable>
<neon-animatable>
<div class="pageTabContent" data-index="1">
</div>
</neon-animatable>
<neon-animatable>
<div class="pageTabContent" data-index="2">
</div>
</neon-animatable>
<neon-animatable>
<div class="pageTabContent" data-index="3">
</div>
</neon-animatable>
<neon-animatable>
<div class="pageTabContent" data-index="4">
<div class="viewSettings">
<div class="listTopPaging">
</div>
</div>
<div id="items" class="itemsContainer" style="max-width:1000px;margin: 0 auto;"></div>
</div>
</neon-animatable>
<neon-animatable>
<div class="pageTabContent" data-index="5">
<div class="viewSettings">
<div class="listTopPaging">
</div>
<div class="selectionCommands" style="display: none;">
<div class="selectionCommandsControlGroup">
<button class="btnAddToPlaylist" data-mini="true" data-icon="plus" data-inline="true" title="${ButtonAddToPlaylist}">${ButtonAddToPlaylist}</button>
<button class="btnSyncItems" data-mini="true" data-icon="refresh" data-inline="true" title="${ButtonSync}">${ButtonSync}</button>
</div>
</div>
</div>
<div id="items" class="itemsContainer paddedItemsContainer"></div>
</div>
</neon-animatable>
</neon-animated-pages>
</div>
<div data-role="panel" class="viewPanel songsViewPanel" data-theme="a" data-position="right" data-display="overlay" data-position-fixed="true">
<form>
<fieldset data-role="controlgroup">
<legend>${HeaderFilters}</legend>
<input class="chkStandardFilter" type="checkbox" name="chkPlayed" id="chkPlayed" data-filter="IsPlayed" data-mini="true">
<label for="chkPlayed">${OptionPlayed}</label>
<input class="chkStandardFilter" type="checkbox" name="chkUnplayed" id="chkUnplayed" data-filter="IsUnPlayed" data-mini="true">
<label for="chkUnplayed">${OptionUnplayed}</label>
<input class="chkStandardFilter" type="checkbox" name="chkIsFavorite" id="chkIsFavorite" data-filter="IsFavorite" data-mini="true">
<label for="chkIsFavorite">${OptionFavorite}</label>
<input class="chkStandardFilter" type="checkbox" name="chkLikes" id="chkLikes" data-filter="Likes" data-mini="true">
<label for="chkLikes">${OptionLikes}</label>
<input class="chkStandardFilter" type="checkbox" name="chkDislikes" id="chkDislikes" data-filter="Dislikes" data-mini="true">
<label for="chkDislikes">${OptionDislikes}</label>
</fieldset>
<br />
<div data-role="collapsible" data-collapsed="true" data-mini="true" class="genreFilters">
<h2>${HeaderGenres}</h2>
<div class="filterOptions">
</div>
</div>
<div data-role="collapsible" data-collapsed="true" data-mini="true" class="officialRatingFilters">
<h2>${HeaderParentalRatings}</h2>
<div class="filterOptions">
</div>
</div>
<div data-role="collapsible" data-collapsed="true" data-mini="true" class="tagFilters">
<h2>${HeaderTags}</h2>
<div class="filterOptions">
</div>
</div>
<div data-role="collapsible" data-collapsed="true" data-mini="true" class="yearFilters">
<h2>${HeaderYears}</h2>
<div class="filterOptions">
</div>
</div>
</form>
</div>
<div data-role="content">
</div>
</div>
</body>

View file

@ -50,6 +50,8 @@
// Some 1080- videos are reported as 1912?
if (maxAllowedWidth >= 1900) {
options.push({ name: '1080p - 40Mbps', maxHeight: 1080, bitrate: 40000000 });
options.push({ name: '1080p - 35Mbps', maxHeight: 1080, bitrate: 35000000 });
options.push({ name: '1080p - 30Mbps', maxHeight: 1080, bitrate: 30000000 });
options.push({ name: '1080p - 25Mbps', maxHeight: 1080, bitrate: 25000000 });
options.push({ name: '1080p - 20Mbps', maxHeight: 1080, bitrate: 20000000 });

View file

@ -1,27 +1,46 @@
(function ($, document) {
var view = LibraryBrowser.getDefaultItemsView('Thumb', 'Thumb');
// The base query options
var query = {
var data = {};
function getPageData() {
var key = getSavedQueryKey();
var pageData = data[key];
if (!pageData) {
pageData = data[key] = {
query: {
SortBy: "SortName",
SortOrder: "Ascending",
IncludeItemTypes: "Audio,MusicVideo",
Recursive: true,
Fields: "DateCreated,SyncInfo,ItemCounts",
StartIndex: 0
StartIndex: 0,
Limit: LibraryBrowser.getDefaultPageSize()
},
view: LibraryBrowser.getSavedView(key) || LibraryBrowser.getDefaultItemsView('Thumb', 'Thumb')
};
pageData.query.ParentId = LibraryMenu.getTopParentId();
LibraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
}
function getQuery() {
return getPageData().query;
}
function getSavedQueryKey() {
return 'musicgenres' + (query.ParentId || '');
return getWindowUrl();
}
function reloadItems(page) {
Dashboard.showLoadingMsg();
var query = getQuery();
ApiClient.getMusicGenres(Dashboard.getCurrentUserId(), query).done(function (result) {
// Scroll back up so they can see the results from the beginning
@ -29,16 +48,18 @@
var html = '';
var view = getPageData().view;
$('.listTopPaging', page).html(LibraryBrowser.getQueryPagingHtml({
startIndex: query.StartIndex,
limit: query.Limit,
totalRecordCount: result.TotalRecordCount,
viewButton: true,
showLimit: false,
addSelectionButton: true
})).trigger('create');
updatePageSizeSetting: false,
addLayoutButton: true,
currentLayout: view
updateFilterControls(page);
})).trigger('create');
if (view == "Thumb") {
html = LibraryBrowser.getPosterViewHtml({
@ -80,61 +101,23 @@
reloadItems(page);
});
$('.btnChangeLayout', page).on('layoutchange', function (e, layout) {
getPageData().view = layout;
LibraryBrowser.saveViewSetting(getSavedQueryKey(), layout);
reloadItems(page);
});
LibraryBrowser.saveQueryValues(getSavedQueryKey(), query);
Dashboard.hideLoadingMsg();
});
}
function updateFilterControls(page) {
window.MusicPage.renderGenresTab = function (page, tabContent) {
$('#selectPageSize', page).val(query.Limit).selectmenu('refresh');
if (LibraryBrowser.needsRefresh(tabContent)) {
reloadItems(tabContent);
}
$(document).on('pageinit', "#musicGenresPage", function () {
var page = this;
$('.chkStandardFilter', this).on('change', function () {
var filterName = this.getAttribute('data-filter');
var filters = query.Filters || "";
filters = (',' + filters).replace(',' + filterName, '').substring(1);
if (this.checked) {
filters = filters ? (filters + ',' + filterName) : filterName;
}
query.StartIndex = 0;
query.Filters = filters;
reloadItems(page);
});
$('#selectPageSize', page).on('change', function () {
query.Limit = parseInt(this.value);
query.StartIndex = 0;
reloadItems(page);
});
}).on('pagebeforeshow', "#musicGenresPage", function () {
query.ParentId = LibraryMenu.getTopParentId();
var limit = LibraryBrowser.getDefaultPageSize();
// If the default page size has changed, the start index will have to be reset
if (limit != query.Limit) {
query.Limit = limit;
query.StartIndex = 0;
}
LibraryBrowser.loadSavedQueryValues(getSavedQueryKey(), query);
reloadItems(this);
updateFilterControls(this);
});
};
})(jQuery, document);

View file

@ -186,25 +186,129 @@
});
}
$(document).on('pagebeforeshow', "#musicRecommendedPage", function () {
function loadSuggestionsTab(page, tabContent) {
var parentId = LibraryMenu.getTopParentId();
var page = this;
var containers = page.querySelectorAll('.itemsContainer');
var containers = tabContent.querySelectorAll('.itemsContainer');
if (enableScrollX()) {
$(containers).addClass('hiddenScrollX');
} else {
$(containers).removeClass('hiddenScrollX');
}
if (LibraryBrowser.needsRefresh(page)) {
loadLatest(page, parentId);
loadPlaylists(page, parentId);
loadRecentlyPlayed(page, parentId);
loadFrequentlyPlayed(page, parentId);
if (LibraryBrowser.needsRefresh(tabContent)) {
console.log('loadSuggestionsTab');
loadLatest(tabContent, parentId);
loadPlaylists(tabContent, parentId);
loadRecentlyPlayed(tabContent, parentId);
loadFrequentlyPlayed(tabContent, parentId);
}
}
function loadTab(page, index) {
var tabContent = page.querySelector('.pageTabContent[data-index=\'' + index + '\']');
var depends = [];
var scope = 'MusicPage';
var renderMethod = '';
var initMethod = '';
switch (index) {
case 0:
renderMethod = 'renderSuggestedTab';
break;
case 1:
depends.push('scripts/movies');
depends.push('scripts/queryfilters');
renderMethod = 'renderMoviesTab';
initMethod = 'initMoviesTab';
break;
case 2:
depends.push('scripts/movietrailers');
renderMethod = 'renderTrailerTab';
initMethod = 'initTrailerTab';
break;
case 3:
depends.push('scripts/moviecollections');
renderMethod = 'renderCollectionsTab';
initMethod = 'initCollectionsTab';
break;
case 4:
depends.push('scripts/songs');
renderMethod = 'renderSongsTab';
initMethod = 'initSongsTab';
depends.push('scripts/queryfilters');
break;
case 5:
depends.push('scripts/musicgenres');
renderMethod = 'renderGenresTab';
break;
default:
break;
}
require(depends, function () {
if (initMethod && !tabContent.initComplete) {
window[scope][initMethod](page, tabContent);
tabContent.initComplete = true;
}
window[scope][renderMethod](page, tabContent);
});
}
window.MusicPage = window.MusicPage || {};
window.MusicPage.renderSuggestedTab = loadSuggestionsTab;
$(document).on('pageinit', "#musicRecommendedPage", function () {
var page = this;
$('.recommendations', page).createCardMenus();
var tabs = page.querySelector('paper-tabs');
var pages = page.querySelector('neon-animated-pages');
var baseUrl = 'musicrecommended.html';
var topParentId = LibraryMenu.getTopParentId();
if (topParentId) {
baseUrl += '?topParentId=' + topParentId;
}
LibraryBrowser.configurePaperLibraryTabs(page, tabs, pages, baseUrl);
$(pages).on('tabchange', function () {
loadTab(page, parseInt(this.selected));
});
}).on('pageshowready', "#musicRecommendedPage", function () {
var page = this;
if (!page.getAttribute('data-title')) {
var parentId = LibraryMenu.getTopParentId();
if (parentId) {
ApiClient.getItem(Dashboard.getCurrentUserId(), parentId).done(function (item) {
page.setAttribute('data-title', item.Name);
LibraryMenu.setTitle(item.Name);
});
} else {
page.setAttribute('data-title', Globalize.translate('TabMusic'));
LibraryMenu.setTitle(Globalize.translate('TabMusic'));
}
}
});

View file

@ -2,46 +2,47 @@
var defaultSortBy = "Album,SortName";
// The base query options
var query = {
var data = {};
function getPageData() {
var key = getSavedQueryKey();
var pageData = data[key];
if (!pageData) {
pageData = data[key] = {
query: {
SortBy: defaultSortBy,
SortOrder: "Ascending",
IncludeItemTypes: "Audio",
Recursive: true,
Fields: "AudioInfo,ParentId,SyncInfo",
Limit: 200,
Limit: 100,
StartIndex: 0,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb"
}
};
pageData.query.ParentId = LibraryMenu.getTopParentId();
LibraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData;
}
function getQuery() {
return getPageData().query;
}
function getSavedQueryKey() {
return 'songs' + (query.ParentId || '');
return getWindowUrl();
}
function updateFilterControls(page) {
// Reset form values using the last used query
$('.radioSortBy', page).each(function () {
this.checked = (query.SortBy || '').toLowerCase() == this.getAttribute('data-sortby').toLowerCase();
}).checkboxradio('refresh');
$('.radioSortOrder', this).each(function () {
this.checked = (query.SortOrder || '').toLowerCase() == this.getAttribute('data-sortorder').toLowerCase();
}).checkboxradio('refresh');
$('#selectPageSize', page).val(query.Limit).selectmenu('refresh');
}
function reloadItems(page) {
function reloadItems(page, viewPanel) {
Dashboard.showLoadingMsg();
var query = getQuery();
ApiClient.getItems(Dashboard.getCurrentUserId(), query).done(function (result) {
// Scroll back up so they can see the results from the beginning
@ -54,13 +55,13 @@
totalRecordCount: result.TotalRecordCount,
viewButton: true,
showLimit: false,
sortButton: true,
viewPanelClass: 'songsViewPanel',
updatePageSizeSetting: false
});
page.querySelector('.listTopPaging').innerHTML = pagingHtml;
updateFilterControls(page);
html += LibraryBrowser.getListViewHtml({
items: result.Items,
showIndex: true,
@ -76,40 +77,74 @@
$('.btnNextPage', page).on('click', function () {
query.StartIndex += query.Limit;
reloadItems(page);
reloadItems(page, viewPanel);
});
$('.btnPreviousPage', page).on('click', function () {
query.StartIndex -= query.Limit;
reloadItems(page);
reloadItems(page, viewPanel);
});
$('.lnkColumnSort', page).on('click', function () {
var order = this.getAttribute('data-sortfield');
if (query.SortBy == order) {
if (query.SortOrder == "Descending") {
query.SortOrder = "Ascending";
query.SortBy = defaultSortBy;
} else {
query.SortOrder = "Descending";
query.SortBy = order;
}
} else {
query.SortOrder = "Ascending";
query.SortBy = order;
}
query.StartIndex = 0;
reloadItems(page);
// On callback make sure to set StartIndex = 0
$('.btnSort', page).on('click', function () {
LibraryBrowser.showSortMenu({
items: [{
name: Globalize.translate('OptionNameSort'),
id: 'SortName'
},
{
name: Globalize.translate('OptionBudget'),
id: 'Budget,SortName'
},
{
name: Globalize.translate('OptionImdbRating'),
id: 'CommunityRating,SortName'
},
{
name: Globalize.translate('OptionCriticRating'),
id: 'CriticRating,SortName'
},
{
name: Globalize.translate('OptionDateAdded'),
id: 'DateCreated,SortName'
},
{
name: Globalize.translate('OptionDatePlayed'),
id: 'DatePlayed,SortName'
},
{
name: Globalize.translate('OptionMetascore'),
id: 'Metascore,SortName'
},
{
name: Globalize.translate('OptionParentalRating'),
id: 'OfficialRating,SortName'
},
{
name: Globalize.translate('OptionPlayCount'),
id: 'PlayCount,SortName'
},
{
name: Globalize.translate('OptionReleaseDate'),
id: 'PremiereDate,SortName'
},
{
name: Globalize.translate('OptionRevenue'),
id: 'Revenue,SortName'
},
{
name: Globalize.translate('OptionRuntime'),
id: 'Runtime,SortName'
},
{
name: Globalize.translate('OptionVideoBitrate'),
id: 'VideoBitRate,SortName'
}],
callback: function () {
reloadItems(page, viewPanel);
},
query: query
});
});
LibraryBrowser.saveQueryValues(getSavedQueryKey(), query);
@ -119,42 +154,30 @@
}
var filtersLoaded;
function reloadFiltersIfNeeded(page) {
function reloadFiltersIfNeeded(page, viewPanel) {
if (!filtersLoaded) {
filtersLoaded = true;
QueryFilters.loadFilters(page, Dashboard.getCurrentUserId(), query, function () {
var query = getQuery();
QueryFilters.loadFilters(viewPanel, Dashboard.getCurrentUserId(), query, function () {
reloadItems(page);
reloadItems(page, viewPanel);
});
}
}
$(document).on('pageinit', "#songsPage", function () {
function initPage(tabContent, viewPanel) {
var page = this;
$(viewPanel).on('panelopen', function () {
$('.viewPanel', page).on('panelopen', function () {
reloadFiltersIfNeeded(page);
reloadFiltersIfNeeded(tabContent, viewPanel);
});
$('.radioSortBy', this).on('click', function () {
query.SortBy = this.getAttribute('data-sortby');
query.StartIndex = 0;
reloadItems(page);
});
$('.radioSortOrder', this).on('click', function () {
query.SortOrder = this.getAttribute('data-sortorder');
query.StartIndex = 0;
reloadItems(page);
});
$('.chkStandardFilter', this).on('change', function () {
$('.chkStandardFilter', viewPanel).on('change', function () {
var query = getQuery();
var filterName = this.getAttribute('data-filter');
var filters = query.Filters || "";
@ -167,28 +190,22 @@
query.StartIndex = 0;
query.Filters = filters;
reloadItems(page);
reloadItems(tabContent, viewPanel);
});
}
$('#selectPageSize', page).on('change', function () {
query.Limit = parseInt(this.value);
query.StartIndex = 0;
reloadItems(page);
});
window.MusicPage.initSongsTab = function (page, tabContent) {
}).on('pagebeforeshow', "#songsPage", function () {
var viewPanel = page.querySelector('.songsViewPanel');
initPage(tabContent, viewPanel);
};
var page = this;
window.MusicPage.renderSongsTab = function (page, tabContent) {
query.ParentId = LibraryMenu.getTopParentId();
LibraryBrowser.loadSavedQueryValues(getSavedQueryKey(), query);
QueryFilters.onPageShow(page, query);
reloadItems(page);
updateFilterControls(this);
});
if (LibraryBrowser.needsRefresh(tabContent)) {
var viewPanel = page.querySelector('.songsViewPanel');
reloadItems(tabContent, viewPanel);
}
};
})(jQuery, document);

View file

@ -1,141 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>Emby</title>
</head>
<body>
<div id="songsPage" data-role="page" class="page libraryPage backdropPage" data-backdroptype="musicartist" data-require="scripts/songs,scripts/queryfilters">
<div class="libraryViewNav scopedLibraryViewNav">
<a href="musicrecommended.html"><iron-icon icon="info"></iron-icon>${TabSuggestions}</a>
<a href="musicalbums.html"><iron-icon icon="album"></iron-icon>${TabAlbums}</a>
<a href="musicalbumartists.html"><iron-icon icon="music-note"></iron-icon>${TabAlbumArtists}</a>
<a href="musicartists.html" class="musicArtistsTab"><iron-icon icon="music-note"></iron-icon>${TabArtists}</a>
<a href="#" class="ui-btn-active"><iron-icon icon="music-note"></iron-icon>${TabSongs}</a>
<a href="musicgenres.html"><iron-icon icon="library-music"></iron-icon>${TabGenres}</a>
</div>
<div data-role="content">
<div class="viewSettings">
<div class="listTopPaging">
</div>
</div>
<div id="items" class="itemsContainer" style="max-width:1000px;margin: 0 auto;"></div>
</div>
<div data-role="panel" class="viewPanel" data-theme="a" data-position="right" data-display="overlay" data-position-fixed="true">
<form>
<div data-role="controlgroup" data-type="horizontal" data-mini="true" class="viewPanelTabs">
<a href="#" data-role="button" class="viewTabButton" data-tab="tabView">${TabView}</a>
<a href="#" data-role="button" class="viewTabButton" data-tab="tabSort">${TabSort}</a>
<a href="#" data-role="button" class="viewTabButton" data-tab="tabFilter">${TabFilter}</a>
</div>
<div class="tabView viewTab">
<div>
<label for="selectPageSize">${LabelPageSize}</label>
<select id="selectPageSize" class="selectPageSize"></select>
</div>
</div>
<div class="tabFilter viewTab">
<fieldset data-role="controlgroup">
<legend>${HeaderFilters}</legend>
<input class="chkStandardFilter" type="checkbox" name="chkPlayed" id="chkPlayed" data-filter="IsPlayed" data-mini="true">
<label for="chkPlayed">${OptionPlayed}</label>
<input class="chkStandardFilter" type="checkbox" name="chkUnplayed" id="chkUnplayed" data-filter="IsUnPlayed" data-mini="true">
<label for="chkUnplayed">${OptionUnplayed}</label>
<input class="chkStandardFilter" type="checkbox" name="chkIsFavorite" id="chkIsFavorite" data-filter="IsFavorite" data-mini="true">
<label for="chkIsFavorite">${OptionFavorite}</label>
<input class="chkStandardFilter" type="checkbox" name="chkLikes" id="chkLikes" data-filter="Likes" data-mini="true">
<label for="chkLikes">${OptionLikes}</label>
<input class="chkStandardFilter" type="checkbox" name="chkDislikes" id="chkDislikes" data-filter="Dislikes" data-mini="true">
<label for="chkDislikes">${OptionDislikes}</label>
</fieldset>
<br />
<div data-role="collapsible" data-collapsed="true" data-mini="true" class="genreFilters">
<h2>${HeaderGenres}</h2>
<div class="filterOptions">
</div>
</div>
<div data-role="collapsible" data-collapsed="true" data-mini="true" class="officialRatingFilters">
<h2>${HeaderParentalRatings}</h2>
<div class="filterOptions">
</div>
</div>
<div data-role="collapsible" data-collapsed="true" data-mini="true" class="tagFilters">
<h2>${HeaderTags}</h2>
<div class="filterOptions">
</div>
</div>
<div data-role="collapsible" data-collapsed="true" data-mini="true" class="yearFilters">
<h2>${HeaderYears}</h2>
<div class="filterOptions">
</div>
</div>
</div>
<div class="tabSort viewTab">
<fieldset data-role="controlgroup">
<legend>
${HeaderSortBy}
</legend>
<input class="radioSortBy" type="radio" name="radioSortBy" id="radioName" value="on" checked="checked" data-sortby="Name" data-mini="true">
<label for="radioName">${OptionTrackName}</label>
<input class="radioSortBy defaultSort" type="radio" name="radioSortBy" id="radioAlbum" value="on" checked="checked" data-sortby="Album,SortName" data-mini="true">
<label for="radioAlbum">${OptionAlbum}</label>
<input class="radioSortBy" type="radio" name="radioSortBy" id="radioAlbumArtist" value="on" data-sortby="AlbumArtist,Album,SortName" data-mini="true">
<label for="radioAlbumArtist">${OptionAlbumArtist}</label>
<input class="radioSortBy" type="radio" name="radioSortBy" id="radioArtist" value="on" data-sortby="Artist,Album,SortName" data-mini="true">
<label for="radioArtist">${OptionArtist}</label>
<input class="radioSortBy" type="radio" name="radioSortBy" id="radioDateCreated" value="off" data-sortby="DateCreated,AlbumArtist,Album,SortName" data-mini="true">
<label for="radioDateCreated">${OptionDateAdded}</label>
<input class="radioSortBy" type="radio" name="radioSortBy" id="radioDatePlayed" value="off" data-sortby="DatePlayed,AlbumArtist,Album,SortName" data-mini="true">
<label for="radioDatePlayed">${OptionDatePlayed}</label>
<input class="radioSortBy" type="radio" name="radioSortBy" id="radioPlayCount" value="off" data-sortby="PlayCount,AlbumArtist,Album,SortName" data-mini="true">
<label for="radioPlayCount">${OptionPlayCount}</label>
<input class="radioSortBy" type="radio" name="radioSortBy" id="radioPremiereDate" value="off" data-sortby="PremiereDate,AlbumArtist,Album,SortName" data-mini="true">
<label for="radioPremiereDate">${OptionReleaseDate}</label>
<input class="radioSortBy" type="radio" name="radioSortBy" id="radioRuntime" value="off" data-sortby="Runtime,AlbumArtist,Album,SortName" data-mini="true">
<label for="radioRuntime">${OptionRuntime}</label>
</fieldset>
<fieldset data-role="controlgroup">
<legend>
${HeaderSortOrder}
</legend>
<input class="radioSortOrder" type="radio" name="radioSortOrder" id="radioAscending" value="on" checked="checked" data-sortorder="Ascending" data-mini="true">
<label for="radioAscending">${OptionAscending}</label>
<input class="radioSortOrder" type="radio" name="radioSortOrder" id="radioDescending" value="off" data-sortorder="Descending" data-mini="true">
<label for="radioDescending">${OptionDescending}</label>
</fieldset>
</div>
</form>
</div>
</div>
</body>
</html>

View file

@ -67,7 +67,7 @@
currentOptions.history = currentOptions.history && $.mobile.ajaxEnabled && $.mobile.hashListeningEnabled;
this._on(this.document, {
"vmousedown": "_handleDocumentVmousedown"
"mousedown": "_handleDocumentVmousedown"
});
// Define instance variables
@ -104,7 +104,7 @@
._ui.focusElement = this._ui.container;
// Event handlers
this._on(this._ui.screen, { "vclick": "_eatEventAndClose" });
this._on(this._ui.screen, { "click": "_eatEventAndClose" });
this._on(this.window, {
orientationchange: $.proxy(this, "_handleWindowOrientationchange"),
resize: $.proxy(this, "_handleWindowResize"),

View file

@ -135,7 +135,7 @@
});
slider.bind("vmousedown", $.proxy(this._sliderVMouseDown, this))
.bind("vclick", false);
.bind("click", false);
// We have to instantiate a new function object for the unbind to work properly
// since the method itself is defined in the prototype (causing it to unbind everything)
@ -158,7 +158,7 @@
"keyup": "_handleKeyup"
});
this.handle.bind("vclick", false);
this.handle.bind("click", false);
this._handleFormReset();

File diff suppressed because it is too large Load diff