import $ from 'jQuery'; import taskButton from 'scripts/taskbutton'; import loading from 'loading'; import libraryMenu from 'libraryMenu'; import globalize from 'globalize'; import dom from 'dom'; import imageHelper from 'scripts/imagehelper'; import 'cardStyle'; import 'emby-itemrefreshindicator'; /* eslint-disable indent */ function addVirtualFolder(page) { import('medialibrarycreator').then(({default: medialibrarycreator}) => { new medialibrarycreator({ collectionTypeOptions: getCollectionTypeOptions().filter(function (f) { return !f.hidden; }), refresh: shouldRefreshLibraryAfterChanges(page) }).then(function (hasChanges) { if (hasChanges) { reloadLibrary(page); } }); }); } function editVirtualFolder(page, virtualFolder) { import('medialibraryeditor').then(({default: medialibraryeditor}) => { new medialibraryeditor({ refresh: shouldRefreshLibraryAfterChanges(page), library: virtualFolder }).then(function (hasChanges) { if (hasChanges) { reloadLibrary(page); } }); }); } function deleteVirtualFolder(page, virtualFolder) { let msg = globalize.translate('MessageAreYouSureYouWishToRemoveMediaFolder'); if (virtualFolder.Locations.length) { msg += '

' + globalize.translate('MessageTheFollowingLocationWillBeRemovedFromLibrary') + '

'; msg += virtualFolder.Locations.join('
'); } import('confirm').then(({default: confirm}) => { confirm({ text: msg, title: globalize.translate('HeaderRemoveMediaFolder'), confirmText: globalize.translate('Delete'), primary: 'delete' }).then(function () { const refreshAfterChange = shouldRefreshLibraryAfterChanges(page); ApiClient.removeVirtualFolder(virtualFolder.Name, refreshAfterChange).then(function () { reloadLibrary(page); }); }); }); } function refreshVirtualFolder(page, virtualFolder) { import('refreshDialog').then(({default: refreshDialog}) => { new refreshDialog({ itemIds: [virtualFolder.ItemId], serverId: ApiClient.serverId(), mode: 'scan' }).show(); }); } function renameVirtualFolder(page, virtualFolder) { import('prompt').then(({default: prompt}) => { prompt({ label: globalize.translate('LabelNewName'), confirmText: globalize.translate('ButtonRename') }).then(function (newName) { if (newName && newName != virtualFolder.Name) { const refreshAfterChange = shouldRefreshLibraryAfterChanges(page); ApiClient.renameVirtualFolder(virtualFolder.Name, newName, refreshAfterChange).then(function () { reloadLibrary(page); }); } }); }); } function showCardMenu(page, elem, virtualFolders) { const card = dom.parentWithClass(elem, 'card'); const index = parseInt(card.getAttribute('data-index')); const virtualFolder = virtualFolders[index]; const menuItems = []; menuItems.push({ name: globalize.translate('ButtonEditImages'), id: 'editimages', icon: 'photo' }); menuItems.push({ name: globalize.translate('ManageLibrary'), id: 'edit', icon: 'folder_open' }); menuItems.push({ name: globalize.translate('ButtonRemove'), id: 'delete', icon: 'delete' }); menuItems.push({ name: globalize.translate('ButtonRename'), id: 'rename', icon: 'mode_edit' }); menuItems.push({ name: globalize.translate('ScanLibrary'), id: 'refresh', icon: 'refresh' }); import('actionsheet').then(({default: actionsheet}) => { actionsheet.show({ items: menuItems, positionTo: elem, callback: function (resultId) { switch (resultId) { case 'edit': editVirtualFolder(page, virtualFolder); break; case 'editimages': editImages(page, virtualFolder); break; case 'rename': renameVirtualFolder(page, virtualFolder); break; case 'delete': deleteVirtualFolder(page, virtualFolder); break; case 'refresh': refreshVirtualFolder(page, virtualFolder); } } }); }); } function reloadLibrary(page) { loading.show(); ApiClient.getVirtualFolders().then(function (result) { reloadVirtualFolders(page, result); }); } function shouldRefreshLibraryAfterChanges(page) { return 'mediaLibraryPage' === page.id; } function reloadVirtualFolders(page, virtualFolders) { let html = ''; virtualFolders.push({ Name: globalize.translate('ButtonAddMediaLibrary'), icon: 'add_circle', Locations: [], showType: false, showLocations: false, showMenu: false, showNameWithIcon: false }); for (let i = 0; i < virtualFolders.length; i++) { const virtualFolder = virtualFolders[i]; html += getVirtualFolderHtml(page, virtualFolder, i); } const divVirtualFolders = page.querySelector('#divVirtualFolders'); divVirtualFolders.innerHTML = html; divVirtualFolders.classList.add('itemsContainer'); divVirtualFolders.classList.add('vertical-wrap'); $('.btnCardMenu', divVirtualFolders).on('click', function () { showCardMenu(page, this, virtualFolders); }); divVirtualFolders.querySelector('#addLibrary').addEventListener('click', function () { addVirtualFolder(page); }); $('.editLibrary', divVirtualFolders).on('click', function () { const card = $(this).parents('.card')[0]; const index = parseInt(card.getAttribute('data-index')); const virtualFolder = virtualFolders[index]; if (virtualFolder.ItemId) { editVirtualFolder(page, virtualFolder); } }); loading.hide(); } function editImages(page, virtualFolder) { import('imageEditor').then(({default: imageEditor}) => { imageEditor.show({ itemId: virtualFolder.ItemId, serverId: ApiClient.serverId() }).then(function () { reloadLibrary(page); }); }); } function getLink(text, url) { return globalize.translate(text, '', ''); } function getCollectionTypeOptions() { return [{ name: '', value: '' }, { name: globalize.translate('FolderTypeMovies'), value: 'movies', message: getLink('MovieLibraryHelp', 'https://docs.jellyfin.org/general/server/media/movies.html') }, { name: globalize.translate('FolderTypeMusic'), value: 'music', message: getLink('MusicLibraryHelp', 'https://docs.jellyfin.org/general/server/media/music.html') }, { name: globalize.translate('FolderTypeTvShows'), value: 'tvshows', message: getLink('TvLibraryHelp', 'https://docs.jellyfin.org/general/server/media/shows.html') }, { name: globalize.translate('FolderTypeBooks'), value: 'books', message: getLink('BookLibraryHelp', 'https://docs.jellyfin.org/general/server/media/books.html') }, { name: globalize.translate('OptionHomeVideos'), value: 'homevideos' }, { name: globalize.translate('FolderTypeMusicVideos'), value: 'musicvideos' }, { name: globalize.translate('FolderTypeUnset'), value: 'mixed', message: globalize.translate('MessageUnsetContentHelp') }]; } function getVirtualFolderHtml(page, virtualFolder, index) { let html = ''; let style = ''; if (page.classList.contains('wizardPage')) { style += 'min-width:33.3%;'; } if (virtualFolder.Locations.length == 0) { html += '
'; } else { html += '
'; } html += '
'; html += '
'; html += '
'; html += '
'; let imgUrl = ''; if (virtualFolder.PrimaryImageItemId) { imgUrl = ApiClient.getScaledImageUrl(virtualFolder.PrimaryImageItemId, { maxWidth: Math.round(dom.getScreenWidth() * 0.40), type: 'Primary' }); } let hasCardImageContainer; if (imgUrl) { html += '
"; hasCardImageContainer = true; } else if (!virtualFolder.showNameWithIcon) { html += '
'; html += ''; hasCardImageContainer = true; } if (hasCardImageContainer) { html += '
'; html += '
'; html += '
'; html += '
'; } if (!imgUrl && virtualFolder.showNameWithIcon) { html += '

'; html += ''; if (virtualFolder.showNameWithIcon) { html += '
'; html += virtualFolder.Name; html += '
'; } html += '

'; } html += '
'; html += '
'; html += '
'; // always show menu unless explicitly hidden if (virtualFolder.showMenu !== false) { html += '
'; html += ''; html += '
'; } html += "
"; if (virtualFolder.showNameWithIcon) { html += ' '; } else { html += virtualFolder.Name; } html += '
'; let typeName = getCollectionTypeOptions().filter(function (t) { return t.value == virtualFolder.CollectionType; })[0]; typeName = typeName ? typeName.name : globalize.translate('FolderTypeUnset'); html += "
"; if (virtualFolder.showType === false) { html += ' '; } else { html += typeName; } html += '
'; if (virtualFolder.showLocations === false) { html += "
"; html += ' '; html += '
'; } else if (virtualFolder.Locations.length && virtualFolder.Locations.length === 1) { html += "
"; html += virtualFolder.Locations[0]; html += '
'; } else { html += "
"; html += globalize.translate('NumLocationsValue', virtualFolder.Locations.length); html += '
'; } html += '
'; html += '
'; html += '
'; return html; } function getTabs() { return [{ href: 'library.html', name: globalize.translate('HeaderLibraries') }, { href: 'librarydisplay.html', name: globalize.translate('TabDisplay') }, { href: 'metadataimages.html', name: globalize.translate('TabMetadata') }, { href: 'metadatanfo.html', name: globalize.translate('TabNfoSettings') }]; } window.WizardLibraryPage = { next: function () { Dashboard.navigate('wizardsettings.html'); } }; pageClassOn('pageshow', 'mediaLibraryPage', function () { reloadLibrary(this); }); pageIdOn('pageshow', 'mediaLibraryPage', function () { libraryMenu.setTabs('librarysetup', 0, getTabs); const page = this; taskButton({ mode: 'on', progressElem: page.querySelector('.refreshProgress'), taskKey: 'RefreshLibrary', button: page.querySelector('.btnRefresh') }); }); pageIdOn('pagebeforehide', 'mediaLibraryPage', function () { const page = this; taskButton({ mode: 'off', progressElem: page.querySelector('.refreshProgress'), taskKey: 'RefreshLibrary', button: page.querySelector('.btnRefresh') }); }); /* eslint-enable indent */