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

Merge branch 'master' into hadicharara/added-support-for-rtl-layouts

This commit is contained in:
Hadi Charara 2022-10-12 08:29:53 -04:00
commit 104ad71ea7
128 changed files with 1242 additions and 1454 deletions

View file

@ -37,7 +37,8 @@ import { pageIdOn } from '../../utils/dashboard';
const date = datetime.parseISO8601Date(item.DateCreated, true);
html += datetime.toLocaleDateString(date) + ' ' + datetime.getDisplayTime(date);
html += '</td>';
return html += '</tr>';
html += '</tr>';
return html;
}).join('');
page.querySelector('.resultBody').innerHTML = rows;
loading.hide();

View file

@ -6,7 +6,7 @@ import serverNotifications from '../../scripts/serverNotifications';
import dom from '../../scripts/dom';
import globalize from '../../scripts/globalize';
import { formatDistanceToNow } from 'date-fns';
import { localeWithSuffix } from '../../scripts/dfnshelper';
import { getLocaleWithSuffix } from '../../scripts/dfnshelper';
import loading from '../../components/loading/loading';
import playMethodHelper from '../../components/playback/playmethodhelper';
import cardBuilder from '../../components/cardbuilder/cardBuilder';
@ -458,7 +458,7 @@ import confirm from '../../components/confirm/confirm';
html += ' / ';
if (nowPlayingItem && nowPlayingItem.RunTimeTicks) {
if (nowPlayingItem.RunTimeTicks) {
html += datetime.getDisplayRunningTime(nowPlayingItem.RunTimeTicks);
} else {
html += '0:00';
@ -477,7 +477,7 @@ import confirm from '../../components/confirm/confirm';
// how dates are returned by the server when the session is active and show something like 'Active now', instead of past/future sentences
if (!nowPlayingItem) {
return {
html: globalize.translate('LastSeen', formatDistanceToNow(Date.parse(session.LastActivityDate), localeWithSuffix)),
html: globalize.translate('LastSeen', formatDistanceToNow(Date.parse(session.LastActivityDate), getLocaleWithSuffix())),
image: imgUrl
};
}
@ -747,14 +747,7 @@ import confirm from '../../components/confirm/confirm';
console.debug('onServerRestarting not implemented', evt, apiClient);
}
function onPackageInstalling(evt, apiClient) {
if (apiClient.serverId() === serverId) {
pollForInfo(view, apiClient);
reloadSystemInfo(view, apiClient);
}
}
function onPackageInstallationCompleted(evt, apiClient) {
function onPackageInstall(_, apiClient) {
if (apiClient.serverId() === serverId) {
pollForInfo(view, apiClient);
reloadSystemInfo(view, apiClient);
@ -786,8 +779,8 @@ import confirm from '../../components/confirm/confirm';
Events.on(serverNotifications, 'RestartRequired', onRestartRequired);
Events.on(serverNotifications, 'ServerShuttingDown', onServerShuttingDown);
Events.on(serverNotifications, 'ServerRestarting', onServerRestarting);
Events.on(serverNotifications, 'PackageInstalling', onPackageInstalling);
Events.on(serverNotifications, 'PackageInstallationCompleted', onPackageInstallationCompleted);
Events.on(serverNotifications, 'PackageInstalling', onPackageInstall);
Events.on(serverNotifications, 'PackageInstallationCompleted', onPackageInstall);
Events.on(serverNotifications, 'Sessions', onSessionsUpdate);
Events.on(serverNotifications, 'ScheduledTasksInfo', onScheduledTasksUpdate);
DashboardPage.lastAppUpdateCheck = null;
@ -800,13 +793,11 @@ import confirm from '../../components/confirm/confirm';
});
}
if (ApiClient.isMinServerVersion('3.4.1.25')) {
if (!page.serverActivityLog) {
page.serverActivityLog = new ActivityLog({
serverId: ApiClient.serverId(),
element: page.querySelector('.serverActivityItems')
});
}
if (!page.serverActivityLog) {
page.serverActivityLog = new ActivityLog({
serverId: ApiClient.serverId(),
element: page.querySelector('.serverActivityItems')
});
}
refreshActiveRecordings(view, apiClient);
@ -826,8 +817,8 @@ import confirm from '../../components/confirm/confirm';
Events.off(serverNotifications, 'RestartRequired', onRestartRequired);
Events.off(serverNotifications, 'ServerShuttingDown', onServerShuttingDown);
Events.off(serverNotifications, 'ServerRestarting', onServerRestarting);
Events.off(serverNotifications, 'PackageInstalling', onPackageInstalling);
Events.off(serverNotifications, 'PackageInstallationCompleted', onPackageInstallationCompleted);
Events.off(serverNotifications, 'PackageInstalling', onPackageInstall);
Events.off(serverNotifications, 'PackageInstallationCompleted', onPackageInstall);
Events.off(serverNotifications, 'Sessions', onSessionsUpdate);
Events.off(serverNotifications, 'ScheduledTasksInfo', onScheduledTasksUpdate);

View file

@ -5,7 +5,7 @@ import dom from '../../../scripts/dom';
import globalize from '../../../scripts/globalize';
import imageHelper from '../../../scripts/imagehelper';
import { formatDistanceToNow } from 'date-fns';
import { localeWithSuffix } from '../../../scripts/dfnshelper';
import { getLocaleWithSuffix } from '../../../scripts/dfnshelper';
import '../../../elements/emby-button/emby-button';
import '../../../elements/emby-itemscontainer/emby-itemscontainer';
import '../../../components/cardbuilder/card.scss';
@ -91,6 +91,8 @@ import confirm from '../../../components/confirm/confirm';
}
function load(page, devices) {
const localeWithSuffix = getLocaleWithSuffix();
let html = '';
html += devices.map(function (device) {
let deviceHtml = '';

View file

@ -149,7 +149,8 @@ import { getParameterByName } from '../../../utils/url.ts';
li += '<h3 class="listItemBodyText">' + escapeHtml(h.Name + ' = ' + (h.Value || '')) + '</h3>';
li += '</div>';
li += '<button type="button" is="paper-icon-button-light" class="btnDeleteXmlAttribute listItemButton" data-index="0"><span class="material-icons delete" aria-hidden="true"></span></button>';
return li += '</div>';
li += '</div>';
return li;
}).join('') + '</div>';
const elem = $('.xmlDocumentAttributeList', page).html(html).trigger('create');
$('.btnDeleteXmlAttribute', elem).on('click', function () {

View file

@ -129,7 +129,8 @@ function getPluginHtml(plugin, options, installedPlugins) {
html += '</div>';
html += '</div>';
html += '</div>';
return html += '</div>';
html += '</div>';
return html;
}
function getTabs() {

View file

@ -4,7 +4,7 @@ import { Events } from 'jellyfin-apiclient';
import globalize from '../../../scripts/globalize';
import serverNotifications from '../../../scripts/serverNotifications';
import { formatDistance, formatDistanceToNow } from 'date-fns';
import { getLocale, localeWithSuffix } from '../../../scripts/dfnshelper';
import { getLocale, getLocaleWithSuffix } from '../../../scripts/dfnshelper';
import '../../../components/listview/listview.scss';
import '../../../elements/emby-button/emby-button';
@ -86,7 +86,7 @@ import '../../../elements/emby-button/emby-button';
if (task.LastExecutionResult) {
const endtime = Date.parse(task.LastExecutionResult.EndTimeUtc);
const starttime = Date.parse(task.LastExecutionResult.StartTimeUtc);
html += globalize.translate('LabelScheduledTaskLastRan', formatDistanceToNow(endtime, localeWithSuffix),
html += globalize.translate('LabelScheduledTaskLastRan', formatDistanceToNow(endtime, getLocaleWithSuffix()),
formatDistance(starttime, endtime, { locale: getLocale() }));
if (task.LastExecutionResult.Status === 'Failed') {
html += " <span style='color:#FF0000;'>(" + globalize.translate('LabelFailed') + ')</span>';

View file

@ -170,7 +170,6 @@ function renderSeriesTimerEditor(page, item, apiClient, user) {
page.querySelector('.seriesTimerScheduleSection').classList.add('hide');
hideAll(page, 'btnCancelSeriesTimer');
return;
}
function renderTrackSelections(page, instance, item, forceReload) {
@ -206,8 +205,12 @@ function renderTrackSelections(page, instance, item, forceReload) {
});
mediaSources = [];
resolutionNames.forEach(v => mediaSources.push(v));
sourceNames.forEach(v => mediaSources.push(v));
resolutionNames.forEach(v => {
mediaSources.push(v);
});
sourceNames.forEach(v => {
mediaSources.push(v);
});
instance._currentPlaybackMediaSources = mediaSources;

View file

@ -720,8 +720,6 @@ class ItemsView {
if (params.type === 'Video') {
return globalize.translate('Videos');
}
return;
}
function play() {

View file

@ -66,11 +66,9 @@ function renderRecordingFolders(context, promise) {
function onMoreClick() {
const type = this.getAttribute('data-type');
const serverId = ApiClient.serverId();
switch (type) {
case 'latest':
Dashboard.navigate('list.html?type=Recordings&serverId=' + serverId);
if (type === 'latest') {
Dashboard.navigate('list.html?type=Recordings&serverId=' + ApiClient.serverId());
}
}

View file

@ -49,7 +49,8 @@ function getDeviceHtml(device) {
html += '</div>';
html += '</div>';
html += '</div>';
return html += '</div>';
html += '</div>';
return html;
}
function renderDevices(page, devices) {
@ -191,7 +192,7 @@ function deleteProvider(page, id) {
}
function getTunerName(providerId) {
switch (providerId = providerId.toLowerCase()) {
switch (providerId.toLowerCase()) {
case 'm3u':
return 'M3U';
case 'hdhomerun':
@ -206,7 +207,7 @@ function getTunerName(providerId) {
}
function getProviderName(providerId) {
switch (providerId = providerId.toLowerCase()) {
switch (providerId.toLowerCase()) {
case 'schedulesdirect':
return 'Schedules Direct';
case 'xmltv':
@ -217,7 +218,7 @@ function getProviderName(providerId) {
}
function getProviderConfigurationUrl(providerId) {
switch (providerId = providerId.toLowerCase()) {
switch (providerId.toLowerCase()) {
case 'xmltv':
return '#/livetvguideprovider.html?type=xmltv';
case 'schedulesdirect':

View file

@ -374,10 +374,9 @@ import Dashboard from '../../utils/dashboard';
}
function onInputCommand(e) {
switch (e.detail.command) {
case 'search':
e.preventDefault();
Dashboard.navigate('search.html?collectionType=movies&parentId=' + params.topParentId);
if (e.detail.command === 'search') {
e.preventDefault();
Dashboard.navigate('search.html?collectionType=movies&parentId=' + params.topParentId);
}
}

View file

@ -348,10 +348,9 @@ import Dashboard from '../../utils/dashboard';
}
function onInputCommand(e) {
switch (e.detail.command) {
case 'search':
e.preventDefault();
Dashboard.navigate('search.html?collectionType=music&parentId=' + params.topParentId);
if (e.detail.command === 'search') {
e.preventDefault();
Dashboard.navigate('search.html?collectionType=music&parentId=' + params.topParentId);
}
}

View file

@ -21,6 +21,7 @@
<div class="flex flex-direction-row align-items-center" dir="ltr">
<div class="osdTextContainer startTimeText osdPositionText" style="margin: 0 .25em 0 0;"></div>
<div class="sliderContainer flex-grow" style="margin: .5em 0 .25em;">
<div class="sliderMarkerContainer"></div>
<input type="range" step=".01" min="0" max="100" value="0" is="emby-slider" class="osdPositionSlider" data-slider-keep-progress="true" />
</div>
<div class="osdTextContainer endTimeText osdDurationText" style="margin: 0 0 0 .25em;"></div>

View file

@ -1,6 +1,6 @@
import escapeHtml from 'escape-html';
import { playbackManager } from '../../../components/playback/playbackmanager';
import SyncPlay from '../../../components/syncPlay/core';
import SyncPlay from '../../../plugins/syncPlay/core';
import browser from '../../../scripts/browser';
import dom from '../../../scripts/dom';
import inputManager from '../../../scripts/inputManager';
@ -1204,17 +1204,6 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components
resetIdle();
}
function onWindowTouchStart(e) {
clickedElement = e.target;
mouseIsDown = true;
resetIdle();
}
function onWindowTouchEnd() {
mouseIsDown = false;
resetIdle();
}
function onWindowDragEnd() {
// mousedown -> dragstart -> dragend !!! no mouseup :(
mouseIsDown = false;
@ -1370,12 +1359,12 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components
capture: true,
passive: true
});
dom.addEventListener(window, 'touchstart', onWindowTouchStart, {
dom.addEventListener(window, 'touchstart', onWindowMouseDown, {
capture: true,
passive: true
});
['touchend', 'touchcancel'].forEach((event) => {
dom.addEventListener(window, event, onWindowTouchEnd, {
dom.addEventListener(window, event, onWindowMouseUp, {
capture: true,
passive: true
});
@ -1411,12 +1400,12 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components
capture: true,
passive: true
});
dom.removeEventListener(window, 'touchstart', onWindowTouchStart, {
dom.removeEventListener(window, 'touchstart', onWindowMouseDown, {
capture: true,
passive: true
});
['touchend', 'touchcancel'].forEach((event) => {
dom.removeEventListener(window, event, onWindowTouchEnd, {
dom.removeEventListener(window, event, onWindowMouseUp, {
capture: true,
passive: true
});
@ -1574,6 +1563,25 @@ import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components
return '<h1 class="sliderBubbleText">' + datetime.getDisplayRunningTime(ticks) + '</h1>';
};
nowPlayingPositionSlider.getMarkerInfo = function () {
const markers = [];
const item = currentItem;
// use markers based on chapters
if (item?.Chapters?.length) {
item.Chapters.forEach(currentChapter => {
markers.push({
className: 'chapterMarker',
name: currentChapter.Name,
progress: currentChapter.StartPositionTicks / item.RunTimeTicks
});
});
}
return markers;
};
view.querySelector('.btnPreviousTrack').addEventListener('click', function () {
playbackManager.previousTrack(currentPlayer);
});

View file

@ -35,7 +35,6 @@ import Dashboard from '../../../utils/dashboard';
Dashboard.navigate('forgotpasswordpin.html');
}
});
return;
}
}

View file

@ -333,10 +333,9 @@ import autoFocuser from '../../components/autoFocuser';
}
function onInputCommand(e) {
switch (e.detail.command) {
case 'search':
e.preventDefault();
Dashboard.navigate('search.html?collectionType=tv&parentId=' + params.topParentId);
if (e.detail.command === 'search') {
e.preventDefault();
Dashboard.navigate('search.html?collectionType=tv&parentId=' + params.topParentId);
}
}