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

Merge pull request #2066 from MediaBrowser/dev

Dev
This commit is contained in:
Luke 2016-08-17 01:48:55 -04:00 committed by GitHub
commit df0c785b97
68 changed files with 804 additions and 702 deletions

View file

@ -16,12 +16,12 @@
},
"devDependencies": {},
"ignore": [],
"version": "1.1.75",
"_release": "1.1.75",
"version": "1.1.76",
"_release": "1.1.76",
"_resolution": {
"type": "version",
"tag": "1.1.75",
"commit": "5518536e19fe1efdb8cb149833320017c051e751"
"tag": "1.1.76",
"commit": "1096ffc66e3df8d63e305889dd7fb5b769095082"
},
"_source": "https://github.com/MediaBrowser/Emby.ApiClient.Javascript.git",
"_target": "^1.1.51",

View file

@ -0,0 +1,47 @@
define([], function () {
var myStore = {};
var cache;
var localData;
function updateCache() {
cache.put('data', new Response(JSON.stringify(localData)));
}
myStore.setItem = function (name, value) {
if (localData) {
var changed = localData[name] != value;
if (changed) {
localData[name] = value;
updateCache();
}
}
};
myStore.getItem = function (name) {
if (localData) {
return localData[name];
}
};
myStore.removeItem = function (name) {
if (localData) {
localData[name] = null;
delete localData[name];
updateCache();
}
};
myStore.init = function () {
return caches.open('embydata').then(function (result) {
cache = result;
localData = {};
});
};
return myStore;
});

View file

@ -14,12 +14,12 @@
},
"devDependencies": {},
"ignore": [],
"version": "1.4.171",
"_release": "1.4.171",
"version": "1.4.173",
"_release": "1.4.173",
"_resolution": {
"type": "version",
"tag": "1.4.171",
"commit": "388435c54b3b15c417b8d76701cf09b42b968a08"
"tag": "1.4.173",
"commit": "8766e295ec13de73c5ef5a61c7357fc30d8c9fa1"
},
"_source": "https://github.com/MediaBrowser/emby-webcomponents.git",
"_target": "^1.2.1",

View file

