diff --git a/src/components/images/imageFetcher.js b/src/components/images/imageFetcher.js
deleted file mode 100644
index c6882ddb7c..0000000000
--- a/src/components/images/imageFetcher.js
+++ /dev/null
@@ -1,38 +0,0 @@
-define(['dom'], function (dom) {
- 'use strict';
-
- function loadImage(elem, url) {
-
- if (!elem) {
- return Promise.reject('elem cannot be null');
- }
-
- if (elem.tagName !== 'IMG') {
-
- elem.style.backgroundImage = "url('" + url + "')";
- return Promise.resolve();
-
- //return loadImageIntoImg(document.createElement('img'), url).then(function () {
- // elem.style.backgroundImage = "url('" + url + "')";
- // return Promise.resolve();
- //});
-
- }
- return loadImageIntoImg(elem, url);
- }
-
- function loadImageIntoImg(elem, url) {
- return new Promise(function (resolve, reject) {
-
- dom.addEventListener(elem, 'load', resolve, {
- once: true
- });
- elem.setAttribute('src', url);
- });
- }
-
- return {
- loadImage: loadImage
- };
-
-});
diff --git a/src/components/indicators/indicators.js b/src/components/indicators/indicators.js
index b4391fd4a6..604f480f1d 100644
--- a/src/components/indicators/indicators.js
+++ b/src/components/indicators/indicators.js
@@ -1,198 +1,183 @@
-define(['datetime', 'itemHelper', 'emby-progressbar', 'css!./indicators.css', 'material-icons'], function (datetime, itemHelper) {
- 'use strict';
+import datetime from 'datetime';
+import itemHelper from 'itemHelper';
+import 'emby-progressbar';
+import 'css!./indicators.css';
+import 'material-icons';
- function enableProgressIndicator(item) {
- if (item.MediaType === 'Video') {
- if (item.Type !== 'TvChannel') {
- return true;
- }
- }
-
- if (item.Type === 'AudioBook' || item.Type === 'AudioPodcast') {
- return true;
- }
-
- return false;
+export function enableProgressIndicator(item) {
+ if (item.MediaType === 'Video' && item.Type !== 'TvChannel') {
+ return true;
}
- function getProgressHtml(pct, options) {
- var containerClass = 'itemProgressBar';
- if (options) {
- if (options.containerClass) {
- containerClass += ' ' + options.containerClass;
- }
- }
-
- return '
';
+ if (item.Type === 'AudioBook' || item.Type === 'AudioPodcast') {
+ return true;
}
- function getAutoTimeProgressHtml(pct, options, isRecording, start, end) {
- var containerClass = 'itemProgressBar';
- if (options) {
- if (options.containerClass) {
- containerClass += ' ' + options.containerClass;
- }
- }
+ return false;
+}
- var foregroundClass = 'itemProgressBarForeground';
- if (isRecording) {
- foregroundClass += ' itemProgressBarForeground-recording';
- }
-
- return '
';
+export function getProgressHtml(pct, options) {
+ let containerClass = 'itemProgressBar';
+ if (options && options.containerClass) {
+ containerClass += ' ' + options.containerClass;
}
- function getProgressBarHtml(item, options) {
- var pct;
- if (enableProgressIndicator(item) && item.Type !== 'Recording') {
- var userData = options ? (options.userData || item.UserData) : item.UserData;
- if (userData) {
- pct = userData.PlayedPercentage;
- if (pct && pct < 100) {
- return getProgressHtml(pct, options);
- }
+ return '
';
+}
+
+function getAutoTimeProgressHtml(pct, options, isRecording, start, end) {
+ let containerClass = 'itemProgressBar';
+ if (options && options.containerClass) {
+ containerClass += ' ' + options.containerClass;
+ }
+
+ let foregroundClass = 'itemProgressBarForeground';
+ if (isRecording) {
+ foregroundClass += ' itemProgressBarForeground-recording';
+ }
+
+ return '
';
+}
+
+export function getProgressBarHtml(item, options) {
+ let pct;
+ if (enableProgressIndicator(item) && item.Type !== 'Recording') {
+ const userData = options && options.userData ? options.userData : item.UserData;
+
+ if (userData) {
+ pct = userData.PlayedPercentage;
+ if (pct && pct < 100) {
+ return getProgressHtml(pct, options);
}
}
+ }
- if ((item.Type === 'Program' || item.Type === 'Timer' || item.Type === 'Recording') && item.StartDate && item.EndDate) {
- var startDate = 0;
- var endDate = 1;
+ if ((item.Type === 'Program' || item.Type === 'Timer' || item.Type === 'Recording') && item.StartDate && item.EndDate) {
+ let startDate = 0;
+ let endDate = 1;
+ try {
+ startDate = datetime.parseISO8601Date(item.StartDate).getTime();
+ endDate = datetime.parseISO8601Date(item.EndDate).getTime();
+ } catch (err) {
+ console.error(err);
+ }
+
+ const now = new Date().getTime();
+ const total = endDate - startDate;
+ pct = 100 * ((now - startDate) / total);
+
+ if (pct > 0 && pct < 100) {
+ const isRecording = item.Type === 'Timer' || item.Type === 'Recording' || item.TimerId;
+ return getAutoTimeProgressHtml(pct, options, isRecording, startDate, endDate);
+ }
+ }
+
+ return '';
+}
+
+export function enablePlayedIndicator(item) {
+ return itemHelper.canMarkPlayed(item);
+}
+
+export function getPlayedIndicatorHtml(item) {
+ if (enablePlayedIndicator(item)) {
+ let userData = item.UserData || {};
+ if (userData.UnplayedItemCount) {
+ return '
' + userData.UnplayedItemCount + '
';
+ }
+
+ if (userData.PlayedPercentage && userData.PlayedPercentage >= 100 || (userData.Played)) {
+ return '
';
+ }
+ }
+
+ return '';
+}
+
+export function getChildCountIndicatorHtml(item, options) {
+ const minCount = options && options.minCount ? options.minCount : 0;
+
+ if (item.ChildCount && item.ChildCount > minCount) {
+ return '
' + item.ChildCount + '
';
+ }
+
+ return '';
+}
+
+export function getTimerIndicator(item) {
+ let status;
+
+ if (item.Type === 'SeriesTimer') {
+ return '
';
+ } else if (item.TimerId || item.SeriesTimerId) {
+ status = item.Status || 'Cancelled';
+ } else if (item.Type === 'Timer') {
+ status = item.Status;
+ } else {
+ return '';
+ }
+
+ if (item.SeriesTimerId) {
+ if (status !== 'Cancelled') {
+ return '
';
+ }
+
+ return '
';
+ }
+
+ return '
';
+}
+
+export function getSyncIndicator(item) {
+ if (item.SyncPercent === 100) {
+ return '
';
+ } else if (item.SyncPercent != null) {
+ return '
';
+ }
+
+ return '';
+}
+
+export function getTypeIndicator(item) {
+ const iconT = {
+ 'Video' : 'videocam',
+ 'Folder' : 'folder',
+ 'PhotoAlbum' : 'photo_album',
+ 'Photo' : 'photo'
+ };
+
+ const icon = iconT[item.Type];
+ return icon ? '
' : '';
+}
+
+export function getMissingIndicator(item) {
+ if (item.Type === 'Episode' && item.LocationType === 'Virtual') {
+ if (item.PremiereDate) {
try {
- startDate = datetime.parseISO8601Date(item.StartDate).getTime();
- endDate = datetime.parseISO8601Date(item.EndDate).getTime();
+ const premiereDate = datetime.parseISO8601Date(item.PremiereDate).getTime();
+ if (premiereDate > new Date().getTime()) {
+ return '
Unaired
';
+ }
} catch (err) {
console.error(err);
}
-
- var now = new Date().getTime();
- var total = endDate - startDate;
- pct = 100 * ((now - startDate) / total);
-
- if (pct > 0 && pct < 100) {
- var isRecording = item.Type === 'Timer' || item.Type === 'Recording' || item.TimerId;
- return getAutoTimeProgressHtml(pct, options, isRecording, startDate, endDate);
- }
}
-
- return '';
+ return '
Missing
';
}
- function enablePlayedIndicator(item) {
- return itemHelper.canMarkPlayed(item);
- }
+ return '';
+}
- function getPlayedIndicator(item) {
- if (enablePlayedIndicator(item)) {
- var userData = item.UserData || {};
- if (userData.UnplayedItemCount) {
- return '
' + userData.UnplayedItemCount + '
';
- }
-
- if (userData.PlayedPercentage && userData.PlayedPercentage >= 100 || (userData.Played)) {
- return '
';
- }
- }
-
- return '';
- }
-
- function getCountIndicatorHtml(count) {
- return '
' + count + '
';
- }
-
- function getChildCountIndicatorHtml(item, options) {
- var minCount = 0;
- if (options) {
- minCount = options.minCount || minCount;
- }
-
- if (item.ChildCount && item.ChildCount > minCount) {
- return getCountIndicatorHtml(item.ChildCount);
- }
-
- return '';
- }
-
- function getTimerIndicator(item) {
- var status;
-
- if (item.Type === 'SeriesTimer') {
- return '
';
- } else if (item.TimerId || item.SeriesTimerId) {
- status = item.Status || 'Cancelled';
- } else if (item.Type === 'Timer') {
- status = item.Status;
- } else {
- return '';
- }
-
- if (item.SeriesTimerId) {
- if (status !== 'Cancelled') {
- return '
';
- }
-
- return '
';
- }
-
- return '
';
- }
-
- function getSyncIndicator(item) {
- if (item.SyncPercent === 100) {
- return '
';
- } else if (item.SyncPercent != null) {
- return '
';
- }
-
- return '';
- }
-
- function getTypeIndicator(item) {
- if (item.Type === 'Video') {
- return '
';
- }
- if (item.Type === 'Folder') {
- return '
';
- }
- if (item.Type === 'PhotoAlbum') {
- return '
';
- }
- if (item.Type === 'Photo') {
- return '
';
- }
-
- return '';
- }
-
- function getMissingIndicator(item) {
- if (item.Type === 'Episode' && item.LocationType === 'Virtual') {
- if (item.PremiereDate) {
- try {
- var premiereDate = datetime.parseISO8601Date(item.PremiereDate).getTime();
- if (premiereDate > new Date().getTime()) {
- return '
Unaired
';
- }
- } catch (err) {
- console.error(err);
- }
- }
- return '
Missing
';
- }
-
- return '';
- }
-
- return {
- getProgressHtml: getProgressHtml,
- getProgressBarHtml: getProgressBarHtml,
- getPlayedIndicatorHtml: getPlayedIndicator,
- getChildCountIndicatorHtml: getChildCountIndicatorHtml,
- enableProgressIndicator: enableProgressIndicator,
- getTimerIndicator: getTimerIndicator,
- enablePlayedIndicator: enablePlayedIndicator,
- getSyncIndicator: getSyncIndicator,
- getTypeIndicator: getTypeIndicator,
- getMissingIndicator: getMissingIndicator
- };
-});
+export default {
+ getProgressHtml: getProgressHtml,
+ getProgressBarHtml: getProgressBarHtml,
+ getPlayedIndicatorHtml: getPlayedIndicatorHtml,
+ getChildCountIndicatorHtml: getChildCountIndicatorHtml,
+ enableProgressIndicator: enableProgressIndicator,
+ getTimerIndicator: getTimerIndicator,
+ enablePlayedIndicator: enablePlayedIndicator,
+ getSyncIndicator: getSyncIndicator,
+ getTypeIndicator: getTypeIndicator,
+ getMissingIndicator: getMissingIndicator
+};
diff --git a/src/components/itemcontextmenu.js b/src/components/itemContextMenu.js
similarity index 99%
rename from src/components/itemcontextmenu.js
rename to src/components/itemContextMenu.js
index 8c809a0966..f258f5fe4b 100644
--- a/src/components/itemcontextmenu.js
+++ b/src/components/itemContextMenu.js
@@ -450,7 +450,7 @@ define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'appRouter',
navigator.share({
title: item.Name,
text: item.Overview,
- url: 'https://github.com/jellyfin/jellyfin'
+ url: `${apiClient.serverAddress()}/web/index.html#!/${appRouter.getRouteUrl(item)}`
});
break;
case 'album':
diff --git a/src/components/itemhelper.js b/src/components/itemHelper.js
similarity index 100%
rename from src/components/itemhelper.js
rename to src/components/itemHelper.js
diff --git a/src/components/itemidentifier/itemidentifier.js b/src/components/itemidentifier/itemidentifier.js
index 8710936028..b335d1dfd3 100644
--- a/src/components/itemidentifier/itemidentifier.js
+++ b/src/components/itemidentifier/itemidentifier.js
@@ -348,7 +348,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
currentItemType = currentItem.Type;
var dialogOptions = {
- size: 'fullscreen-border',
+ size: 'small',
removeOnClose: true,
scrollY: false
};
@@ -429,7 +429,7 @@ define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize',
require(['text!./itemidentifier.template.html'], function (template) {
var dialogOptions = {
- size: 'fullscreen-border',
+ size: 'small',
removeOnClose: true,
scrollY: false
};
diff --git a/src/components/lazyloader/lazyloader-intersectionobserver.js b/src/components/lazyLoader/lazyLoaderIntersectionObserver.js
similarity index 100%
rename from src/components/lazyloader/lazyloader-intersectionobserver.js
rename to src/components/lazyLoader/lazyLoaderIntersectionObserver.js
diff --git a/src/components/listview/listview.js b/src/components/listview/listview.js
index 0743b35280..587355b351 100644
--- a/src/components/listview/listview.js
+++ b/src/components/listview/listview.js
@@ -426,7 +426,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
html += '
';
- const moreIcon = 'more_horiz';
+ const moreIcon = 'more_vert';
html += getTextLinesHtml(textlines, isLargeStyle);
diff --git a/src/components/loadingdialog/loadingdialog.js b/src/components/loadingDialog/loadingDialog.js
similarity index 100%
rename from src/components/loadingdialog/loadingdialog.js
rename to src/components/loadingDialog/loadingDialog.js
diff --git a/src/components/logoscreensaver/plugin.js b/src/components/logoScreensaver/plugin.js
similarity index 100%
rename from src/components/logoscreensaver/plugin.js
rename to src/components/logoScreensaver/plugin.js
diff --git a/src/components/logoscreensaver/style.css b/src/components/logoScreensaver/style.css
similarity index 100%
rename from src/components/logoscreensaver/style.css
rename to src/components/logoScreensaver/style.css
diff --git a/src/components/medialibrarycreator/medialibrarycreator.js b/src/components/mediaLibraryCreator/mediaLibraryCreator.js
similarity index 98%
rename from src/components/medialibrarycreator/medialibrarycreator.js
rename to src/components/mediaLibraryCreator/mediaLibraryCreator.js
index 450f5a64e6..bbef6e1f07 100644
--- a/src/components/medialibrarycreator/medialibrarycreator.js
+++ b/src/components/mediaLibraryCreator/mediaLibraryCreator.js
@@ -182,12 +182,12 @@ define(['loading', 'dialogHelper', 'dom', 'jQuery', 'components/libraryoptionsed
currentResolve = resolve;
hasChanges = false;
var xhr = new XMLHttpRequest();
- xhr.open('GET', 'components/medialibrarycreator/medialibrarycreator.template.html', true);
+ xhr.open('GET', 'components/mediaLibraryCreator/mediaLibraryCreator.template.html', true);
xhr.onload = function (e) {
var template = this.response;
var dlg = dialogHelper.createDialog({
- size: 'medium-tall',
+ size: 'small',
modal: false,
removeOnClose: true,
scrollY: false
diff --git a/src/components/medialibrarycreator/medialibrarycreator.template.html b/src/components/mediaLibraryCreator/mediaLibraryCreator.template.html
similarity index 100%
rename from src/components/medialibrarycreator/medialibrarycreator.template.html
rename to src/components/mediaLibraryCreator/mediaLibraryCreator.template.html
diff --git a/src/components/medialibraryeditor/medialibraryeditor.js b/src/components/mediaLibraryEditor/mediaLibraryEditor.js
similarity index 98%
rename from src/components/medialibraryeditor/medialibraryeditor.js
rename to src/components/mediaLibraryEditor/mediaLibraryEditor.js
index 3141509629..554cf4cc0f 100644
--- a/src/components/medialibraryeditor/medialibraryeditor.js
+++ b/src/components/mediaLibraryEditor/mediaLibraryEditor.js
@@ -199,12 +199,12 @@ define(['jQuery', 'loading', 'dialogHelper', 'dom', 'components/libraryoptionsed
currentDeferred = deferred;
hasChanges = false;
var xhr = new XMLHttpRequest();
- xhr.open('GET', 'components/medialibraryeditor/medialibraryeditor.template.html', true);
+ xhr.open('GET', 'components/mediaLibraryEditor/mediaLibraryEditor.template.html', true);
xhr.onload = function (e) {
var template = this.response;
var dlg = dialogHelper.createDialog({
- size: 'medium-tall',
+ size: 'small',
modal: false,
removeOnClose: true,
scrollY: false
diff --git a/src/components/medialibraryeditor/medialibraryeditor.template.html b/src/components/mediaLibraryEditor/mediaLibraryEditor.template.html
similarity index 100%
rename from src/components/medialibraryeditor/medialibraryeditor.template.html
rename to src/components/mediaLibraryEditor/mediaLibraryEditor.template.html
diff --git a/src/components/mediainfo/mediainfo.js b/src/components/mediainfo/mediainfo.js
index 0c9a87e800..c569a7c78c 100644
--- a/src/components/mediainfo/mediainfo.js
+++ b/src/components/mediainfo/mediainfo.js
@@ -490,26 +490,26 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater
if (i.IsInterlaced) {
return '1440i';
}
- return '1440P';
+ return '1440p';
}
if (width >= 1800 || height >= 1000) {
if (i.IsInterlaced) {
return '1080i';
}
- return '1080P';
+ return '1080p';
}
if (width >= 1200 || height >= 700) {
if (i.IsInterlaced) {
return '720i';
}
- return '720P';
+ return '720p';
}
if (width >= 700 || height >= 400) {
if (i.IsInterlaced) {
return '480i';
}
- return '480P';
+ return '480p';
}
}
diff --git a/src/components/metadataeditor/metadataeditor.js b/src/components/metadataEditor/metadataEditor.js
similarity index 95%
rename from src/components/metadataeditor/metadataeditor.js
rename to src/components/metadataEditor/metadataEditor.js
index e1c1c8001f..52f030cd23 100644
--- a/src/components/metadataeditor/metadataeditor.js
+++ b/src/components/metadataEditor/metadataEditor.js
@@ -245,50 +245,6 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi
});
}
- function showMoreMenu(context, button, user) {
-
- require(['itemContextMenu'], function (itemContextMenu) {
-
- var item = currentItem;
-
- itemContextMenu.show({
-
- item: item,
- positionTo: button,
- edit: false,
- editImages: true,
- editSubtitles: true,
- sync: false,
- share: false,
- play: false,
- queue: false,
- user: user
-
- }).then(function (result) {
-
- if (result.deleted) {
- afterDeleted(context, item);
-
- } else if (result.updated) {
- reload(context, item.Id, item.ServerId);
- }
- });
- });
- }
-
- function afterDeleted(context, item) {
-
- var parentId = item.ParentId || item.SeasonId || item.SeriesId;
-
- if (parentId) {
- reload(context, parentId, item.ServerId);
- } else {
- require(['appRouter'], function (appRouter) {
- appRouter.goHome();
- });
- }
- }
-
function onEditorClick(e) {
var btnRemoveFromEditorList = dom.parentWithClass(e.target, 'btnRemoveFromEditorList');
@@ -307,6 +263,12 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi
return connectionManager.getApiClient(currentItem.ServerId);
}
+ function bindAll(elems, eventName, fn) {
+ for (var i = 0, length = elems.length; i < length; i++) {
+ elems[i].addEventListener(eventName, fn);
+ }
+ }
+
function init(context, apiClient) {
context.querySelector('.externalIds').addEventListener('click', function (e) {
@@ -322,19 +284,16 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi
}
});
- context.querySelector('.btnCancel').addEventListener('click', function () {
+ if (!layoutManager.desktop) {
+ context.querySelector('.btnBack').classList.remove('hide');
+ context.querySelector('.btnClose').classList.add('hide');
+ }
+ bindAll(context.querySelectorAll('.btnCancel'), 'click', function (event) {
+ event.preventDefault();
closeDialog(false);
});
- context.querySelector('.btnMore').addEventListener('click', function (e) {
-
- getApiClient().getCurrentUser().then(function (user) {
- showMoreMenu(context, e.target, user);
- });
-
- });
-
context.querySelector('.btnHeaderSave').addEventListener('click', function (e) {
context.querySelector('.btnSave').click();
@@ -349,8 +308,8 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi
}
});
- context.removeEventListener('click', onEditorClick);
- context.addEventListener('click', onEditorClick);
+ context.removeEventListener('submit', onEditorClick);
+ context.addEventListener('submit', onEditorClick);
var form = context.querySelector('form');
form.removeEventListener('submit', onSubmit);
@@ -1067,7 +1026,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi
function show(itemId, serverId, resolve, reject) {
loading.show();
- require(['text!./metadataeditor.template.html'], function (template) {
+ require(['text!./metadataEditor.template.html'], function (template) {
var dialogOptions = {
removeOnClose: true,
@@ -1077,7 +1036,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi
if (layoutManager.tv) {
dialogOptions.size = 'fullscreen';
} else {
- dialogOptions.size = 'medium-tall';
+ dialogOptions.size = 'small';
}
var dlg = dialogHelper.createDialog(dialogOptions);
@@ -1124,7 +1083,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi
loading.show();
- require(['text!./metadataeditor.template.html'], function (template) {
+ require(['text!./metadataEditor.template.html'], function (template) {
elem.innerHTML = globalize.translateDocument(template, 'core');
diff --git a/src/components/metadataeditor/metadataeditor.template.html b/src/components/metadataEditor/metadataEditor.template.html
similarity index 78%
rename from src/components/metadataeditor/metadataeditor.template.html
rename to src/components/metadataEditor/metadataEditor.template.html
index 39894d4f6f..4b4e2cf965 100644
--- a/src/components/metadataeditor/metadataeditor.template.html
+++ b/src/components/metadataEditor/metadataEditor.template.html
@@ -1,5 +1,5 @@
@@ -57,11 +57,13 @@
-
-
-
-