diff --git a/dashboard-ui/components/filterdialog/filterdialog.js b/dashboard-ui/components/filterdialog/filterdialog.js
index a06a783d19..5c8625600c 100644
--- a/dashboard-ui/components/filterdialog/filterdialog.js
+++ b/dashboard-ui/components/filterdialog/filterdialog.js
@@ -1,4 +1,77 @@
-define(['paperdialoghelper', 'events', 'paper-checkbox'], function (paperDialogHelper, events) {
+define(['paperdialoghelper', 'events', 'paper-checkbox', 'jqmcollapsible', 'css!components/filterdialog/style', 'paper-radio-button', 'paper-radio-group'], function (paperDialogHelper, events) {
+
+ function renderOptions(context, selector, cssClass, items) {
+
+ var elem = context.querySelector(selector);
+
+ if (items.length) {
+
+ elem.classList.remove('hide');
+
+ } else {
+ elem.classList.add('hide');
+ }
+
+ var html = '';
+
+ // style="margin: -.2em -.8em;"
+ html += '
';
+
+ var index = 0;
+ var idPrefix = 'chk' + selector.substring(1);
+
+ html += items.map(function (filter) {
+
+ var itemHtml = '';
+
+ var id = idPrefix + index;
+ //itemHtml += '
';
+ //itemHtml += '';
+ //itemHtml += '';
+ //itemHtml += '
';
+
+ itemHtml += '
' + filter + '';
+
+ index++;
+
+ return itemHtml;
+
+ }).join('');
+
+ html += '
';
+
+ elem.querySelector('.filterOptions').innerHTML = html;
+ }
+
+ function renderFilters(context, result) {
+
+ // If there's a huge number of these they will be really show to render
+ if (result.Tags) {
+ result.Tags.length = Math.min(result.Tags.length, 50);
+ }
+
+ renderOptions(context, '.genreFilters', 'chkGenreFilter', result.Genres);
+ renderOptions(context, '.officialRatingFilters', 'chkOfficialRatingFilter', result.OfficialRatings);
+ renderOptions(context, '.tagFilters', 'chkTagFilter', result.Tags);
+ renderOptions(context, '.yearFilters', 'chkYearFilter', result.Years);
+
+ }
+
+ function loadDynamicFilters(context, userId, itemQuery) {
+
+ return ApiClient.getJSON(ApiClient.getUrl('Items/Filters', {
+
+ UserId: userId,
+ ParentId: itemQuery.ParentId,
+ IncludeItemTypes: itemQuery.IncludeItemTypes
+
+
+ })).then(function (result) {
+
+ renderFilters(context, result);
+ });
+
+ }
function updateFilterControls(context, options) {
@@ -20,6 +93,20 @@
});
}
+
+ $('.chkVideoTypeFilter', context).each(function () {
+
+ var filters = "," + (query.VideoTypes || "");
+ var filterName = this.getAttribute('data-filter');
+
+ this.checked = filters.indexOf(',' + filterName) != -1;
+ });
+
+ $('.chk3DFilter', context).checked(query.Is3D == true);
+ $('.chkHDFilter', context).checked(query.IsHD == true);
+ $('.chkSDFilter', context).checked(query.IsHD == false);
+
+ context.querySelector('.playersRadioGroup').selected = query.MinPlayers == null ? 'all' : query.MinPlayers;
}
function triggerChange(instance) {
@@ -27,6 +114,19 @@
events.trigger(instance, 'filterchange');
}
+ function parentWithClass(elem, className) {
+
+ while (!elem.classList || !elem.classList.contains(className)) {
+ elem = elem.parentNode;
+
+ if (!elem) {
+ return null;
+ }
+ }
+
+ return elem;
+ }
+
function bindEvents(instance, context, options) {
var query = options.query;
@@ -71,6 +171,133 @@
triggerChange(instance);
});
}
+
+ $('.chkVideoTypeFilter', context).on('change', function () {
+
+ var filterName = this.getAttribute('data-filter');
+ var filters = query.VideoTypes || "";
+
+ filters = (',' + filters).replace(',' + filterName, '').substring(1);
+
+ if (this.checked) {
+ filters = filters ? (filters + ',' + filterName) : filterName;
+ }
+
+ query.StartIndex = 0;
+ query.VideoTypes = filters;
+
+ triggerChange(instance);
+ });
+
+ $('.chk3DFilter', context).on('change', function () {
+
+ query.StartIndex = 0;
+ query.Is3D = this.checked ? true : null;
+
+ triggerChange(instance);
+ });
+
+ $('.chkHDFilter', context).on('change', function () {
+
+ query.StartIndex = 0;
+ query.IsHD = this.checked ? true : null;
+ triggerChange(instance);
+ });
+
+ $('.chkSDFilter', context).on('change', function () {
+
+ query.StartIndex = 0;
+ query.IsHD = this.checked ? false : null;
+
+ triggerChange(instance);
+ });
+
+ context.querySelector('.playersRadioGroup').addEventListener('iron-select', function(e) {
+
+ query.StartIndex = 0;
+ var val = e.target.selected;
+ query.MinPlayers = val == "all" ? null : val;
+ triggerChange(instance);
+ });
+
+ context.addEventListener('change', function(e) {
+
+ var chkGenreFilter = parentWithClass(e.target, 'chkGenreFilter');
+ if (chkGenreFilter) {
+ var filterName = chkGenreFilter.getAttribute('data-filter');
+ var filters = query.Genres || "";
+ var delimiter = '|';
+
+ filters = (delimiter + filters).replace(delimiter + filterName, '').substring(1);
+
+ if (chkGenreFilter.checked) {
+ filters = filters ? (filters + delimiter + filterName) : filterName;
+ }
+
+ query.StartIndex = 0;
+ query.Genres = filters;
+
+ triggerChange(instance);
+ return;
+ }
+
+ var chkTagFilter = parentWithClass(e.target, 'chkTagFilter');
+ if (chkTagFilter) {
+ var filterName = chkTagFilter.getAttribute('data-filter');
+ var filters = query.Tags || "";
+ var delimiter = '|';
+
+ filters = (delimiter + filters).replace(delimiter + filterName, '').substring(1);
+
+ if (chkTagFilter.checked) {
+ filters = filters ? (filters + delimiter + filterName) : filterName;
+ }
+
+ query.StartIndex = 0;
+ query.Tags = filters;
+
+ triggerChange(instance);
+ return;
+ }
+
+ var chkYearFilter = parentWithClass(e.target, 'chkYearFilter');
+ if (chkYearFilter) {
+ var filterName = chkYearFilter.getAttribute('data-filter');
+ var filters = query.Years || "";
+ var delimiter = ',';
+
+ filters = (delimiter + filters).replace(delimiter + filterName, '').substring(1);
+
+ if (chkYearFilter.checked) {
+ filters = filters ? (filters + delimiter + filterName) : filterName;
+ }
+
+ query.StartIndex = 0;
+ query.Years = filters;
+
+ triggerChange(instance);
+ return;
+ }
+
+ var chkOfficialRatingFilter = parentWithClass(e.target, 'chkOfficialRatingFilter');
+ if (chkOfficialRatingFilter) {
+ var filterName = chkOfficialRatingFilter.getAttribute('data-filter');
+ var filters = query.OfficialRatings || "";
+ var delimiter = '|';
+
+ filters = (delimiter + filters).replace(delimiter + filterName, '').substring(1);
+
+ if (chkOfficialRatingFilter.checked) {
+ filters = filters ? (filters + delimiter + filterName) : filterName;
+ }
+
+ query.StartIndex = 0;
+ query.OfficialRatings = filters;
+
+ triggerChange(instance);
+ return;
+ }
+ });
}
function setVisibility(context, options) {
@@ -79,6 +306,20 @@
hideByClass(context, 'nolivetvchannels');
}
+ if (enableDynamicFilters(options.mode)) {
+ context.querySelector('.genreFilters').classList.remove('hide');
+ context.querySelector('.officialRatingFilters').classList.remove('hide');
+ context.querySelector('.tagFilters').classList.remove('hide');
+ context.querySelector('.yearFilters').classList.remove('hide');
+ }
+
+ if (options.mode == 'movies') {
+ context.querySelector('.videoTypeFilters').classList.remove('hide');
+ }
+
+ if (options.mode == 'games') {
+ context.querySelector('.players').classList.remove('hide');
+ }
}
function hideByClass(context, className) {
@@ -90,6 +331,10 @@
}
}
+ function enableDynamicFilters(mode) {
+ return mode == 'movies' || mode == 'games';
+ }
+
return function (options) {
var self = this;
@@ -115,21 +360,31 @@
dlg.classList.add('background-theme-a');
dlg.classList.add('formDialog');
+ dlg.classList.add('filterDialog');
var html = '';
html += Globalize.translateDocument(template);
dlg.innerHTML = html;
+
setVisibility(dlg, options);
document.body.appendChild(dlg);
+ // needed for jqm collapsibles
+ $(dlg.querySelector('.filterDialogContent')).trigger('create');
+
paperDialogHelper.open(dlg);
dlg.addEventListener('iron-overlay-closed', resolve);
updateFilterControls(dlg, options);
bindEvents(self, dlg, options);
+
+ if (enableDynamicFilters(options.mode)) {
+ dlg.classList.add('dynamicFilterDialog');
+ loadDynamicFilters(dlg, Dashboard.getCurrentUserId(), options.query);
+ }
}
xhr.send();
diff --git a/dashboard-ui/components/filterdialog/filterdialog.template.html b/dashboard-ui/components/filterdialog/filterdialog.template.html
index 0bde71bf8a..640add0923 100644
--- a/dashboard-ui/components/filterdialog/filterdialog.template.html
+++ b/dashboard-ui/components/filterdialog/filterdialog.template.html
@@ -1,5 +1,5 @@
-
-
+
+
${HeaderFilters}
@@ -10,4 +10,65 @@
${OptionLikes}
${OptionDislikes}
+
+
+
+ ${HeaderNumberOfPlayers}
+
+
+ ${OptionAnyNumberOfPlayers}
+ ${Option2Player}
+ ${Option3Player}
+ ${Option4Player}
+
+
+
+
+
${HeaderGenres}
+
+
+
+
+
+
+
${HeaderParentalRatings}
+
+
+
+
+
+
+
+
+
+
+
${HeaderVideoTypes}
+
+
+
${OptionBluray}
+
${OptionDvd}
+
${OptionIso}
+
+
${OptionIsHD}
+
${OptionIsSD}
+
${Option3D}
+
+
+
+
\ No newline at end of file
diff --git a/dashboard-ui/components/filterdialog/style.css b/dashboard-ui/components/filterdialog/style.css
new file mode 100644
index 0000000000..14bb934b02
--- /dev/null
+++ b/dashboard-ui/components/filterdialog/style.css
@@ -0,0 +1,30 @@
+.dynamicFilterDialog {
+ position: fixed !important;
+ top: 5% !important;
+ bottom: 5% !important;
+ margin: 0 !important;
+ border-radius: 0 !important;
+ max-height: none !important;
+ max-width: none !important;
+ min-width: 200px;
+}
+
+@media all and (min-height: 300px) {
+
+ .dynamicFilterDialog {
+ top: 10% !important;
+ bottom: 10% !important;
+ }
+}
+
+@media all and (min-width: 300px) {
+
+ .dynamicFilterDialog {
+ min-width: 240px;
+ }
+}
+
+.filterDialog paper-radio-button {
+ display: block;
+ padding-left: 0;
+}
diff --git a/dashboard-ui/games.html b/dashboard-ui/games.html
index a5db396efc..395d3b1afc 100644
--- a/dashboard-ui/games.html
+++ b/dashboard-ui/games.html
@@ -4,7 +4,7 @@
Emby
-