@ -702,7 +702,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo
return html;
}
function getCardFooterText(item, options, showTitle, imgUrl, footerClass, progressHtml, isOuterFooter) {
function getCardFooterText(item, options, showTitle, forceName, imgUrl, footerClass, progressHtml, isOuterFooter) {
var html = '';
@ -869,6 +869,10 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo
}
}
if (showTitle && forceName && lines.length == 1) {
lines = [];
}
html += getCardTextLines(lines, cssClass, !options.overlayText, isOuterFooter);
if (progressHtml) {
@ -1012,7 +1016,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo
var imgInfo = getCardImageUrl(item, apiClient, options);
var imgUrl = imgInfo.imgUrl;
var forceName = imgInfo.forceName;
var forceName = imgInfo.forceName || !imgUrl;
var showTitle = options.showTitle == 'auto' ? true : (options.showTitle || item.Type == 'PhotoAlbum' || item.Type == 'Folder');
var overlayText = options.overlayText;
@ -1057,7 +1061,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo
if (overlayText) {
footerCssClass = progressHtml ? 'innerCardFooter fullInnerCardFooter' : 'innerCardFooter';
innerCardFooter += getCardFooterText(item, options, showTitle, imgUrl, footerCssClass, progressHtml, false);
innerCardFooter += getCardFooterText(item, options, showTitle, forceName, imgUrl, footerCssClass, progressHtml, false);
footerOverlayed = true;
}
else if (progressHtml) {
@ -1076,7 +1080,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo
var outerCardFooter = '';
if (!overlayText && !footerOverlayed) {
footerCssClass = options.cardLayout ? 'cardFooter' : 'cardFooter transparent';
outerCardFooter = getCardFooterText(item, options, showTitle, imgUrl, footerCssClass, progressHtml, true);
outerCardFooter = getCardFooterText(item, options, showTitle, forceName, imgUrl, footerCssClass, progressHtml, true);
}
if (outerCardFooter && !options.cardLayout && options.allowBottomPadding !== false) {

View file

@ -72,14 +72,5 @@
}
.fullSyncIndicator {
color: #673AB7;
padding: 0;
border: 4px solid #673AB7;
background: #fff;
width: auto;
height: auto;
}
.fullSyncIndicatorIcon {
margin: -3px;
background: rgba(82,181,75,1);
}

View file

@ -111,7 +111,7 @@ define(['css!./indicators.css', 'material-icons'], function () {
function getSyncIndicator(item) {
if (item.SyncPercent == 100) {
return '<div class="syncIndicator indicator fullSyncIndicator"><i class="md-icon indicatorIcon fullSyncIndicatorIcon">offline_pin</i></div>';
return '<div class="syncIndicator indicator fullSyncIndicator"><i class="md-icon indicatorIcon">file_download</i></div>';
} else if (item.SyncPercent != null) {
return '<div class="syncIndicator indicator emptySyncIndicator"><i class="md-icon indicatorIcon">file_download</i></div>';
}

View file

@ -176,23 +176,22 @@
return new Promise(function (resolve, reject) {
var msg = globalize.translate('ConfirmDeleteItem');
var title = globalize.translate('HeaderDeleteItem');
var msg = globalize.translate('sharedcomponents#ConfirmDeleteItem');
var title = globalize.translate('sharedcomponents#HeaderDeleteItem');
if (itemIds.length > 1) {
msg = globalize.translate('ConfirmDeleteItems');
title = globalize.translate('HeaderDeleteItems');
msg = globalize.translate('sharedcomponents#ConfirmDeleteItems');
title = globalize.translate('sharedcomponents#HeaderDeleteItems');
}
require(['confirm'], function (confirm) {
confirm(msg, title).then(function () {
var promises = itemIds.map(function (itemId) {
apiClient.deleteItem(itemId);
});
resolve();
Promise.all(promises).then(resolve);
}, reject);
});
@ -306,7 +305,7 @@
dispatchNeedsRefresh();
break;
case 'delete':
deleteItems(items).then(function () {
deleteItems(apiClient, items).then(function () {
embyRouter.goHome();
});
hideSelections();

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -2,8 +2,8 @@
"ValueSpecialEpisodeName": "Special - {0}",
"Share": "Teilen",
"Add": "Hinzuf\u00fcgen",
"ServerUpdateNeeded": "Dieser Emby Server muss aktualisiert werden. Um die neueste Version herunterzuladen, besuchen sie bitte {0}",
"LiveTvGuideRequiresUnlock": "Ihr TV-Guide ist begrenzt auf {0} Kan\u00e4le. Klicken Sie auf die Freischalten Schaltfl\u00e4che um weitere Informationen zu erhalten.",
"ServerUpdateNeeded": "Dieser Emby Server muss aktualisiert werden. Um die neueste Version herunterzuladen, besuche bitte {0}",
"LiveTvGuideRequiresUnlock": "Dein TV-Guide ist derzeit begrenzt auf {0} Kan\u00e4le. Klicke auf die \"Freischalten\" Schaltfl\u00e4che um weitere Informationen zu erhalten.",
"AttributeNew": "Neu",
"AttributePremiere": "Premiere",
"AttributeLive": "Live",
@ -24,7 +24,7 @@
"ButtonOk": "Ok",
"ButtonCancel": "Abbrechen",
"ButtonGotIt": "Verstanden",
"ButtonRestart": "Restart",
"ButtonRestart": "Neustart",
"RecordingCancelled": "Aufzeichnung abgebrochen.",
"RecordingScheduled": "Aufnahme geplant.",
"SeriesRecordingScheduled": "Serien-Aufnahme geplant.",
@ -43,8 +43,8 @@
"RecordOnAllChannels": "Auf allen Kan\u00e4len aufzeichnen",
"RecordAnytime": "Zu jeder Zeit aufzeichnen",
"RecordOnlyNewEpisodes": "Nehme nur neue Episoden auf",
"HeaderBecomeProjectSupporter": "Holen Sie Emby Premium",
"HeaderEnjoyDayTrial": "Genie\u00dfen Sie eine 14 Tage Testversion",
"HeaderBecomeProjectSupporter": "Hol dir Emby Premiere",
"HeaderEnjoyDayTrial": "Genie\u00dfe eine 14-t\u00e4gige Testversion",
"MessageActiveSubscriptionRequiredSeriesRecordings": "Ein aktives Emby Premium Abo wird benn\u00f6tigt um automatische Serienaufnahmen zu erstellen.",
"OptionConvertRecordingsToStreamingFormat": "Konvertiere Aufnahmen automatisch in ein streaming freundliches Format.",
"OptionConvertRecordingsToStreamingFormatHelp": "Aufnahmen werden als MP4 konvertiert um eine bessere Wiedergabe auf Ihren Ger\u00e4ten zu gew\u00e4hrleisten.",
@ -56,7 +56,7 @@
"Advanced": "Erweitert",
"Delete": "L\u00f6schen",
"HeaderDeleteItem": "L\u00f6sche Element",
"ConfirmDeleteItem": "L\u00f6schen dieses Eintrages bedeutet das L\u00f6schen der Datei und das Entfernen aus der Medien-Bibliothek. M\u00f6chten Sie wirklich fortfahren?",
"ConfirmDeleteItem": "L\u00f6schen dieses Eintrages bedeutet das L\u00f6schen der Datei und das Entfernen aus der Medien-Bibliothek. M\u00f6chtest du wirklich fortfahren?",
"Refresh": "Aktualisieren",
"RefreshQueued": "Warteschlange aktualisieren.",
"AddToCollection": "Zur Sammlung hinzuf\u00fcgen",
@ -64,7 +64,7 @@
"NewCollection": "Neue Collection",
"LabelCollection": "Sammlung:",
"Help": "Hilfe",
"NewCollectionHelp": "Sammlungen erm\u00f6glichen personallisierte Gruppen von Filmen oder anderen Medien.",
"NewCollectionHelp": "Sammlungen erm\u00f6glichen personalisierte Gruppen von Filmen oder anderen Medien.",
"SearchForCollectionInternetMetadata": "Suche im Internet nach Bildmaterial und Metadaten",
"LabelName": "Name:",
"NewCollectionNameExample": "Beispiel: Star Wars Collection",
@ -91,11 +91,11 @@
"SearchForMissingMetadata": "Suche nach fehlenden Metadaten",
"LabelRefreshMode": "Aktualisierungsmodus:",
"NoItemsFound": "Keine Eintr\u00e4ge gefunden.",
"HeaderSaySomethingLike": "Sagen Sie etwas wie...",
"HeaderSaySomethingLike": "Sage etwas wie...",
"ButtonTryAgain": "Erneut versuchen",
"HeaderYouSaid": "Sie sagten....",
"HeaderYouSaid": "Du sagtest....",
"MessageWeDidntRecognizeCommand": "Entschuldigung, dieses Kommando konnten wir nicht erkennen.",
"MessageIfYouBlockedVoice": "Wenn Sie die Sprachsteuerung f\u00fcr die App nicht erlaubt haben so m\u00fcssen Sie dies zuvor \u00e4ndern bevor Sie es erneut probieren.",
"MessageIfYouBlockedVoice": "Wenn du die Sprachsteuerung f\u00fcr die App nicht erlaubt hast, musst du dies vor einem erneuten Versuch \u00e4ndern.",
"ValueDiscNumber": "Disc {0}",
"Unrated": "Nicht bewertet",
"Favorite": "Favorit",
@ -124,9 +124,9 @@
"MarkUnplayed": "Markiere \"als ungesehen\"",
"GroupVersions": "Gruppiere Versionen",
"PleaseSelectTwoItems": "Bitte w\u00e4hle mindestens zwei Optionen aus.",
"TheSelectedItemsWillBeGrouped": "Die ausgew\u00e4hlten Videos werden in einem virtuellen Element gruppiert. Emby Anwendungen w\u00e4hlen automatisch die beste Version anhand des Ger\u00e4tes und der Netzwerkgeschwindigkeit. Sind Sie sich sicher, dass Sie fortfahren m\u00f6chten?",
"TheSelectedItemsWillBeGrouped": "Die ausgew\u00e4hlten Videos werden in einem virtuellen Element gruppiert. Emby Anwendungen w\u00e4hlen automatisch die beste Version anhand des Ger\u00e4tes und der Netzwerkgeschwindigkeit. Bist du sicher, dass du fortfahren m\u00f6chtest?",
"TryMultiSelect": "Versuche Mehrfachauswahl",
"TryMultiSelectMessage": "F\u00fcr eine Mehrfachauswahl klicken und halten Sie ein Poster. W\u00e4hlen Sie die Eintr\u00e4ge die Sie bearbeiten m\u00f6chten. Versuchen SIe es!",
"TryMultiSelectMessage": "F\u00fcr eine Mehrfachauswahl klicke und halte ein Poster. W\u00e4hle die Eintr\u00e4ge die du bearbeiten m\u00f6chten. Versuch es!",
"HeaderConfirmRecordingCancellation": "Best\u00e4tige Aufzeichnungsabbruch",
"MessageConfirmRecordingCancellation": "Bis du dir sicher, diese Aufzeichnung abzubrechen?",
"Error": "Fehler",
@ -137,7 +137,7 @@
"LabelOriginalTitle": "Original Titel:",
"LabelSortTitle": "Sortierungs Titel:",
"LabelDateAdded": "Hinzugef\u00fcgt am:",
"ConfigureDateAdded": "Bestimmen Sie in den Bibliotheks-Einstellungen des Emby Server Dashboards, wie das Feld \"Hinzugef\u00fcgt am\" interpretiert werden soll.",
"ConfigureDateAdded": "Bestimme in den Bibliotheks-Einstellungen des Emby Server Dashboards, wie das Feld \"Hinzugef\u00fcgt am\" interpretiert werden soll.",
"LabelStatus": "Status:",
"LabelArtists": "Interpreten:",
"LabelArtistsHelp": "Trenne mehrere Eintr\u00e4ge durch ;",
@ -205,7 +205,7 @@
"Continuing": "Fortdauernd",
"Ended": "Beendent",
"HeaderEnabledFields": "Aktiviere Felder",
"HeaderEnabledFieldsHelp": "W\u00e4hlen Sie Felder ab um das \u00c4ndern von Daten zu verhindern.",
"HeaderEnabledFieldsHelp": "W\u00e4hle Felder ab um das \u00c4ndern von Daten zu verhindern.",
"Backdrops": "Hintergr\u00fcnde",
"Images": "Bilder",
"Keywords": "Stichworte",
@ -250,7 +250,9 @@
"SearchResults": "Suchergebnisse",
"SyncToOtherDevice": "Mit einem anderen Ger\u00e4t synchronisieren",
"MakeAvailableOffline": "Offline verf\u00fcgbar machen",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
"ServerNameIsRestarting": "Emby Server - {0} startet neu.",
"ServerNameIsShuttingDown": "Emby Server - {0} f\u00e4hrt herunter.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Bitte starte Emby Server - {0} neu."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -24,7 +24,7 @@
"ButtonOk": "OK",
"ButtonCancel": "Annuler",
"ButtonGotIt": "Vu",
"ButtonRestart": "Restart",
"ButtonRestart": "Red\u00e9marrer",
"RecordingCancelled": "Enregistrement annul\u00e9.",
"RecordingScheduled": "Enregistrement planifi\u00e9.",
"SeriesRecordingScheduled": "Enregistrement de la s\u00e9rie pr\u00e9vue.",
@ -108,7 +108,7 @@
"Shuffle": "M\u00e9langer",
"Identify": "Identifier",
"EditImages": "Modifier les images",
"EditInfo": "Modifier les informations",
"EditInfo": "Modifier infos",
"Sync": "Sync",
"InstantMix": "Instantan\u00e9",
"ViewAlbum": "Voir l'album",
@ -122,7 +122,7 @@
"Trailer": "Bande-annonce",
"MarkPlayed": "Marquer comme lu",
"MarkUnplayed": "Marquer comme non lu",
"GroupVersions": "Versions des groupes",
"GroupVersions": "Versions de groupe",
"PleaseSelectTwoItems": "Veuillez s\u00e9lectionner au moins deux items.",
"TheSelectedItemsWillBeGrouped": "Les vid\u00e9os s\u00e9lectionn\u00e9es seront regroup\u00e9es dans un objet virtuel. L'application Emby choisira automatiquement quelle version jouer d'apr\u00e8s le p\u00e9riph\u00e9rique et la performance du r\u00e9seau. \u00cates-vous s\u00fbre de vouloir continuer ?",
"TryMultiSelect": "Essayer la s\u00e9lection multiple",
@ -248,9 +248,11 @@
"PleaseEnterNameOrId": "Veuillez saisir un nom ou un identifiant externe.",
"MessageItemSaved": "Item sauvegard\u00e9.",
"SearchResults": "R\u00e9sultats de la recherche",
"SyncToOtherDevice": "Sync to other device",
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
"SyncToOtherDevice": "Sync vers un autre appareil",
"MakeAvailableOffline": "Rendre disponible hors connexion",
"ServerNameIsRestarting": "Emby Server - {0} est red\u00e9marr\u00e9.",
"ServerNameIsShuttingDown": "Emby Server - {0} est arr\u00eater.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "S'il vous pla\u00eet red\u00e9marrer Emby server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -24,7 +24,7 @@
"ButtonOk": "\u0416\u0430\u0440\u0430\u0439\u0434\u044b",
"ButtonCancel": "\u0411\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443",
"ButtonGotIt": "\u0422\u04af\u0441\u0456\u043d\u0456\u043a\u0442\u0456",
"ButtonRestart": "Restart",
"ButtonRestart": "\u049a\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u0443",
"RecordingCancelled": "\u0416\u0430\u0437\u0431\u0430 \u0431\u043e\u043b\u0434\u044b\u0440\u044b\u043b\u043c\u0430\u0434\u044b.",
"RecordingScheduled": "\u0416\u0430\u0437\u0443 \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d.",
"SeriesRecordingScheduled": "\u0422\u0435\u043b\u0435\u0445\u0438\u043a\u0430\u044f \u0436\u0430\u0437\u0443\u044b \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d.",
@ -250,7 +250,9 @@
"SearchResults": "\u0406\u0437\u0434\u0435\u0443 \u043d\u04d9\u0442\u0438\u0436\u0435\u043b\u0435\u0440\u0456",
"SyncToOtherDevice": "\u0411\u0430\u0441\u049b\u0430 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043c\u0435\u043d \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443",
"MakeAvailableOffline": "\u0414\u0435\u0440\u0431\u0435\u0441 \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0435\u0442\u0443",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
"ServerNameIsRestarting": "Emby Server - {0} \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0443\u0434\u0430.",
"ServerNameIsShuttingDown": "Emby Server - {0} \u0436\u04b1\u043c\u044b\u0441\u0442\u044b \u0430\u044f\u049b\u0442\u0430\u0443\u0434\u0430.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Emby Server \u04af\u0448\u0456\u043d \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u04a3\u044b\u0437 - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -24,7 +24,7 @@
"ButtonOk": "Ok",
"ButtonCancel": "Cancelar",
"ButtonGotIt": "Feito",
"ButtonRestart": "Restart",
"ButtonRestart": "Reiniciar",
"RecordingCancelled": "Grava\u00e7\u00e3o cancelada.",
"RecordingScheduled": "Grava\u00e7\u00e3o agendada.",
"SeriesRecordingScheduled": "Grava\u00e7\u00e3o de s\u00e9rie agendada.",
@ -248,9 +248,11 @@
"PleaseEnterNameOrId": "Por favor, digite um nome ou um id externo.",
"MessageItemSaved": "Item salvo.",
"SearchResults": "Resultados da Busca",
"SyncToOtherDevice": "Sync to other device",
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
"SyncToOtherDevice": "Sincronizar para outro dispositivo",
"MakeAvailableOffline": "Disponibilizar offline",
"ServerNameIsRestarting": "Servidor Emby - {0} est\u00e1 reiniciando.",
"ServerNameIsShuttingDown": "Servidor Emby - {0} est\u00e1 desligando.",
"HeaderDeleteItems": "Apagar Itens",
"ConfirmDeleteItems": "Apagar estes itens ir\u00e1 remov\u00ea-los do sistema de arquivos e da biblioteca de m\u00eddia. Tem certeza que deseja continuar?",
"PleaseRestartServerName": "Por favor reinicie o Servidor Emby - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -24,7 +24,7 @@
"ButtonOk": "\u041e\u041a",
"ButtonCancel": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c",
"ButtonGotIt": "\u041f\u043e\u043d\u044f\u0442\u043d\u043e",
"ButtonRestart": "Restart",
"ButtonRestart": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c",
"RecordingCancelled": "\u0417\u0430\u043f\u0438\u0441\u044c \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430.",
"RecordingScheduled": "\u0437\u0430\u043f\u0438\u0441\u044c \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430.",
"SeriesRecordingScheduled": "\u0417\u0430\u043f\u0438\u0441\u044c \u0441\u0435\u0440\u0438\u0430\u043b\u0430 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430.",
@ -250,7 +250,9 @@
"SearchResults": "\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430",
"SyncToOtherDevice": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e\u043c",
"MakeAvailableOffline": "\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
"ServerNameIsRestarting": "Emby Server - {0} \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f.",
"ServerNameIsShuttingDown": "Emby Server - {0} \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -252,5 +252,7 @@
"MakeAvailableOffline": "Make available offline",
"ServerNameIsRestarting": "Emby Server - {0} is restarting.",
"ServerNameIsShuttingDown": "Emby Server - {0} is shutting down.",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"PleaseRestartServerName": "Please restart Emby Server - {0}."
}

View file

@ -117,7 +117,11 @@
var itemHtml = '';
var tagName = layoutManager.tv ? 'button' : 'div';
var className = layoutManager.tv && s.Path ? 'listItem listItem-focusscale btnDelete' : 'listItem';
var className = layoutManager.tv && s.Path ? 'listItem btnDelete' : 'listItem';
if (layoutManager.tv) {
className += ' listItem-focusscale listItem-button';
}
className += ' listItem-noborder';
@ -236,6 +240,9 @@
var tagName = layoutManager.tv ? 'button' : 'div';
var className = layoutManager.tv ? 'listItem btnOptions' : 'listItem';
if (layoutManager.tv) {
className += ' listItem-focusscale listItem-button';
}
html += '<' + tagName + ' class="' + className + '" data-subid="' + result.Id + '">';

View file

@ -32,14 +32,14 @@
"iron-component-page": "polymerElements/iron-component-page#^1.1.6"
},
"private": true,
"homepage": "https://github.com/Polymer/polymer",
"homepage": "https://github.com/polymer/polymer",
"_release": "1.6.1",
"_resolution": {
"type": "version",
"tag": "v1.6.1",
"commit": "1f197d9d7874b1e5808b2a5c26f34446a7d912fc"
},
"_source": "git://github.com/Polymer/polymer.git",
"_source": "git://github.com/polymer/polymer.git",
"_target": "^1.1.0",
"_originalSource": "Polymer/polymer"
"_originalSource": "polymer/polymer"
}

View file

@ -20,13 +20,13 @@
<div class="dockedtabs-tab-button-foreground emby-button-foreground"><i class="dockedtabs-tab-button-icon md-icon">home</i><div>Home</div></div>\
</button>\
<button is="emby-button" class="dockedtabs-tab-button emby-tab-button" data-index="1">\
<div class="dockedtabs-tab-button-foreground emby-button-foreground"><i class="dockedtabs-tab-button-icon md-icon">dvr</i><div>Live TV</div></div>\
<div class="dockedtabs-tab-button-foreground emby-button-foreground"><i class="dockedtabs-tab-button-icon md-icon">dvr</i><div>Libraries</div></div>\
</button>\
<button is="emby-button" class="dockedtabs-tab-button emby-tab-button homeFavoritesTab" data-index="2">\
<div class="dockedtabs-tab-button-foreground emby-button-foreground"><i class="dockedtabs-tab-button-icon md-icon">favorite</i><div>Favorites</div></div>\
</button>\
<button is="emby-button" class="dockedtabs-tab-button emby-tab-button" data-index="3">\
<div class="dockedtabs-tab-button-foreground emby-button-foreground"><i class="dockedtabs-tab-button-icon md-icon">playlist_play</i><div>Now Playing</div></div>\
<div class="dockedtabs-tab-button-foreground emby-button-foreground"><i class="dockedtabs-tab-button-icon md-icon">file_download</i><div>Downloads</div></div>\
</button>\
<button is="emby-button" class="dockedtabs-tab-button emby-tab-button" data-index="3">\
<div class="dockedtabs-tab-button-foreground emby-button-foreground"><i class="dockedtabs-tab-button-icon md-icon">menu</i><div>More</div></div>\

View file

@ -0,0 +1,333 @@
define(['serverNotifications', 'events', 'loading', 'connectionManager', 'imageLoader', 'dom', 'globalize', 'listViewStyle'], function (serverNotifications, events, loading, connectionManager, imageLoader, dom, globalize) {
function onSyncJobsUpdated(e, apiClient, data) {
var listInstance = this;
renderList(listInstance, data);
}
function refreshList(listInstance, jobs) {
for (var i = 0, length = jobs.length; i < length; i++) {
var job = jobs[i];
refreshJob(listInstance, job);
}
}
function cancelJob(listInstance, id) {
require(['confirm'], function (confirm) {
var msg = listInstance.options.isLocalSync ?
globalize.translate('ConfirmRemoveDownload') :
globalize.translate('CancelSyncJobConfirmation');
confirm(msg).then(function () {
loading.show();
var apiClient = getApiClient(listInstance);
apiClient.ajax({
url: apiClient.getUrl('Sync/Jobs/' + id),
type: 'DELETE'
}).then(function () {
fetchData(listInstance);
});
});
});
}
function refreshJob(listInstance, job) {
var listItem = listInstance.options.element.querySelector('.listItem[data-id=\'' + job.Id + '\']');
if (!listItem) {
return;
}
var progress = job.Progress || 0;
var statusIcon = listItem.querySelector('.statusIcon');
if (progress === 0) {
statusIcon.innerHTML = 'file_download';
statusIcon.classList.add('md-icon');
statusIcon.classList.remove('status-text-icon');
statusIcon.classList.add('zeroProgressStatus');
} else if (progress >= 100) {
statusIcon.innerHTML = 'file_download';
statusIcon.classList.add('md-icon');
statusIcon.classList.remove('status-text-icon');
statusIcon.classList.remove('zeroProgressStatus');
} else {
statusIcon.classList.remove('md-icon');
statusIcon.classList.remove('zeroProgressStatus');
statusIcon.classList.add('status-text-icon');
statusIcon.innerHTML = (Math.round(progress)) + '%';
}
}
function getSyncJobHtml(listInstance, job) {
var html = '';
html += '<div class="listItem" data-id="' + job.Id + '" data-status="' + job.Status + '">';
var progress = job.Progress || 0;
if (progress === 0) {
html += '<i class="md-icon listItemIcon statusIcon zeroProgressStatus">file_download</i>';
} else if (progress >= 100) {
html += '<i class="md-icon listItemIcon statusIcon">file_download</i>';
} else {
html += '<i class="listItemIcon statusIcon status-text-icon">' + (Math.round(progress)) + '%</i>';
}
var textLines = [];
if (job.ParentName) {
textLines.push(job.ParentName);
}
textLines.push(job.Name);
if (job.ItemCount == 1) {
textLines.push(globalize.translate('ValueItemCount', job.ItemCount));
} else {
textLines.push(globalize.translate('ValueItemCountPlural', job.ItemCount));
}
if (textLines >= 3) {
html += '<div class="listItemBody three-line">';
} else {
html += '<div class="listItemBody two-line">';
}
for (var i = 0, length = textLines.length; i < length; i++) {
if (i == 0) {
html += '<h3 class="listItemBodyText">';
html += textLines[i];
html += '</h3>';
} else {
html += '<div class="listItemBodyText secondary">';
html += textLines[i];
html += '</div>';
}
}
html += '</div>';
html += '<button type="button" is="paper-icon-button-light" class="btnJobMenu listItemButton"><i class="md-icon">more_vert</i></button>';
html += '</div>';
return html;
}
function renderList(listInstance, jobs) {
if ((new Date().getTime() - listInstance.lastDataLoad) < 60000) {
refreshList(listInstance, jobs);
return;
}
listInstance.lastDataLoad = new Date().getTime();
var html = '';
var lastTargetName = '';
var showTargetName = !listInstance.options.isLocalSync;
var hasOpenSection = false;
for (var i = 0, length = jobs.length; i < length; i++) {
var job = jobs[i];
if (showTargetName) {
var targetName = job.TargetName || 'Unknown';
if (targetName != lastTargetName) {
if (lastTargetName) {
html += '</div>';
html += '<br/>';
html += '<br/>';
html += '<br/>';
hasOpenSection = false;
}
lastTargetName = targetName;
html += '<div class="detailSectionHeader">';
html += '<div>' + targetName + '</div>';
html += '</div>';
html += '<div class="itemsContainer vertical-list">';
hasOpenSection = true;
}
}
html += getSyncJobHtml(listInstance, job);
}
if (hasOpenSection) {
html += '</div>';
}
var elem = listInstance.options.element;
elem.innerHTML = html;
imageLoader.lazyChildren(elem);
}
function fetchData(listInstance) {
listInstance.lastDataLoad = 0;
loading.show();
var options = {};
var apiClient = getApiClient(listInstance);
if (listInstance.options.userId) {
options.UserId = listInstance.options.userId;
}
if (listInstance.options.isLocalSync) {
options.TargetId = apiClient.deviceId();
}
return apiClient.getJSON(ApiClient.getUrl('Sync/Jobs', options)).then(function (response) {
renderList(listInstance, response.Items);
loading.hide();
});
}
function startListening(listInstance) {
var startParams = "0,1500";
var apiClient = getApiClient(listInstance);
if (listInstance.options.userId) {
startParams += "," + listInstance.options.userId;
}
if (listInstance.options.isLocalSync) {
startParams += "," + apiClient.deviceId();
}
if (apiClient.isWebSocketOpen()) {
apiClient.sendWebSocketMessage("SyncJobsStart", startParams);
}
}
function stopListening(listInstance) {
var apiClient = getApiClient(listInstance);
if (apiClient.isWebSocketOpen()) {
apiClient.sendWebSocketMessage("SyncJobsStop", "");
}
}
function getApiClient(listInstance) {
return connectionManager.getApiClient(listInstance.options.serverId);
}
function showJobMenu(listInstance, elem) {
var item = dom.parentWithClass(elem, 'listItem');
var jobId = item.getAttribute('data-id');
var status = item.getAttribute('data-status');
var menuItems = [];
if (status == 'Cancelled') {
menuItems.push({
name: globalize.translate('ButtonDelete'),
id: 'delete'
});
} else {
menuItems.push({
name: globalize.translate('ButtonCancelSyncJob'),
id: 'cancel'
});
}
require(['actionsheet'], function (actionsheet) {
actionsheet.show({
items: menuItems,
positionTo: elem,
callback: function (id) {
switch (id) {
case 'delete':
cancelJob(listInstance, jobId);
break;
case 'cancel':
cancelJob(listInstance, jobId);
break;
default:
break;
}
}
});
});
}
function onElementClick(e) {
var listInstance = this;
var btnJobMenu = dom.parentWithClass(e.target, 'btnJobMenu');
if (btnJobMenu) {
showJobMenu(this, btnJobMenu);
return;
}
var listItem = dom.parentWithClass(e.target, 'listItem');
if (listItem) {
var jobId = listItem.getAttribute('data-id');
// edit job
events.trigger(listInstance, 'jobedit', [jobId, listInstance.options.serverId]);
}
}
function syncJobList(options) {
this.options = options;
var onSyncJobsUpdatedHandler = onSyncJobsUpdated.bind(this);
this.onSyncJobsUpdatedHandler = null;
events.on(serverNotifications, 'SyncJobs', onSyncJobsUpdatedHandler);
var onClickHandler = onElementClick.bind(this);
options.element.addEventListener('click', onClickHandler);
this.onClickHandler = onClickHandler;
fetchData(this);
startListening(this);
}
syncJobList.prototype.destroy = function () {
stopListening(this);
this.options = null;
var onSyncJobsUpdatedHandler = this.onSyncJobsUpdatedHandler;
this.onSyncJobsUpdatedHandler = null;
events.off(serverNotifications, 'SyncJobs', onSyncJobsUpdatedHandler);
var onClickHandler = this.onClickHandler;
this.onClickHandler = null;
options.element.removeEventListener('click', onClickHandler);
};
return syncJobList;
});

View file

@ -56,10 +56,6 @@
vertical-align: middle;
}
.drawerContent {
padding-bottom: 100px;
}
.headerButton {
margin: 0 5px;
background-color: transparent;
@ -299,6 +295,10 @@ body:not(.dashboardDocument) .headerAppsButton {
display: none;
}
.mainDrawer-scrollContainer {
padding-bottom: 10vh;
}
@media all and (min-width: 640px) {
.mainDrawerPanel .viewMenuBarTabs {

View file

@ -1,4 +1,4 @@
<div id="editItemMetadataPage" data-role="page" class="page libraryPage metadataEditorPage noSecondaryNavPage" data-contextname="${HeaderMetadataManager}" data-require="scripts/editorsidebar,scripts/edititemmetadata">
<div id="editItemMetadataPage" data-role="page" class="page libraryPage metadataEditorPage noSecondaryNavPage" data-contextname="${MetadataManager}" data-require="scripts/editorsidebar,scripts/edititemmetadata">
<style>
#editItemMetadataPage .editMetadataForm {

View file

@ -7,7 +7,7 @@
<div class="backdropContainer"></div>
<div class="backgroundContainer"></div>
<div class="mainDrawerPanel">
<div class="mainDrawer hide"><div class="scrollContainer"></div></div>
<div class="mainDrawer hide"><div class="mainDrawer-scrollContainer scrollContainer"></div></div>
<div class="mainDrawerPanelContent">
<div class="skinHeader"></div>
<div class="mainAnimatedPages skinBody"></div>

View file

@ -1,8 +1,17 @@
<div id="mySyncActivityPage" data-role="page" class="page libraryPage syncActivityPage mySyncPage noSecondaryNavPage" data-contextname="${TitleSync}">
<style>
.status-text-icon {
font-size: 80%;
background-color: #444;
}
.zeroProgressStatus {
background-color: #444;
}
</style>
<div data-role="content">
<div class="supporterPromotionContainer" style="display:none;text-align: right;">
<div class="supporterPromotionContainer hide" style="text-align: right; position: static;">
<div class="customSupporterPromotion supporterPromotion inlineSupporterPromotion">
<button is="emby-button" type="button" class="raised accent block btnSyncSupporter">
<div class="mainText">

View file

@ -98,6 +98,99 @@
});
}
function renderPluginInfo(page, pkg, pluginSecurityInfo) {
if (AppInfo.isNativeApp) {
return;
}
require(['jQuery'], function ($) {
if (pkg.isPremium) {
$('.premiumPackage', page).show();
// Fill in registration info
var regStatus = "";
if (pkg.isRegistered) {
regStatus += "<p style='color:green;'>";
regStatus += Globalize.translate('MessageFeatureIncludedWithSupporter');
} else {
var expDateTime = new Date(pkg.expDate).getTime();
var nowTime = new Date().getTime();
if (expDateTime <= nowTime) {
regStatus += "<p style='color:red;'>";
regStatus += Globalize.translate('MessageTrialExpired');
} else if (expDateTime > new Date(1970, 1, 1).getTime()) {
regStatus += "<p style='color:blue;'>";
regStatus += Globalize.translate('MessageTrialWillExpireIn').replace('{0}', Math.round(expDateTime - nowTime) / (86400000));
}
}
regStatus += "</p>";
$('#regStatus', page).html(regStatus);
if (pluginSecurityInfo.IsMBSupporter) {
$('#regInfo', page).html(pkg.regInfo || "");
$('.premiumDescription', page).hide();
$('.supporterDescription', page).hide();
if (pkg.price > 0) {
$('.premiumHasPrice', page).show();
$('#featureId', page).val(pkg.featureId);
$('#featureName', page).val(pkg.name);
$('#amount', page).val(pkg.price);
$('#regPrice', page).html("<h3>" + Globalize.translate('ValuePriceUSD').replace('{0}', "$" + pkg.price.toFixed(2)) + "</h3>");
$('#ppButton', page).hide();
var url = "https://mb3admin.com/admin/service/user/getPayPalEmail?id=" + pkg.owner;
fetch(url).then(function (response) {
return response.json();
}).then(function (dev) {
if (dev.payPalEmail) {
$('#payPalEmail', page).val(dev.payPalEmail);
$('#ppButton', page).show();
}
});
} else {
// Supporter-only feature
$('.premiumHasPrice', page).hide();
}
} else {
if (pkg.price) {
$('.premiumDescription', page).show();
$('.supporterDescription', page).hide();
$('#regInfo', page).html("");
} else {
$('.premiumDescription', page).hide();
$('.supporterDescription', page).show();
$('#regInfo', page).html("");
}
$('#ppButton', page).hide();
}
} else {
$('.premiumPackage', page).hide();
}
});
}
function renderPackage(pkg, installedPlugins, pluginSecurityInfo, page) {
var installedPlugin = installedPlugins.filter(function (ip) {
@ -133,7 +226,7 @@
$('#developer', page).html(pkg.owner);
RegistrationServices.renderPluginInfo(page, pkg, pluginSecurityInfo);
renderPluginInfo(page, pkg, pluginSecurityInfo);
//Ratings and Reviews
var ratingHtml = '';

View file

@ -1,4 +1,4 @@
define(['imageLoader', 'layoutManager', 'viewManager', 'navdrawer', 'libraryBrowser', 'paper-icon-button-light', 'material-icons'], function (imageLoader, layoutManager, viewManager, navdrawer, libraryBrowser) {
define(['imageLoader', 'layoutManager', 'viewManager', 'navdrawer', 'libraryBrowser', 'apphost', 'paper-icon-button-light', 'material-icons'], function (imageLoader, layoutManager, viewManager, navdrawer, libraryBrowser, appHost) {
var navDrawerElement = document.querySelector('.mainDrawer');
var navDrawerScrollContainer = navDrawerElement.querySelector('.scrollContainer');
@ -296,7 +296,7 @@
html += '</div>';
html += '<a class="sidebarLink lnkMediaFolder lnkManageServer" data-itemid="dashboard" href="#"><i class="md-icon sidebarLinkIcon">dashboard</i><span class="sidebarLinkText">' + Globalize.translate('ButtonManageServer') + '</span></a>';
html += '<a class="sidebarLink lnkMediaFolder editorViewMenu" data-itemid="editor" onclick="return LibraryMenu.onLinkClicked(event, this);" href="edititemmetadata.html"><i class="md-icon sidebarLinkIcon">mode_edit</i><span class="sidebarLinkText">' + Globalize.translate('ButtonMetadataManager') + '</span></a>';
html += '<a class="sidebarLink lnkMediaFolder editorViewMenu" data-itemid="editor" onclick="return LibraryMenu.onLinkClicked(event, this);" href="edititemmetadata.html"><i class="md-icon sidebarLinkIcon">mode_edit</i><span class="sidebarLinkText">' + Globalize.translate('MetadataManager') + '</span></a>';
if (!browserInfo.mobile) {
html += '<a class="sidebarLink lnkMediaFolder" data-itemid="reports" onclick="return LibraryMenu.onLinkClicked(event, this);" href="reports.html"><i class="md-icon sidebarLinkIcon">insert_chart</i><span class="sidebarLinkText">' + Globalize.translate('ButtonReports') + '</span></a>';
@ -312,7 +312,9 @@
html += '<a class="sidebarLink lnkMediaFolder lnkMySettings" onclick="return LibraryMenu.onLinkClicked(event, this);" href="mypreferencesmenu.html?userId=' + user.localUser.Id + '"><i class="md-icon sidebarLinkIcon">settings</i><span class="sidebarLinkText">' + Globalize.translate('ButtonSettings') + '</span></a>';
}
html += '<a class="sidebarLink lnkMediaFolder lnkMySync" data-itemid="mysync" onclick="return LibraryMenu.onLinkClicked(event, this);" href="mysync.html"><i class="md-icon sidebarLinkIcon">sync</i><span class="sidebarLinkText">' + Globalize.translate('ButtonSync') + '</span></a>';
html += '<a class="sidebarLink lnkMediaFolder lnkManageOffline" data-itemid="manageoffline" onclick="return LibraryMenu.onLinkClicked(event, this);" href="mysync.html?mode=offline"><i class="md-icon sidebarLinkIcon">file_download</i><span class="sidebarLinkText">' + Globalize.translate('ManageOfflineDownloads') + '</span></a>';
html += '<a class="sidebarLink lnkMediaFolder lnkSyncToOtherDevices" data-itemid="syncotherdevices" onclick="return LibraryMenu.onLinkClicked(event, this);" href="mysync.html"><i class="md-icon sidebarLinkIcon">sync</i><span class="sidebarLinkText">' + Globalize.translate('SyncToOtherDevices') + '</span></a>';
if (Dashboard.isConnectMode()) {
html += '<a class="sidebarLink lnkMediaFolder" data-itemid="selectserver" onclick="return LibraryMenu.onLinkClicked(event, this);" href="selectserver.html?showuser=1"><i class="md-icon sidebarLinkIcon">wifi</i><span class="sidebarLinkText">' + Globalize.translate('ButtonSelectServer') + '</span></a>';
@ -447,15 +449,22 @@
if (!user) {
showBySelector('.lnkMySync', false);
showBySelector('.lnkManageOffline', false);
showBySelector('.lnkSyncToOtherDevices', false);
showBySelector('.userMenuOptions', false);
return;
}
if (user.Policy.EnableSync) {
showBySelector('.lnkMySync', true);
showBySelector('.lnkSyncToOtherDevices', true);
} else {
showBySelector('.lnkMySync', false);
showBySelector('.lnkSyncToOtherDevices', false);
}
if (user.Policy.EnableSync && appHost.supports('sync')) {
showBySelector('.lnkManageOffline', true);
} else {
showBySelector('.lnkManageOffline', false);
}
var userId = Dashboard.getCurrentUserId();
@ -788,7 +797,12 @@
else if (isReportsPage && itemId == 'reports') {
lnkMediaFolder.classList.add('selectedMediaFolder');
}
else if (isMySyncPage && itemId == 'mysync') {
else if (isMySyncPage && itemId == 'manageoffline') {
lnkMediaFolder.classList.add('selectedMediaFolder');
}
else if (isMySyncPage && itemId == 'syncotherdevices') {
lnkMediaFolder.classList.add('selectedMediaFolder');
}
else if (id && itemId == id) {
@ -816,33 +830,6 @@
return url;
}
function updateTabLinks(page) {
var elems = page.querySelectorAll('.scopedLibraryViewNav a');
var id = page.classList.contains('liveTvPage') || page.classList.contains('channelsPage') || page.classList.contains('metadataEditorPage') || page.classList.contains('reportsPage') || page.classList.contains('mySyncPage') || page.classList.contains('allLibraryPage') ?
'' :
getTopParentId() || '';
if (!id) {
return;
}
for (i = 0, length = elems.length; i < length; i++) {
var lnk = elems[i];
var src = lnk.href;
if (src.indexOf('#') != -1) {
continue;
}
src = replaceQueryString(src, 'topParentId', id);
lnk.href = src;
}
}
function onWebSocketMessage(e, data) {
var msg = data;
@ -909,7 +896,6 @@
setDrawerClass(page);
updateViewMenuBar(page);
updateTabLinks(page);
if (!e.detail.isRestored) {
// Scroll back up so in case vertical scroll was messed with

View file

@ -1,13 +1,9 @@
define(['appSettings'], function (appSettings) {
define(['appSettings', 'connectionManager'], function (appSettings, connectionManager) {
var syncPromise;
window.LocalSync = {
isSupported: function () {
return AppInfo.isNativeApp && Dashboard.capabilities().SupportsSync;
},
sync: function (options) {
if (syncPromise) {
@ -16,15 +12,13 @@
return new Promise(function (resolve, reject) {
require(['multiserversync'], function () {
require(['multiserversync'], function (MultiServerSync) {
options = options || {};
LocalSync.normalizeSyncOptions(options);
options.cameraUploadServers = appSettings.cameraUploadServers();
syncPromise = new MediaBrowser.MultiServerSync(ConnectionManager).sync(options).then(function () {
syncPromise = new MultiServerSync(connectionManager).sync(options).then(function () {
syncPromise = null;
resolve();
@ -38,10 +32,6 @@
});
},
normalizeSyncOptions: function (options) {
},
getSyncStatus: function () {
if (syncPromise != null) {

View file

@ -462,11 +462,11 @@
return;
}
requirejs(["registrationservices"], function () {
requirejs(["registrationservices"], function (registrationServices) {
self.playbackTimeLimitMs = null;
RegistrationServices.validateFeature('playback').then(fn, function () {
registrationServices.validateFeature('playback').then(fn, function () {
self.playbackTimeLimitMs = lockedTimeLimitMs;
startAutoStopTimer();

View file

@ -1,8 +1,42 @@
define(['loading', 'localsync'], function (loading) {
define(['loading', 'apphost', 'globalize', 'syncJobList', 'events', 'localsync', 'emby-button', 'paper-icon-button-light'], function (loading, appHost, globalize, syncJobList, events) {
function initSupporterInfo(view, params) {
view.querySelector('.btnSyncSupporter').addEventListener('click', function () {
requirejs(["registrationservices"], function (registrationServices) {
registrationServices.validateFeature('sync');
});
});
view.querySelector('.supporterPromotion .mainText').innerHTML = globalize.translate('HeaderSyncRequiresSupporterMembership');
var apiClient = ApiClient;
apiClient.getPluginSecurityInfo().then(function (regInfo) {
if (regInfo.IsMBSupporter) {
view.querySelector('.supporterPromotionContainer').classList.add('hide');
} else {
view.querySelector('.supporterPromotionContainer').classList.remove('hide');
}
}, function () {
view.querySelector('.supporterPromotionContainer').classList.remove('hide');
});
}
return function (view, params) {
var interval;
function isLocalSyncManagement() {
return appHost.supports('sync') && params.mode == 'offline';
}
function refreshSyncStatus(page) {
if (LocalSync.isSupported()) {
if (isLocalSyncManagement()) {
var status = LocalSync.getSyncStatus();
@ -19,7 +53,6 @@
else {
page.querySelector('.btnSyncNow').classList.remove('hide');
}
}
}
@ -32,15 +65,11 @@
refreshSyncStatus(page);
}
return function (view, params) {
var interval;
view.querySelector('.btnSyncNow').addEventListener('click', function () {
syncNow(view);
});
if (LocalSync.isSupported()) {
if (isLocalSyncManagement()) {
view.querySelector('.localSyncStatus').classList.remove('hide');
@ -48,18 +77,31 @@
view.querySelector('.localSyncStatus').classList.add('hide');
}
initSupporterInfo(view, params);
var mySyncJobList = new syncJobList({
isLocalSync: params.mode === 'offline',
serverId: ApiClient.serverId(),
userId: params.mode === 'offline' ? null : ApiClient.getCurrentUserId(),
element: view.querySelector('.syncActivity')
});
events.on(mySyncJobList, 'jobedit', function (e, jobId, serverId) {
Dashboard.navigate('mysyncjob.html?id=' + jobId);
});
view.addEventListener('viewbeforeshow', function () {
var page = this;
refreshSyncStatus(page);
refreshSyncStatus(view);
if (appHost.supports('sync')) {
interval = setInterval(function () {
refreshSyncStatus(page);
refreshSyncStatus(view);
}, 5000);
}
});
view.addEventListener('viewbeforehide', function () {
var page = this;
loading.hide();
@ -68,5 +110,10 @@
interval = null;
}
});
view.addEventListener('viewdestroy', function () {
mySyncJobList.destroy();
});
};
});

View file

@ -125,9 +125,12 @@
html += getPluginHtml(topPlugins[i], options, installedPlugins);
}
html += '</div>';
html += '<br/>';
html += '<br/>';
}
var hasOpenTag = false;
currentCategory = null;
if (options.showCategory === false) {
html += '<div class="itemsContainer vertical-wrap">';
@ -148,7 +151,6 @@
html += '</div>';
html += '<br/>';
html += '<br/>';
html += '<br/>';
}
html += '<div class="detailSectionHeader">' + category + '</div>';

View file

@ -188,96 +188,7 @@
});
}
window.RegistrationServices = {
renderPluginInfo: function (page, pkg, pluginSecurityInfo) {
require(['jQuery'], function ($) {
if (pkg.isPremium) {
$('.premiumPackage', page).show();
// Fill in registration info
var regStatus = "";
if (pkg.isRegistered) {
regStatus += "<p style='color:green;'>";
regStatus += Globalize.translate('MessageFeatureIncludedWithSupporter');
} else {
var expDateTime = new Date(pkg.expDate).getTime();
var nowTime = new Date().getTime();
if (expDateTime <= nowTime) {
regStatus += "<p style='color:red;'>";
regStatus += Globalize.translate('MessageTrialExpired');
} else if (expDateTime > new Date(1970, 1, 1).getTime()) {
regStatus += "<p style='color:blue;'>";
regStatus += Globalize.translate('MessageTrialWillExpireIn').replace('{0}', Math.round(expDateTime - nowTime) / (86400000));
}
}
regStatus += "</p>";
$('#regStatus', page).html(regStatus);
if (pluginSecurityInfo.IsMBSupporter) {
$('#regInfo', page).html(pkg.regInfo || "");
$('.premiumDescription', page).hide();
$('.supporterDescription', page).hide();
if (pkg.price > 0) {
$('.premiumHasPrice', page).show();
$('#featureId', page).val(pkg.featureId);
$('#featureName', page).val(pkg.name);
$('#amount', page).val(pkg.price);
$('#regPrice', page).html("<h3>" + Globalize.translate('ValuePriceUSD').replace('{0}', "$" + pkg.price.toFixed(2)) + "</h3>");
$('#ppButton', page).hide();
var url = "https://mb3admin.com/admin/service/user/getPayPalEmail?id=" + pkg.owner;
fetch(url).then(function (response) {
return response.json();
}).then(function (dev) {
if (dev.payPalEmail) {
$('#payPalEmail', page).val(dev.payPalEmail);
$('#ppButton', page).show();
}
});
} else {
// Supporter-only feature
$('.premiumHasPrice', page).hide();
}
} else {
if (pkg.price) {
$('.premiumDescription', page).show();
$('.supporterDescription', page).hide();
$('#regInfo', page).html("");
} else {
$('.premiumDescription', page).hide();
$('.supporterDescription', page).show();
$('#regInfo', page).html("");
}
$('#ppButton', page).hide();
}
} else {
$('.premiumPackage', page).hide();
}
});
},
return {
validateFeature: function (name) {
return new Promise(function (resolve, reject) {
@ -297,6 +208,4 @@
shell.openUrl('https://emby.media/premiere');
}
};
return window.RegistrationServices;
});

View file

@ -559,7 +559,7 @@ var Dashboard = {
pageIds: ['scheduledTasksPage', 'scheduledTaskPage'],
icon: 'schedule'
}, {
name: Globalize.translate('ButtonMetadataManager'),
name: Globalize.translate('MetadataManager'),
href: "edititemmetadata.html",
pageIds: [],
icon: 'mode_edit'
@ -1285,6 +1285,7 @@ var AppInfo = {};
define("libjass", [bowerPath + "/libjass/libjass.min", "css!" + bowerPath + "/libjass/libjass"], returnFirstDependency);
define("syncJobList", ["components/syncjoblist/syncjoblist"], returnFirstDependency);
define("appfooter", ["components/appfooter/appfooter"], returnFirstDependency);
define("dockedtabs", ["components/dockedtabs/dockedtabs"], returnFirstDependency);
define("directorybrowser", ["components/directorybrowser/directorybrowser"], returnFirstDependency);
@ -2326,7 +2327,7 @@ var AppInfo = {};
defineRoute({
path: '/mysync.html',
dependencies: ['scripts/syncactivity', 'scripts/taskbutton', 'emby-button'],
dependencies: [],
autoFocus: false,
transition: 'fade',
controller: 'scripts/mysync'
@ -2492,7 +2493,8 @@ var AppInfo = {};
defineRoute({
path: '/syncactivity.html',
dependencies: [],
autoFocus: false
autoFocus: false,
controller: 'scripts/syncactivity'
});
defineRoute({

View file

@ -195,7 +195,7 @@
//html += '</div>';
//html += '</div>';
$(elem).html(html);
elem.innerHTML = html;
$('#selectSyncTarget', elem).on('change', function () {
@ -303,7 +303,7 @@
var promise = dialogHelper.open(dlg);
renderForm({
elem: $('.formFields', dlg),
elem: dlg.querySelector('.formFields'),
dialogOptions: dialogOptions,
dialogOptionsFn: getTargetDialogOptionsFn(dialogOptionsQuery)
});

View file

@ -1,394 +1,4 @@
define(['jQuery', 'paper-icon-button-light', 'cardStyle'], function ($) {
function cancelJob(page, id) {
var msg = Globalize.translate('CancelSyncJobConfirmation');
require(['confirm'], function (confirm) {
confirm(msg, Globalize.translate('HeaderCancelSyncJob')).then(function () {
Dashboard.showLoadingMsg();
ApiClient.ajax({
url: ApiClient.getUrl('Sync/Jobs/' + id),
type: 'DELETE'
}).then(function () {
reloadData(page);
});
});
});
}
function getSyncStatusBanner(job) {
var opacity = '.85';
var background = 'rgba(204,51,51,' + opacity + ')';
var text = Globalize.translate('SyncJobStatus' + job.Status);
if (job.Status == 'Completed') {
background = 'rgba(82, 181, 75, ' + opacity + ')';
}
else if (job.Status == 'CompletedWithError') {
}
else if (job.Status == 'Queued') {
background = 'rgba(51, 136, 204, ' + opacity + ')';
}
else if (job.Status == 'ReadyToTransfer') {
background = 'rgba(51, 136, 204, ' + opacity + ')';
}
else if (job.Status == 'Transferring') {
background = 'rgba(72, 0, 255, ' + opacity + ')';
}
else if (job.Status == 'Converting') {
background = 'rgba(255, 106, 0, ' + opacity + ')';
}
var html = '';
html += '<div class="syncStatusBanner" data-status="' + job.Status + '" style="background-color:' + background + ';position:absolute;top:0;right:0;padding:.5em .5em; text-align:left;color: #fff; font-weight: 500; text-transform:uppercase; border-bottom-left-radius: 3px;">';
html += text;
html += '</div>';
return html;
}
function getSyncJobHtml(page, job, cardBoxCssClass, syncJobPage) {
var html = '';
html += "<div class='card squareCard scalableCard' data-id='" + job.Id + "' data-status='" + job.Status + "'>";
html += '<div class="' + cardBoxCssClass + '">';
html += '<div class="cardScalable">';
html += '<div class="cardPadder cardPadder-square"></div>';
syncJobPage += '?id=' + job.Id;
html += '<a class="cardContent" href="' + syncJobPage + '">';
var imgUrl;
var style = '';
if (job.PrimaryImageItemId) {
imgUrl = ApiClient.getScaledImageUrl(job.PrimaryImageItemId, {
type: "Primary",
width: 400,
tag: job.PrimaryImageTag
});
style = "background-position:center center;";
} else {
style = "background-color:#38c;background-position:center center;";
imgUrl = "css/images/items/detail/video.png";
}
html += '<div class="cardImage coveredCardImage lazy" data-src="' + imgUrl + '" style="' + style + '">';
var progress = job.Progress || 0;
var footerClass = 'cardFooter fullCardFooter lightCardFooter';
if (progress == 0 || progress >= 100) {
footerClass += ' hide';
}
html += '<div class="' + footerClass + '">';
html += "<div class='cardText cardProgress'>";
html += '<progress class="itemProgressBar" min="0" max="100" value="' + progress + '"></progress>';
html += "</div>";
html += "</div>";
html += "</div>";
html += getSyncStatusBanner(job);
// cardContent
html += "</a>";
// cardScalable
html += "</div>";
html += '<div class="cardFooter outerCardFooter">';
var textLines = [];
if (job.ParentName) {
textLines.push(job.ParentName);
}
textLines.push(job.Name);
if (job.ItemCount == 1) {
textLines.push(Globalize.translate('ValueItemCount', job.ItemCount));
} else {
textLines.push(Globalize.translate('ValueItemCountPlural', job.ItemCount));
}
if (!job.ParentName) {
textLines.push('&nbsp;');
}
html += '<div class="cardText" style="text-align:right; float:right;padding:0;">';
html += '<button type="button" is="paper-icon-button-light" class="btnJobMenu autoSize"><i class="md-icon">' + AppInfo.moreIcon.replace('-', '_') + '</i></button>';
html += "</div>";
for (var i = 0, length = textLines.length; i < length; i++) {
html += "<div class='cardText' style='margin-right:30px;'>";
html += textLines[i];
html += "</div>";
}
// cardFooter
html += "</div>";
// cardBox
html += "</div>";
// card
html += "</div>";
return html;
}
var lastDataLoad = 0;
function loadData(page, jobs) {
if ((new Date().getTime() - lastDataLoad) < 60000) {
refreshData(page, jobs);
return;
}
lastDataLoad = new Date().getTime();
var html = '';
var lastTargetName = '';
var cardBoxCssClass = 'cardBox visualCardBox';
var syncJobPage = 'syncjob.html';
var showTargetName = true;
if ($(page).hasClass('mySyncPage')) {
syncJobPage = 'mysyncjob.html';
showTargetName = !hasLocalSync();
}
var hasOpenSection = false;
for (var i = 0, length = jobs.length; i < length; i++) {
var job = jobs[i];
if (showTargetName) {
var targetName = job.TargetName || 'Unknown';
if (targetName != lastTargetName) {
if (lastTargetName) {
html += '</div>';
html += '<br/>';
html += '<br/>';
html += '<br/>';
hasOpenSection = false;
}
lastTargetName = targetName;
html += '<div class="detailSectionHeader">';
html += '<div>' + targetName + '</div>';
html += '</div>';
html += '<div class="itemsContainer vertical-wrap">';
hasOpenSection = true;
}
}
html += getSyncJobHtml(page, job, cardBoxCssClass, syncJobPage);
}
if (hasOpenSection) {
html += '</div>';
}
var elem = $('.syncActivity', page).html(html).lazyChildren();
$('.btnJobMenu', elem).on('click', function () {
showJobMenu(page, this);
});
if (!jobs.length) {
elem.html('<div style="padding:1em .25em;">' + Globalize.translate('MessageNoSyncJobsFound') + '</div>');
}
}
$.fn.lazyChildren = function () {
for (var i = 0, length = this.length; i < length; i++) {
ImageLoader.lazyChildren(this[i]);
}
return this;
};
function refreshData(page, jobs) {
for (var i = 0, length = jobs.length; i < length; i++) {
var job = jobs[i];
refreshJob(page, job);
}
}
function refreshJob(page, job) {
var card = page.querySelector('.card[data-id=\'' + job.Id + '\']');
if (!card) {
return;
}
var banner = card.querySelector('.syncStatusBanner');
if (banner.getAttribute('data-status') == job.Status) {
var elem = document.createElement('div');
elem.innerHTML = getSyncStatusBanner(job);
elem = elem.querySelector('.syncStatusBanner');
elem.parentNode.removeChild(elem);
banner.parentNode.replaceChild(elem, banner);
}
var progress = job.Progress || 0;
var cardFooter = card.querySelector('.cardFooter');
if (progress == 0 || progress >= 100) {
cardFooter.classList.add('hide');
}
else {
cardFooter.classList.remove('hide');
cardFooter.querySelector('.itemProgressBar').value = progress;
}
}
function showJobMenu(page, elem) {
var card = $(elem).parents('.card');
var jobId = card.attr('data-id');
var status = card.attr('data-status');
var menuItems = [];
if (status == 'Cancelled') {
menuItems.push({
name: Globalize.translate('ButtonDelete'),
id: 'delete'
});
} else {
menuItems.push({
name: Globalize.translate('ButtonCancelSyncJob'),
id: 'cancel'
});
}
require(['actionsheet'], function (actionsheet) {
actionsheet.show({
items: menuItems,
positionTo: elem,
callback: function (id) {
switch (id) {
case 'delete':
cancelJob(page, jobId);
break;
case 'cancel':
cancelJob(page, jobId);
break;
default:
break;
}
}
});
});
}
function hasLocalSync() {
return Dashboard.capabilities().SupportsSync;
}
function reloadData(page) {
lastDataLoad = 0;
Dashboard.showLoadingMsg();
var options = {};
Dashboard.getCurrentUser().then(function (user) {
if ($(page).hasClass('mySyncPage')) {
options.UserId = Dashboard.getCurrentUserId();
if (hasLocalSync()) {
options.TargetId = ApiClient.deviceId();
}
}
ApiClient.getJSON(ApiClient.getUrl('Sync/Jobs', options)).then(function (response) {
loadData(page, response.Items);
Dashboard.hideLoadingMsg();
});
});
}
function onWebSocketMessage(e, msg) {
var page = $($.mobile.activePage)[0];
if (msg.MessageType == "SyncJobs") {
var data = msg.Data;
if (hasLocalSync()) {
var targetId = ApiClient.deviceId();
data = data.filter(function (j) {
return j.TargetId == targetId;
});
}
loadData(page, data);
}
}
function startListening(page) {
var startParams = "0,1500";
if ($(page).hasClass('mySyncPage')) {
startParams += "," + Dashboard.getCurrentUserId();
}
if (ApiClient.isWebSocketOpen()) {
ApiClient.sendWebSocketMessage("SyncJobsStart", startParams);
}
}
function stopListening() {
if (ApiClient.isWebSocketOpen()) {
ApiClient.sendWebSocketMessage("SyncJobsStop", "");
}
}
define(['loading', 'apphost', 'globalize', 'syncJobList', 'events', 'localsync', 'emby-button', 'paper-icon-button-light'], function (loading, appHost, globalize, syncJobList, events) {
function getTabs() {
return [
@ -410,57 +20,49 @@
}];
}
$(document).on('pageinit', ".syncActivityPage", function () {
function initSupporterInfo(view, params) {
var page = this;
view.querySelector('.supporterPromotion .mainText').innerHTML = globalize.translate('HeaderSyncRequiresSupporterMembership');
$('.btnSyncSupporter', page).on('click', function () {
var apiClient = ApiClient;
apiClient.getPluginSecurityInfo().then(function (regInfo) {
requirejs(["registrationservices"], function () {
RegistrationServices.validateFeature('sync');
});
});
$('.supporterPromotion .mainText', page).html(Globalize.translate('HeaderSyncRequiresSupporterMembership'));
}).on('pageshow', ".syncActivityPage", function () {
if (this.id == 'syncActivityPage') {
LibraryMenu.setTabs('syncadmin', 0, getTabs);
}
var page = this;
Dashboard.getPluginSecurityInfo().then(function (pluginSecurityInfo) {
if (pluginSecurityInfo.IsMBSupporter) {
$('.supporterPromotionContainer', page).hide();
if (regInfo.IsMBSupporter) {
view.querySelector('.supporterPromotionContainer').classList.add('hide');
} else {
$('.supporterPromotionContainer', page).show();
view.querySelector('.supporterPromotionContainer').classList.remove('hide');
}
}, function () {
view.querySelector('.supporterPromotionContainer').classList.remove('hide');
});
}
return function (view, params) {
initSupporterInfo(view, params);
var mySyncJobList = new syncJobList({
isLocalSync: params.mode === 'offline',
serverId: ApiClient.serverId(),
userId: params.mode === 'offline' ? null : ApiClient.getCurrentUserId(),
element: view.querySelector('.syncActivity')
});
reloadData(page);
events.on(mySyncJobList, 'jobedit', function (e, jobId, serverId) {
// on here
$('.btnSync', page).taskButton({
mode: 'on',
progressElem: page.querySelector('.syncProgress'),
taskKey: 'SyncPrepare'
Dashboard.navigate('syncjob.html?id=' + jobId);
});
startListening(page);
Events.on(ApiClient, "websocketmessage", onWebSocketMessage);
view.addEventListener('viewshow', function () {
}).on('pagebeforehide', ".syncActivityPage", function () {
var page = this;
// off here
$('.btnSync', page).taskButton({
mode: 'off'
LibraryMenu.setTabs('syncadmin', 0, getTabs);
});
stopListening();
Events.off(ApiClient, "websocketmessage", onWebSocketMessage);
view.addEventListener('viewdestroy', function () {
mySyncJobList.destroy();
});
};
});

View file

@ -18,7 +18,7 @@
require(['syncDialog'], function (syncDialog) {
syncDialog.renderForm({
elem: $('.formFields', page),
elem: page.querySelector('.formFields'),
dialogOptions: dialogOptions,
dialogOptionsFn: getTargetDialogOptionsFn(dialogOptions),
showName: true,

View file

@ -880,7 +880,6 @@
"OptionNone": "None",
"HeaderLiveTv": "Live TV",
"HeaderReports": "Reports",
"HeaderMetadataManager": "Metadata Manager",
"HeaderSettings": "Settings",
"OptionDefaultSort": "Default",
"OptionCommunityMostWatchedSort": "Most Watched",
@ -1739,7 +1738,7 @@
"MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.",
"ButtonDashboard": "Dashboard",
"ButtonReports": "Reports",
"ButtonMetadataManager": "Metadata Manager",
"MetadataManager": "Metadata Manager",
"HeaderTime": "Time",
"LabelAddedOnDate": "Added {0}",
"ButtonStart": "Start",
@ -2314,5 +2313,7 @@
"EnablePhotos": "Enable photos",
"EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.",
"MakeAvailableOffline": "Make available offline",
"ConfirmRemoveDownload": "Remove download?"
"ConfirmRemoveDownload": "Remove download?",
"SyncToOtherDevices": "Sync to other devices",
"ManageOfflineDownloads": "Manage offline downloads"
}

View file

@ -1,4 +1,4 @@
<div id="syncActivityPage" data-role="page" class="page type-interior syncConfigurationPage syncActivityPage withTabs fullWidthContent" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Sync" data-require="scripts/syncactivity,scripts/taskbutton,emby-button">
<div id="syncActivityPage" data-role="page" class="page type-interior syncConfigurationPage syncActivityPage withTabs fullWidthContent" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Sync">
<div data-role="content">
<div class="content-primary">