From f96166657d07e9d4d10cf2dbb1b0f90bc429ed71 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Mon, 1 May 2023 10:04:13 -0400 Subject: [PATCH 1/3] Move remaining router components --- src/RootApp.tsx | 2 +- src/components/ConnectionRequired.tsx | 2 +- src/components/alert.js | 2 +- src/components/cardbuilder/cardBuilder.js | 2 +- .../collectionEditor/collectionEditor.js | 2 +- .../common/GenresItemsContainer.tsx | 2 +- src/components/confirm/confirm.js | 2 +- src/components/dialogHelper/dialogHelper.js | 2 +- src/components/groupedcards.js | 2 +- src/components/homesections/homesections.js | 2 +- src/components/itemContextMenu.js | 2 +- src/components/mediainfo/mediainfo.js | 2 +- .../metadataEditor/metadataEditor.js | 2 +- src/components/nowPlayingBar/nowPlayingBar.js | 2 +- .../playback/playerSelectionMenu.js | 2 +- .../playlisteditor/playlisteditor.js | 2 +- src/components/pluginManager.js | 2 +- src/components/remotecontrol/remotecontrol.js | 2 +- src/components/{ => router}/HistoryRouter.tsx | 0 src/components/{ => router}/appRouter.js | 24 +++++++++---------- src/components/search/SearchSuggestions.tsx | 2 +- src/components/shortcuts.js | 2 +- src/controllers/favorites.js | 2 +- src/controllers/itemDetails/index.js | 2 +- src/controllers/movies/moviegenres.js | 2 +- src/controllers/playback/video/index.js | 2 +- src/controllers/session/addServer/index.js | 2 +- src/controllers/session/selectServer/index.js | 2 +- src/controllers/shows/tvgenres.js | 2 +- src/elements/emby-button/LinkButton.tsx | 2 +- src/elements/emby-button/emby-button.js | 2 +- src/index.jsx | 2 +- src/plugins/comicsPlayer/plugin.js | 2 +- src/plugins/htmlVideoPlayer/plugin.js | 2 +- src/plugins/pdfPlayer/plugin.js | 2 +- src/plugins/youtubePlayer/plugin.js | 2 +- src/scripts/deleteHelper.js | 2 +- src/scripts/inputManager.js | 2 +- src/scripts/libraryMenu.js | 2 +- src/scripts/serverNotifications.js | 2 +- src/utils/dashboard.js | 2 +- 41 files changed, 51 insertions(+), 51 deletions(-) rename src/components/{ => router}/HistoryRouter.tsx (100%) rename src/components/{ => router}/appRouter.js (97%) diff --git a/src/RootApp.tsx b/src/RootApp.tsx index 018ac7c10a..0159b155ab 100644 --- a/src/RootApp.tsx +++ b/src/RootApp.tsx @@ -3,7 +3,7 @@ import { History } from '@remix-run/router'; import React from 'react'; import StableApp from './apps/stable/App'; -import { HistoryRouter } from './components/HistoryRouter'; +import { HistoryRouter } from './components/router/HistoryRouter'; import { ApiProvider } from './hooks/useApi'; const ExperimentalApp = loadable(() => import('./apps/experimental/App')); diff --git a/src/components/ConnectionRequired.tsx b/src/components/ConnectionRequired.tsx index 59e680e219..c61e7c52ba 100644 --- a/src/components/ConnectionRequired.tsx +++ b/src/components/ConnectionRequired.tsx @@ -3,7 +3,7 @@ import { Outlet, useLocation, useNavigate } from 'react-router-dom'; import type { ConnectResponse } from 'jellyfin-apiclient'; import alert from './alert'; -import { appRouter } from './appRouter'; +import { appRouter } from './router/appRouter'; import Loading from './loading/LoadingComponent'; import ServerConnections from './ServerConnections'; import globalize from '../scripts/globalize'; diff --git a/src/components/alert.js b/src/components/alert.js index bd6ff7187c..6e654e9f3c 100644 --- a/src/components/alert.js +++ b/src/components/alert.js @@ -1,4 +1,4 @@ -import { appRouter } from './appRouter'; +import { appRouter } from './router/appRouter'; import browser from '../scripts/browser'; import dialog from './dialog/dialog'; import globalize from '../scripts/globalize'; diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 0271a5084b..17d90b0826 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -22,7 +22,7 @@ import './card.scss'; import '../../elements/emby-button/paper-icon-button-light'; import '../guide/programs.scss'; import ServerConnections from '../ServerConnections'; -import { appRouter } from '../appRouter'; +import { appRouter } from '../router/appRouter'; const enableFocusTransform = !browser.slow && !browser.edge; diff --git a/src/components/collectionEditor/collectionEditor.js b/src/components/collectionEditor/collectionEditor.js index efcd7f86e7..455f5f25ea 100644 --- a/src/components/collectionEditor/collectionEditor.js +++ b/src/components/collectionEditor/collectionEditor.js @@ -3,7 +3,7 @@ import dom from '../../scripts/dom'; import dialogHelper from '../dialogHelper/dialogHelper'; import loading from '../loading/loading'; import layoutManager from '../layoutManager'; -import { appRouter } from '../appRouter'; +import { appRouter } from '../router/appRouter'; import globalize from '../../scripts/globalize'; import '../../elements/emby-button/emby-button'; import '../../elements/emby-button/paper-icon-button-light'; diff --git a/src/components/common/GenresItemsContainer.tsx b/src/components/common/GenresItemsContainer.tsx index b6a06bb26a..796b6fa119 100644 --- a/src/components/common/GenresItemsContainer.tsx +++ b/src/components/common/GenresItemsContainer.tsx @@ -5,7 +5,7 @@ import type { BaseItemDtoQueryResult } from '@jellyfin/sdk/lib/generated-client' import escapeHTML from 'escape-html'; import React, { FC, useCallback, useEffect, useRef } from 'react'; -import { appRouter } from '../appRouter'; +import { appRouter } from '../router/appRouter'; import cardBuilder from '../cardbuilder/cardBuilder'; import layoutManager from '../layoutManager'; import lazyLoader from '../lazyLoader/lazyLoaderIntersectionObserver'; diff --git a/src/components/confirm/confirm.js b/src/components/confirm/confirm.js index a96910e16a..7ab5ff219a 100644 --- a/src/components/confirm/confirm.js +++ b/src/components/confirm/confirm.js @@ -1,4 +1,4 @@ -import { appRouter } from '../appRouter'; +import { appRouter } from '../router/appRouter'; import browser from '../../scripts/browser'; import dialog from '../dialog/dialog'; import globalize from '../../scripts/globalize'; diff --git a/src/components/dialogHelper/dialogHelper.js b/src/components/dialogHelper/dialogHelper.js index 5819f0a755..b03ff9052c 100644 --- a/src/components/dialogHelper/dialogHelper.js +++ b/src/components/dialogHelper/dialogHelper.js @@ -1,4 +1,4 @@ -import { history } from '../appRouter'; +import { history } from '../router/appRouter'; import focusManager from '../focusManager'; import browser from '../../scripts/browser'; import layoutManager from '../layoutManager'; diff --git a/src/components/groupedcards.js b/src/components/groupedcards.js index a2f7b757e0..9167dc3ec2 100644 --- a/src/components/groupedcards.js +++ b/src/components/groupedcards.js @@ -1,5 +1,5 @@ import dom from '../scripts/dom'; -import { appRouter } from './appRouter'; +import { appRouter } from './router/appRouter'; import Dashboard from '../utils/dashboard'; import ServerConnections from './ServerConnections'; diff --git a/src/components/homesections/homesections.js b/src/components/homesections/homesections.js index 5cf83ced94..42390c65d7 100644 --- a/src/components/homesections/homesections.js +++ b/src/components/homesections/homesections.js @@ -3,7 +3,7 @@ import cardBuilder from '../cardbuilder/cardBuilder'; import layoutManager from '../layoutManager'; import imageLoader from '../images/imageLoader'; import globalize from '../../scripts/globalize'; -import { appRouter } from '../appRouter'; +import { appRouter } from '../router/appRouter'; import imageHelper from '../../scripts/imagehelper'; import '../../elements/emby-button/paper-icon-button-light'; import '../../elements/emby-itemscontainer/emby-itemscontainer'; diff --git a/src/components/itemContextMenu.js b/src/components/itemContextMenu.js index 1e33d66af7..539d2fc965 100644 --- a/src/components/itemContextMenu.js +++ b/src/components/itemContextMenu.js @@ -4,7 +4,7 @@ import dom from '../scripts/dom'; import globalize from '../scripts/globalize'; import actionsheet from './actionSheet/actionSheet'; import { appHost } from './apphost'; -import { appRouter } from './appRouter'; +import { appRouter } from './router/appRouter'; import itemHelper from './itemHelper'; import { playbackManager } from './playback/playbackmanager'; import ServerConnections from './ServerConnections'; diff --git a/src/components/mediainfo/mediainfo.js b/src/components/mediainfo/mediainfo.js index 9f5c366083..ec908d0d0f 100644 --- a/src/components/mediainfo/mediainfo.js +++ b/src/components/mediainfo/mediainfo.js @@ -1,7 +1,7 @@ import escapeHtml from 'escape-html'; import datetime from '../../scripts/datetime'; import globalize from '../../scripts/globalize'; -import { appRouter } from '../appRouter'; +import { appRouter } from '../router/appRouter'; import itemHelper from '../itemHelper'; import indicators from '../indicators/indicators'; import 'material-design-icons-iconfont'; diff --git a/src/components/metadataEditor/metadataEditor.js b/src/components/metadataEditor/metadataEditor.js index 3aeaee63a3..422f3c964d 100644 --- a/src/components/metadataEditor/metadataEditor.js +++ b/src/components/metadataEditor/metadataEditor.js @@ -20,7 +20,7 @@ import '../../styles/flexstyles.scss'; import './style.scss'; import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; -import { appRouter } from '../appRouter'; +import { appRouter } from '../router/appRouter'; import template from './metadataEditor.template.html'; let currentContext; diff --git a/src/components/nowPlayingBar/nowPlayingBar.js b/src/components/nowPlayingBar/nowPlayingBar.js index e977f458f9..d0fbd7e6b4 100644 --- a/src/components/nowPlayingBar/nowPlayingBar.js +++ b/src/components/nowPlayingBar/nowPlayingBar.js @@ -15,7 +15,7 @@ import appFooter from '../appFooter/appFooter'; import itemShortcuts from '../shortcuts'; import './nowPlayingBar.scss'; import '../../elements/emby-slider/emby-slider'; -import { appRouter } from '../appRouter'; +import { appRouter } from '../router/appRouter'; let currentPlayer; let currentPlayerSupportedCommands = []; diff --git a/src/components/playback/playerSelectionMenu.js b/src/components/playback/playerSelectionMenu.js index 17dcb06819..18c6fe7cdc 100644 --- a/src/components/playback/playerSelectionMenu.js +++ b/src/components/playback/playerSelectionMenu.js @@ -4,7 +4,7 @@ import browser from '../../scripts/browser'; import loading from '../loading/loading'; import { playbackManager } from '../playback/playbackmanager'; import { pluginManager } from '../pluginManager'; -import { appRouter } from '../appRouter'; +import { appRouter } from '../router/appRouter'; import globalize from '../../scripts/globalize'; import { appHost } from '../apphost'; import { enable, isEnabled, supported } from '../../scripts/autocast'; diff --git a/src/components/playlisteditor/playlisteditor.js b/src/components/playlisteditor/playlisteditor.js index 91c11010be..f0fef99aec 100644 --- a/src/components/playlisteditor/playlisteditor.js +++ b/src/components/playlisteditor/playlisteditor.js @@ -6,7 +6,7 @@ import layoutManager from '../layoutManager'; import { playbackManager } from '../playback/playbackmanager'; import { pluginManager } from '../pluginManager'; import * as userSettings from '../../scripts/settings/userSettings'; -import { appRouter } from '../appRouter'; +import { appRouter } from '../router/appRouter'; import globalize from '../../scripts/globalize'; import { PluginType } from '../../types/plugin.ts'; diff --git a/src/components/pluginManager.js b/src/components/pluginManager.js index c2b67e4213..d8aea5293c 100644 --- a/src/components/pluginManager.js +++ b/src/components/pluginManager.js @@ -4,7 +4,7 @@ import loading from './loading/loading'; import appSettings from '../scripts/settings/appSettings'; import { playbackManager } from './playback/playbackmanager'; import { appHost } from '../components/apphost'; -import { appRouter } from '../components/appRouter'; +import { appRouter } from './router/appRouter'; import * as inputManager from '../scripts/inputManager'; import toast from '../components/toast/toast'; import confirm from '../components/confirm/confirm'; diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js index 8fc8d4667a..3c421aa81e 100644 --- a/src/components/remotecontrol/remotecontrol.js +++ b/src/components/remotecontrol/remotecontrol.js @@ -18,7 +18,7 @@ import './remotecontrol.scss'; import '../../elements/emby-ratingbutton/emby-ratingbutton'; import ServerConnections from '../ServerConnections'; import toast from '../toast/toast'; -import { appRouter } from '../appRouter'; +import { appRouter } from '../router/appRouter'; let showMuteButton = true; let showVolumeSlider = true; diff --git a/src/components/HistoryRouter.tsx b/src/components/router/HistoryRouter.tsx similarity index 100% rename from src/components/HistoryRouter.tsx rename to src/components/router/HistoryRouter.tsx diff --git a/src/components/appRouter.js b/src/components/router/appRouter.js similarity index 97% rename from src/components/appRouter.js rename to src/components/router/appRouter.js index be7cfd5855..72102393c4 100644 --- a/src/components/appRouter.js +++ b/src/components/router/appRouter.js @@ -1,15 +1,15 @@ import { Action, createHashHistory } from 'history'; -import { appHost } from './apphost'; -import { clearBackdrop, setBackdropTransparency } from './backdrop/backdrop'; -import globalize from '../scripts/globalize'; -import Events from '../utils/events.ts'; -import itemHelper from './itemHelper'; -import loading from './loading/loading'; -import viewManager from './viewManager/viewManager'; -import ServerConnections from './ServerConnections'; -import alert from './alert'; -import { ConnectionState } from '../utils/jellyfin-apiclient/ConnectionState.ts'; +import { appHost } from '../apphost'; +import { clearBackdrop, setBackdropTransparency } from '../backdrop/backdrop'; +import globalize from '../../scripts/globalize'; +import Events from '../../utils/events.ts'; +import itemHelper from '../itemHelper'; +import loading from '../loading/loading'; +import viewManager from '../viewManager/viewManager'; +import ServerConnections from '../ServerConnections'; +import alert from '../alert'; +import { ConnectionState } from '../../utils/jellyfin-apiclient/ConnectionState.ts'; export const history = createHashHistory(); @@ -247,7 +247,7 @@ class AppRouter { url = apiClient.getUrl(`/web${url}`); promise = apiClient.get(url); } else { - promise = import(/* webpackChunkName: "[request]" */ `../controllers/${url}`); + promise = import(/* webpackChunkName: "[request]" */ `../../controllers/${url}`); } promise.then((html) => { @@ -267,7 +267,7 @@ class AppRouter { }; if (route.controller) { - import(/* webpackChunkName: "[request]" */ '../controllers/' + route.controller).then(onInitComplete); + import(/* webpackChunkName: "[request]" */ '../../controllers/' + route.controller).then(onInitComplete); } else { onInitComplete(); } diff --git a/src/components/search/SearchSuggestions.tsx b/src/components/search/SearchSuggestions.tsx index 7e70d19ee5..8d07d95da8 100644 --- a/src/components/search/SearchSuggestions.tsx +++ b/src/components/search/SearchSuggestions.tsx @@ -5,7 +5,7 @@ import { ItemSortBy } from '@jellyfin/sdk/lib/models/api/item-sort-by'; import escapeHtml from 'escape-html'; import React, { FunctionComponent, useEffect, useState } from 'react'; -import { appRouter } from '../appRouter'; +import { appRouter } from '../router/appRouter'; import { useApi } from '../../hooks/useApi'; import globalize from '../../scripts/globalize'; diff --git a/src/components/shortcuts.js b/src/components/shortcuts.js index 7c430be567..4dfbce8c5d 100644 --- a/src/components/shortcuts.js +++ b/src/components/shortcuts.js @@ -5,7 +5,7 @@ import { playbackManager } from './playback/playbackmanager'; import inputManager from '../scripts/inputManager'; -import { appRouter } from './appRouter'; +import { appRouter } from './router/appRouter'; import globalize from '../scripts/globalize'; import dom from '../scripts/dom'; import recordingHelper from './recordingcreator/recordinghelper'; diff --git a/src/controllers/favorites.js b/src/controllers/favorites.js index 97ce3eaf86..f14727a764 100644 --- a/src/controllers/favorites.js +++ b/src/controllers/favorites.js @@ -1,4 +1,4 @@ -import { appRouter } from '../components/appRouter'; +import { appRouter } from '../components/router/appRouter'; import cardBuilder from '../components/cardbuilder/cardBuilder'; import dom from '../scripts/dom'; import globalize from '../scripts/globalize'; diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js index 943b5f74a2..bb7aa47bea 100644 --- a/src/controllers/itemDetails/index.js +++ b/src/controllers/itemDetails/index.js @@ -6,7 +6,7 @@ import isEqual from 'lodash-es/isEqual'; import { appHost } from '../../components/apphost'; import loading from '../../components/loading/loading'; -import { appRouter } from '../../components/appRouter'; +import { appRouter } from '../../components/router/appRouter'; import layoutManager from '../../components/layoutManager'; import Events from '../../utils/events.ts'; import * as userSettings from '../../scripts/settings/userSettings'; diff --git a/src/controllers/movies/moviegenres.js b/src/controllers/movies/moviegenres.js index ee0b04837c..52cb97bb79 100644 --- a/src/controllers/movies/moviegenres.js +++ b/src/controllers/movies/moviegenres.js @@ -5,7 +5,7 @@ import libraryBrowser from '../../scripts/libraryBrowser'; import cardBuilder from '../../components/cardbuilder/cardBuilder'; import lazyLoader from '../../components/lazyLoader/lazyLoaderIntersectionObserver'; import globalize from '../../scripts/globalize'; -import { appRouter } from '../../components/appRouter'; +import { appRouter } from '../../components/router/appRouter'; import '../../elements/emby-button/emby-button'; export default function (view, params, tabContent) { diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index 745170f5fc..dbb936b38b 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -21,7 +21,7 @@ import '../../../styles/videoosd.scss'; import ServerConnections from '../../../components/ServerConnections'; import shell from '../../../scripts/shell'; import SubtitleSync from '../../../components/subtitlesync/subtitlesync'; -import { appRouter } from '../../../components/appRouter'; +import { appRouter } from '../../../components/router/appRouter'; import LibraryMenu from '../../../scripts/libraryMenu'; import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../../components/backdrop/backdrop'; import { pluginManager } from '../../../components/pluginManager'; diff --git a/src/controllers/session/addServer/index.js b/src/controllers/session/addServer/index.js index 548e6a388d..be339ca978 100644 --- a/src/controllers/session/addServer/index.js +++ b/src/controllers/session/addServer/index.js @@ -63,7 +63,7 @@ export default function(view) { } function goBack() { - import('../../../components/appRouter').then(({ appRouter }) => { + import('../../../components/router/appRouter').then(({ appRouter }) => { appRouter.back(); }); } diff --git a/src/controllers/session/selectServer/index.js b/src/controllers/session/selectServer/index.js index 8d3edbf3cb..fe14164ddd 100644 --- a/src/controllers/session/selectServer/index.js +++ b/src/controllers/session/selectServer/index.js @@ -1,6 +1,6 @@ import escapeHtml from 'escape-html'; import loading from '../../../components/loading/loading'; -import { appRouter } from '../../../components/appRouter'; +import { appRouter } from '../../../components/router/appRouter'; import layoutManager from '../../../components/layoutManager'; import libraryMenu from '../../../scripts/libraryMenu'; import appSettings from '../../../scripts/settings/appSettings'; diff --git a/src/controllers/shows/tvgenres.js b/src/controllers/shows/tvgenres.js index bc27ad4759..b9e02039eb 100644 --- a/src/controllers/shows/tvgenres.js +++ b/src/controllers/shows/tvgenres.js @@ -5,7 +5,7 @@ import libraryBrowser from '../../scripts/libraryBrowser'; import cardBuilder from '../../components/cardbuilder/cardBuilder'; import lazyLoader from '../../components/lazyLoader/lazyLoaderIntersectionObserver'; import globalize from '../../scripts/globalize'; -import { appRouter } from '../../components/appRouter'; +import { appRouter } from '../../components/router/appRouter'; import '../../elements/emby-button/emby-button'; export default function (view, params, tabContent) { diff --git a/src/elements/emby-button/LinkButton.tsx b/src/elements/emby-button/LinkButton.tsx index b4a692a762..dceeac7b99 100644 --- a/src/elements/emby-button/LinkButton.tsx +++ b/src/elements/emby-button/LinkButton.tsx @@ -2,7 +2,7 @@ import React, { AnchorHTMLAttributes, DetailedHTMLProps, MouseEvent, useCallback import classNames from 'classnames'; import layoutManager from '../../components/layoutManager'; import shell from '../../scripts/shell'; -import { appRouter } from '../../components/appRouter'; +import { appRouter } from '../../components/router/appRouter'; import { appHost } from '../../components/apphost'; import './emby-button.scss'; diff --git a/src/elements/emby-button/emby-button.js b/src/elements/emby-button/emby-button.js index 08f9c91b60..0349bd38a9 100644 --- a/src/elements/emby-button/emby-button.js +++ b/src/elements/emby-button/emby-button.js @@ -2,7 +2,7 @@ import 'webcomponents.js/webcomponents-lite'; import { removeEventListener, addEventListener } from '../../scripts/dom'; import layoutManager from '../../components/layoutManager'; import shell from '../../scripts/shell'; -import { appRouter } from '../../components/appRouter'; +import { appRouter } from '../../components/router/appRouter'; import { appHost } from '../../components/apphost'; import './emby-button.scss'; diff --git a/src/index.jsx b/src/index.jsx index 2b9aafbd5d..0bb5103fb6 100644 --- a/src/index.jsx +++ b/src/index.jsx @@ -20,7 +20,7 @@ import { appHost } from './components/apphost'; import { getPlugins } from './scripts/settings/webSettings'; import { pluginManager } from './components/pluginManager'; import packageManager from './components/packageManager'; -import { appRouter, history } from './components/appRouter'; +import { appRouter, history } from './components/router/appRouter'; import './elements/emby-button/emby-button'; import './scripts/autoThemes'; import './components/themeMediaPlayer'; diff --git a/src/plugins/comicsPlayer/plugin.js b/src/plugins/comicsPlayer/plugin.js index eb6d3cb11f..58461ddc51 100644 --- a/src/plugins/comicsPlayer/plugin.js +++ b/src/plugins/comicsPlayer/plugin.js @@ -3,7 +3,7 @@ import { Archive } from 'libarchive.js'; import loading from '../../components/loading/loading'; import dialogHelper from '../../components/dialogHelper/dialogHelper'; import keyboardnavigation from '../../scripts/keyboardNavigation'; -import { appRouter } from '../../components/appRouter'; +import { appRouter } from '../../components/router/appRouter'; import ServerConnections from '../../components/ServerConnections'; import * as userSettings from '../../scripts/settings/userSettings'; import { PluginType } from '../../types/plugin.ts'; diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index 8789d5dad2..9ad2b6ddac 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -3,7 +3,7 @@ import { appHost } from '../../components/apphost'; import loading from '../../components/loading/loading'; import dom from '../../scripts/dom'; import { playbackManager } from '../../components/playback/playbackmanager'; -import { appRouter } from '../../components/appRouter'; +import { appRouter } from '../../components/router/appRouter'; import { bindEventsToHlsPlayer, destroyHlsPlayer, diff --git a/src/plugins/pdfPlayer/plugin.js b/src/plugins/pdfPlayer/plugin.js index d306b0d426..00625c2776 100644 --- a/src/plugins/pdfPlayer/plugin.js +++ b/src/plugins/pdfPlayer/plugin.js @@ -3,7 +3,7 @@ import loading from '../../components/loading/loading'; import keyboardnavigation from '../../scripts/keyboardNavigation'; import dialogHelper from '../../components/dialogHelper/dialogHelper'; import dom from '../../scripts/dom'; -import { appRouter } from '../../components/appRouter'; +import { appRouter } from '../../components/router/appRouter'; import { PluginType } from '../../types/plugin.ts'; import Events from '../../utils/events.ts'; diff --git a/src/plugins/youtubePlayer/plugin.js b/src/plugins/youtubePlayer/plugin.js index 2a10f8fcdc..47492468aa 100644 --- a/src/plugins/youtubePlayer/plugin.js +++ b/src/plugins/youtubePlayer/plugin.js @@ -1,5 +1,5 @@ import browser from '../../scripts/browser'; -import { appRouter } from '../../components/appRouter'; +import { appRouter } from '../../components/router/appRouter'; import loading from '../../components/loading/loading'; import { setBackdropTransparency, TRANSPARENCY_LEVEL } from '../../components/backdrop/backdrop'; import { PluginType } from '../../types/plugin.ts'; diff --git a/src/scripts/deleteHelper.js b/src/scripts/deleteHelper.js index 575e6753c9..ca46407db7 100644 --- a/src/scripts/deleteHelper.js +++ b/src/scripts/deleteHelper.js @@ -1,6 +1,6 @@ import confirm from '../components/confirm/confirm'; -import { appRouter } from '../components/appRouter'; +import { appRouter } from '../components/router/appRouter'; import globalize from './globalize'; import ServerConnections from '../components/ServerConnections'; import alert from '../components/alert'; diff --git a/src/scripts/inputManager.js b/src/scripts/inputManager.js index 53da91a70e..83d0eafca3 100644 --- a/src/scripts/inputManager.js +++ b/src/scripts/inputManager.js @@ -1,6 +1,6 @@ import { playbackManager } from '../components/playback/playbackmanager'; import focusManager from '../components/focusManager'; -import { appRouter } from '../components/appRouter'; +import { appRouter } from '../components/router/appRouter'; import dom from './dom'; import { appHost } from '../components/apphost'; diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js index 733d9b5605..0a8ba07831 100644 --- a/src/scripts/libraryMenu.js +++ b/src/scripts/libraryMenu.js @@ -5,7 +5,7 @@ import dom from './dom'; import layoutManager from '../components/layoutManager'; import inputManager from './inputManager'; import viewManager from '../components/viewManager/viewManager'; -import { appRouter } from '../components/appRouter'; +import { appRouter } from '../components/router/appRouter'; import { appHost } from '../components/apphost'; import { playbackManager } from '../components/playback/playbackmanager'; import { pluginManager } from '../components/pluginManager'; diff --git a/src/scripts/serverNotifications.js b/src/scripts/serverNotifications.js index 7863cafe46..00088ef294 100644 --- a/src/scripts/serverNotifications.js +++ b/src/scripts/serverNotifications.js @@ -2,7 +2,7 @@ import { playbackManager } from '../components/playback/playbackmanager'; import { pluginManager } from '../components/pluginManager'; import inputManager from '../scripts/inputManager'; import focusManager from '../components/focusManager'; -import { appRouter } from '../components/appRouter'; +import { appRouter } from '../components/router/appRouter'; import ServerConnections from '../components/ServerConnections'; import toast from '../components/toast/toast'; import alert from '../components/alert'; diff --git a/src/utils/dashboard.js b/src/utils/dashboard.js index 0101aa57d3..a126aa1a58 100644 --- a/src/utils/dashboard.js +++ b/src/utils/dashboard.js @@ -1,7 +1,7 @@ import ServerConnections from '../components/ServerConnections'; import toast from '../components/toast/toast'; import loading from '../components/loading/loading'; -import { appRouter } from '../components/appRouter'; +import { appRouter } from '../components/router/appRouter'; import baseAlert from '../components/alert'; import baseConfirm from '../components/confirm/confirm'; import globalize from '../scripts/globalize'; From 1224ba7ec4641886beaf86c41c967e07f5b4f7a4 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Mon, 1 May 2023 16:50:41 -0400 Subject: [PATCH 2/3] Move routes to the correct apps --- .../experimental/routes/asyncRoutes/admin.ts | 14 ++++---- .../experimental/routes/asyncRoutes/user.ts | 8 ++--- src/{ => apps/experimental}/routes/home.tsx | 20 +++++------ .../routes/movies/CollectionsView.tsx | 4 +-- .../routes/movies/FavoritesView.tsx | 4 +-- .../routes/movies/GenresView.tsx | 6 ++-- .../routes/movies/MoviesView.tsx | 4 +-- .../routes/movies/SuggestionsView.tsx | 16 ++++----- .../routes/movies/TrailersView.tsx | 4 +-- .../experimental}/routes/movies/index.tsx | 18 +++++----- .../experimental}/routes/user/useredit.tsx | 29 +++++++-------- .../routes/user/userlibraryaccess.tsx | 22 ++++++------ .../experimental}/routes/user/usernew.tsx | 20 +++++------ .../routes/user/userparentalcontrol.tsx | 31 ++++++++-------- .../routes/user/userpassword.tsx | 13 +++---- .../experimental}/routes/user/userprofile.tsx | 22 ++++++------ .../routes/user/userprofiles.tsx | 29 +++++++-------- src/{ => apps/stable}/routes/search.tsx | 12 +++---- src/components/AsyncPage.tsx | 17 --------- src/components/router/AsyncRoute.tsx | 35 ++++++++++++++++--- 20 files changed, 170 insertions(+), 158 deletions(-) rename src/{ => apps/experimental}/routes/home.tsx (88%) rename src/{ => apps/experimental}/routes/movies/CollectionsView.tsx (84%) rename src/{ => apps/experimental}/routes/movies/FavoritesView.tsx (81%) rename src/{ => apps/experimental}/routes/movies/GenresView.tsx (83%) rename src/{ => apps/experimental}/routes/movies/MoviesView.tsx (82%) rename src/{ => apps/experimental}/routes/movies/SuggestionsView.tsx (90%) rename src/{ => apps/experimental}/routes/movies/TrailersView.tsx (81%) rename src/{ => apps/experimental}/routes/movies/index.tsx (87%) rename src/{ => apps/experimental}/routes/user/useredit.tsx (96%) rename src/{ => apps/experimental}/routes/user/userlibraryaccess.tsx (94%) rename src/{ => apps/experimental}/routes/user/usernew.tsx (93%) rename src/{ => apps/experimental}/routes/user/userparentalcontrol.tsx (93%) rename src/{ => apps/experimental}/routes/user/userpassword.tsx (76%) rename src/{ => apps/experimental}/routes/user/userprofile.tsx (91%) rename src/{ => apps/experimental}/routes/user/userprofiles.tsx (84%) rename src/{ => apps/stable}/routes/search.tsx (76%) delete mode 100644 src/components/AsyncPage.tsx diff --git a/src/apps/experimental/routes/asyncRoutes/admin.ts b/src/apps/experimental/routes/asyncRoutes/admin.ts index 0f2ec6b9cf..6212330f96 100644 --- a/src/apps/experimental/routes/asyncRoutes/admin.ts +++ b/src/apps/experimental/routes/asyncRoutes/admin.ts @@ -1,10 +1,10 @@ -import { AsyncRoute } from '../../../../components/router/AsyncRoute'; +import { AsyncRoute, AsyncRouteType } from '../../../../components/router/AsyncRoute'; export const ASYNC_ADMIN_ROUTES: AsyncRoute[] = [ - { path: 'usernew.html', page: 'user/usernew' }, - { path: 'userprofiles.html', page: 'user/userprofiles' }, - { path: 'useredit.html', page: 'user/useredit' }, - { path: 'userlibraryaccess.html', page: 'user/userlibraryaccess' }, - { path: 'userparentalcontrol.html', page: 'user/userparentalcontrol' }, - { path: 'userpassword.html', page: 'user/userpassword' } + { path: 'usernew.html', page: 'user/usernew', type: AsyncRouteType.Experimental }, + { path: 'userprofiles.html', page: 'user/userprofiles', type: AsyncRouteType.Experimental }, + { path: 'useredit.html', page: 'user/useredit', type: AsyncRouteType.Experimental }, + { path: 'userlibraryaccess.html', page: 'user/userlibraryaccess', type: AsyncRouteType.Experimental }, + { path: 'userparentalcontrol.html', page: 'user/userparentalcontrol', type: AsyncRouteType.Experimental }, + { path: 'userpassword.html', page: 'user/userpassword', type: AsyncRouteType.Experimental } ]; diff --git a/src/apps/experimental/routes/asyncRoutes/user.ts b/src/apps/experimental/routes/asyncRoutes/user.ts index 44674e888c..311b691b54 100644 --- a/src/apps/experimental/routes/asyncRoutes/user.ts +++ b/src/apps/experimental/routes/asyncRoutes/user.ts @@ -1,8 +1,8 @@ -import { AsyncRoute } from '../../../../components/router/AsyncRoute'; +import { AsyncRoute, AsyncRouteType } from '../../../../components/router/AsyncRoute'; export const ASYNC_USER_ROUTES: AsyncRoute[] = [ { path: 'search.html', page: 'search' }, - { path: 'userprofile.html', page: 'user/userprofile' }, - { path: 'home.html', page: 'home' }, - { path: 'movies.html', page: 'movies' } + { path: 'userprofile.html', page: 'user/userprofile', type: AsyncRouteType.Experimental }, + { path: 'home.html', page: 'home', type: AsyncRouteType.Experimental }, + { path: 'movies.html', page: 'movies', type: AsyncRouteType.Experimental } ]; diff --git a/src/routes/home.tsx b/src/apps/experimental/routes/home.tsx similarity index 88% rename from src/routes/home.tsx rename to src/apps/experimental/routes/home.tsx index 4346106eaf..0b0e38f3b2 100644 --- a/src/routes/home.tsx +++ b/src/apps/experimental/routes/home.tsx @@ -1,15 +1,15 @@ import React, { FunctionComponent, useCallback, useEffect, useMemo, useRef } from 'react'; import { useSearchParams } from 'react-router-dom'; -import globalize from '../scripts/globalize'; -import LibraryMenu from '../scripts/libraryMenu'; -import { clearBackdrop } from '../components/backdrop/backdrop'; -import layoutManager from '../components/layoutManager'; -import * as mainTabsManager from '../components/maintabsmanager'; -import '../elements/emby-tabs/emby-tabs'; -import '../elements/emby-button/emby-button'; -import '../elements/emby-scroller/emby-scroller'; -import Page from '../components/Page'; +import globalize from '../../../scripts/globalize'; +import LibraryMenu from '../../../scripts/libraryMenu'; +import { clearBackdrop } from '../../../components/backdrop/backdrop'; +import layoutManager from '../../../components/layoutManager'; +import * as mainTabsManager from '../../../components/maintabsmanager'; +import '../../../elements/emby-tabs/emby-tabs'; +import '../../../elements/emby-button/emby-button'; +import '../../../elements/emby-scroller/emby-scroller'; +import Page from '../../../components/Page'; type OnResumeOptions = { autoFocus?: boolean; @@ -65,7 +65,7 @@ const Home: FunctionComponent = () => { depends = 'favorites'; } - return import(/* webpackChunkName: "[request]" */ `../controllers/${depends}`).then(({ default: controllerFactory }) => { + return import(/* webpackChunkName: "[request]" */ `../../../controllers/${depends}`).then(({ default: controllerFactory }) => { let controller = tabControllers[index]; if (!controller) { diff --git a/src/routes/movies/CollectionsView.tsx b/src/apps/experimental/routes/movies/CollectionsView.tsx similarity index 84% rename from src/routes/movies/CollectionsView.tsx rename to src/apps/experimental/routes/movies/CollectionsView.tsx index 6e94ad2b96..b58cc957e5 100644 --- a/src/routes/movies/CollectionsView.tsx +++ b/src/apps/experimental/routes/movies/CollectionsView.tsx @@ -1,7 +1,7 @@ import React, { FC, useCallback } from 'react'; -import ViewItemsContainer from '../../components/common/ViewItemsContainer'; -import { LibraryViewProps } from '../../types/interface'; +import ViewItemsContainer from '../../../../components/common/ViewItemsContainer'; +import { LibraryViewProps } from '../../../../types/interface'; const CollectionsView: FC = ({ topParentId }) => { const getBasekey = useCallback(() => { diff --git a/src/routes/movies/FavoritesView.tsx b/src/apps/experimental/routes/movies/FavoritesView.tsx similarity index 81% rename from src/routes/movies/FavoritesView.tsx rename to src/apps/experimental/routes/movies/FavoritesView.tsx index cf6969bbb2..bca4227df4 100644 --- a/src/routes/movies/FavoritesView.tsx +++ b/src/apps/experimental/routes/movies/FavoritesView.tsx @@ -1,7 +1,7 @@ import React, { FC, useCallback } from 'react'; -import ViewItemsContainer from '../../components/common/ViewItemsContainer'; -import { LibraryViewProps } from '../../types/interface'; +import ViewItemsContainer from '../../../../components/common/ViewItemsContainer'; +import { LibraryViewProps } from '../../../../types/interface'; const FavoritesView: FC = ({ topParentId }) => { const getBasekey = useCallback(() => { diff --git a/src/routes/movies/GenresView.tsx b/src/apps/experimental/routes/movies/GenresView.tsx similarity index 83% rename from src/routes/movies/GenresView.tsx rename to src/apps/experimental/routes/movies/GenresView.tsx index 24ae5f79c0..a2c1d7a476 100644 --- a/src/routes/movies/GenresView.tsx +++ b/src/apps/experimental/routes/movies/GenresView.tsx @@ -1,9 +1,9 @@ import type { BaseItemDtoQueryResult } from '@jellyfin/sdk/lib/generated-client'; import React, { FC, useCallback, useEffect, useState } from 'react'; -import loading from '../../components/loading/loading'; -import GenresItemsContainer from '../../components/common/GenresItemsContainer'; -import { LibraryViewProps } from '../../types/interface'; +import loading from '../../../../components/loading/loading'; +import GenresItemsContainer from '../../../../components/common/GenresItemsContainer'; +import { LibraryViewProps } from '../../../../types/interface'; const GenresView: FC = ({ topParentId }) => { const [ itemsResult, setItemsResult ] = useState({}); diff --git a/src/routes/movies/MoviesView.tsx b/src/apps/experimental/routes/movies/MoviesView.tsx similarity index 82% rename from src/routes/movies/MoviesView.tsx rename to src/apps/experimental/routes/movies/MoviesView.tsx index 4103eb908c..510ed9e2b2 100644 --- a/src/routes/movies/MoviesView.tsx +++ b/src/apps/experimental/routes/movies/MoviesView.tsx @@ -1,7 +1,7 @@ import React, { FC, useCallback } from 'react'; -import ViewItemsContainer from '../../components/common/ViewItemsContainer'; -import { LibraryViewProps } from '../../types/interface'; +import ViewItemsContainer from '../../../../components/common/ViewItemsContainer'; +import { LibraryViewProps } from '../../../../types/interface'; const MoviesView: FC = ({ topParentId }) => { const getBasekey = useCallback(() => { diff --git a/src/routes/movies/SuggestionsView.tsx b/src/apps/experimental/routes/movies/SuggestionsView.tsx similarity index 90% rename from src/routes/movies/SuggestionsView.tsx rename to src/apps/experimental/routes/movies/SuggestionsView.tsx index 0d4b944be9..48b402efbc 100644 --- a/src/routes/movies/SuggestionsView.tsx +++ b/src/apps/experimental/routes/movies/SuggestionsView.tsx @@ -1,13 +1,13 @@ import type { BaseItemDto, BaseItemDtoQueryResult, RecommendationDto } from '@jellyfin/sdk/lib/generated-client'; import React, { FC, useCallback, useEffect, useRef, useState } from 'react'; -import layoutManager from '../../components/layoutManager'; -import loading from '../../components/loading/loading'; -import dom from '../../scripts/dom'; -import globalize from '../../scripts/globalize'; -import RecommendationContainer from '../../components/common/RecommendationContainer'; -import SectionContainer from '../../components/common/SectionContainer'; -import { LibraryViewProps } from '../../types/interface'; +import layoutManager from '../../../../components/layoutManager'; +import loading from '../../../../components/loading/loading'; +import dom from '../../../../scripts/dom'; +import globalize from '../../../../scripts/globalize'; +import RecommendationContainer from '../../../../components/common/RecommendationContainer'; +import SectionContainer from '../../../../components/common/SectionContainer'; +import { LibraryViewProps } from '../../../../types/interface'; const SuggestionsView: FC = ({ topParentId }) => { const [ latestItems, setLatestItems ] = useState([]); @@ -28,7 +28,7 @@ const SuggestionsView: FC = ({ topParentId }) => { }, [enableScrollX]); const autoFocus = useCallback((page) => { - import('../../components/autoFocuser').then(({ default: autoFocuser }) => { + import('../../../../components/autoFocuser').then(({ default: autoFocuser }) => { autoFocuser.autoFocus(page); }); }, []); diff --git a/src/routes/movies/TrailersView.tsx b/src/apps/experimental/routes/movies/TrailersView.tsx similarity index 81% rename from src/routes/movies/TrailersView.tsx rename to src/apps/experimental/routes/movies/TrailersView.tsx index 9e11d41b94..55f6189cfc 100644 --- a/src/routes/movies/TrailersView.tsx +++ b/src/apps/experimental/routes/movies/TrailersView.tsx @@ -1,8 +1,8 @@ import React, { FC, useCallback } from 'react'; -import ViewItemsContainer from '../../components/common/ViewItemsContainer'; -import { LibraryViewProps } from '../../types/interface'; +import ViewItemsContainer from '../../../../components/common/ViewItemsContainer'; +import { LibraryViewProps } from '../../../../types/interface'; const TrailersView: FC = ({ topParentId }) => { const getBasekey = useCallback(() => { diff --git a/src/routes/movies/index.tsx b/src/apps/experimental/routes/movies/index.tsx similarity index 87% rename from src/routes/movies/index.tsx rename to src/apps/experimental/routes/movies/index.tsx index 9b1405c9e5..e2e7bfa4de 100644 --- a/src/routes/movies/index.tsx +++ b/src/apps/experimental/routes/movies/index.tsx @@ -1,16 +1,16 @@ -import '../../elements/emby-scroller/emby-scroller'; -import '../../elements/emby-itemscontainer/emby-itemscontainer'; -import '../../elements/emby-tabs/emby-tabs'; -import '../../elements/emby-button/emby-button'; +import '../../../../elements/emby-scroller/emby-scroller'; +import '../../../../elements/emby-itemscontainer/emby-itemscontainer'; +import '../../../../elements/emby-tabs/emby-tabs'; +import '../../../../elements/emby-button/emby-button'; import React, { FC, useCallback, useEffect, useRef, useState } from 'react'; import { useSearchParams } from 'react-router-dom'; -import * as mainTabsManager from '../../components/maintabsmanager'; -import Page from '../../components/Page'; -import globalize from '../../scripts/globalize'; -import libraryMenu from '../../scripts/libraryMenu'; -import * as userSettings from '../../scripts/settings/userSettings'; +import * as mainTabsManager from '../../../../components/maintabsmanager'; +import Page from '../../../../components/Page'; +import globalize from '../../../../scripts/globalize'; +import libraryMenu from '../../../../scripts/libraryMenu'; +import * as userSettings from '../../../../scripts/settings/userSettings'; import CollectionsView from './CollectionsView'; import FavoritesView from './FavoritesView'; import GenresView from './GenresView'; diff --git a/src/routes/user/useredit.tsx b/src/apps/experimental/routes/user/useredit.tsx similarity index 96% rename from src/routes/user/useredit.tsx rename to src/apps/experimental/routes/user/useredit.tsx index ca013d6ca6..f099ee6407 100644 --- a/src/routes/user/useredit.tsx +++ b/src/apps/experimental/routes/user/useredit.tsx @@ -1,20 +1,21 @@ import type { SyncPlayUserAccessType, UserDto } from '@jellyfin/sdk/lib/generated-client'; import React, { FunctionComponent, useCallback, useEffect, useState, useRef } from 'react'; -import Dashboard from '../../utils/dashboard'; -import globalize from '../../scripts/globalize'; -import LibraryMenu from '../../scripts/libraryMenu'; -import ButtonElement from '../../elements/ButtonElement'; -import CheckBoxElement from '../../elements/CheckBoxElement'; -import InputElement from '../../elements/InputElement'; -import LinkEditUserPreferences from '../../components/dashboard/users/LinkEditUserPreferences'; -import SectionTitleContainer from '../../elements/SectionTitleContainer'; -import SectionTabs from '../../components/dashboard/users/SectionTabs'; -import loading from '../../components/loading/loading'; -import toast from '../../components/toast/toast'; -import { getParameterByName } from '../../utils/url'; import escapeHTML from 'escape-html'; -import SelectElement from '../../elements/SelectElement'; -import Page from '../../components/Page'; + +import Dashboard from '../../../../utils/dashboard'; +import globalize from '../../../../scripts/globalize'; +import LibraryMenu from '../../../../scripts/libraryMenu'; +import ButtonElement from '../../../../elements/ButtonElement'; +import CheckBoxElement from '../../../../elements/CheckBoxElement'; +import InputElement from '../../../../elements/InputElement'; +import LinkEditUserPreferences from '../../../../components/dashboard/users/LinkEditUserPreferences'; +import SectionTitleContainer from '../../../../elements/SectionTitleContainer'; +import SectionTabs from '../../../../components/dashboard/users/SectionTabs'; +import loading from '../../../../components/loading/loading'; +import toast from '../../../../components/toast/toast'; +import { getParameterByName } from '../../../../utils/url'; +import SelectElement from '../../../../elements/SelectElement'; +import Page from '../../../../components/Page'; type ResetProvider = AuthProvider & { checkedAttribute: string diff --git a/src/routes/user/userlibraryaccess.tsx b/src/apps/experimental/routes/user/userlibraryaccess.tsx similarity index 94% rename from src/routes/user/userlibraryaccess.tsx rename to src/apps/experimental/routes/user/userlibraryaccess.tsx index 657a8ec417..e255376104 100644 --- a/src/routes/user/userlibraryaccess.tsx +++ b/src/apps/experimental/routes/user/userlibraryaccess.tsx @@ -1,17 +1,17 @@ import type { UserDto } from '@jellyfin/sdk/lib/generated-client'; import React, { FunctionComponent, useCallback, useEffect, useState, useRef } from 'react'; -import loading from '../../components/loading/loading'; -import libraryMenu from '../../scripts/libraryMenu'; -import globalize from '../../scripts/globalize'; -import toast from '../../components/toast/toast'; -import SectionTabs from '../../components/dashboard/users/SectionTabs'; -import ButtonElement from '../../elements/ButtonElement'; -import { getParameterByName } from '../../utils/url'; -import SectionTitleContainer from '../../elements/SectionTitleContainer'; -import AccessContainer from '../../components/dashboard/users/AccessContainer'; -import CheckBoxElement from '../../elements/CheckBoxElement'; -import Page from '../../components/Page'; +import loading from '../../../../components/loading/loading'; +import libraryMenu from '../../../../scripts/libraryMenu'; +import globalize from '../../../../scripts/globalize'; +import toast from '../../../../components/toast/toast'; +import SectionTabs from '../../../../components/dashboard/users/SectionTabs'; +import ButtonElement from '../../../../elements/ButtonElement'; +import { getParameterByName } from '../../../../utils/url'; +import SectionTitleContainer from '../../../../elements/SectionTitleContainer'; +import AccessContainer from '../../../../components/dashboard/users/AccessContainer'; +import CheckBoxElement from '../../../../elements/CheckBoxElement'; +import Page from '../../../../components/Page'; type ItemsArr = { Name?: string; diff --git a/src/routes/user/usernew.tsx b/src/apps/experimental/routes/user/usernew.tsx similarity index 93% rename from src/routes/user/usernew.tsx rename to src/apps/experimental/routes/user/usernew.tsx index cc2a454744..051bbce9b7 100644 --- a/src/routes/user/usernew.tsx +++ b/src/apps/experimental/routes/user/usernew.tsx @@ -1,15 +1,15 @@ import React, { FunctionComponent, useCallback, useEffect, useState, useRef } from 'react'; -import Dashboard from '../../utils/dashboard'; -import globalize from '../../scripts/globalize'; -import loading from '../../components/loading/loading'; -import toast from '../../components/toast/toast'; -import SectionTitleContainer from '../../elements/SectionTitleContainer'; -import InputElement from '../../elements/InputElement'; -import ButtonElement from '../../elements/ButtonElement'; -import AccessContainer from '../../components/dashboard/users/AccessContainer'; -import CheckBoxElement from '../../elements/CheckBoxElement'; -import Page from '../../components/Page'; +import Dashboard from '../../../../utils/dashboard'; +import globalize from '../../../../scripts/globalize'; +import loading from '../../../../components/loading/loading'; +import toast from '../../../../components/toast/toast'; +import SectionTitleContainer from '../../../../elements/SectionTitleContainer'; +import InputElement from '../../../../elements/InputElement'; +import ButtonElement from '../../../../elements/ButtonElement'; +import AccessContainer from '../../../../components/dashboard/users/AccessContainer'; +import CheckBoxElement from '../../../../elements/CheckBoxElement'; +import Page from '../../../../components/Page'; type userInput = { Name?: string; diff --git a/src/routes/user/userparentalcontrol.tsx b/src/apps/experimental/routes/user/userparentalcontrol.tsx similarity index 93% rename from src/routes/user/userparentalcontrol.tsx rename to src/apps/experimental/routes/user/userparentalcontrol.tsx index fabbcacd1d..ce02ba0f33 100644 --- a/src/routes/user/userparentalcontrol.tsx +++ b/src/apps/experimental/routes/user/userparentalcontrol.tsx @@ -1,20 +1,21 @@ import type { AccessSchedule, ParentalRating, UserDto } from '@jellyfin/sdk/lib/generated-client'; import { DynamicDayOfWeek } from '@jellyfin/sdk/lib/generated-client/models/dynamic-day-of-week'; import React, { FunctionComponent, useCallback, useEffect, useState, useRef } from 'react'; -import globalize from '../../scripts/globalize'; -import LibraryMenu from '../../scripts/libraryMenu'; -import AccessScheduleList from '../../components/dashboard/users/AccessScheduleList'; -import BlockedTagList from '../../components/dashboard/users/BlockedTagList'; -import ButtonElement from '../../elements/ButtonElement'; -import SectionTitleContainer from '../../elements/SectionTitleContainer'; -import SectionTabs from '../../components/dashboard/users/SectionTabs'; -import loading from '../../components/loading/loading'; -import toast from '../../components/toast/toast'; -import { getParameterByName } from '../../utils/url'; -import CheckBoxElement from '../../elements/CheckBoxElement'; import escapeHTML from 'escape-html'; -import SelectElement from '../../elements/SelectElement'; -import Page from '../../components/Page'; + +import globalize from '../../../../scripts/globalize'; +import LibraryMenu from '../../../../scripts/libraryMenu'; +import AccessScheduleList from '../../../../components/dashboard/users/AccessScheduleList'; +import BlockedTagList from '../../../../components/dashboard/users/BlockedTagList'; +import ButtonElement from '../../../../elements/ButtonElement'; +import SectionTitleContainer from '../../../../elements/SectionTitleContainer'; +import SectionTabs from '../../../../components/dashboard/users/SectionTabs'; +import loading from '../../../../components/loading/loading'; +import toast from '../../../../components/toast/toast'; +import { getParameterByName } from '../../../../utils/url'; +import CheckBoxElement from '../../../../elements/CheckBoxElement'; +import SelectElement from '../../../../elements/SelectElement'; +import Page from '../../../../components/Page'; type UnratedItem = { name: string; @@ -235,7 +236,7 @@ const UserParentalControl: FunctionComponent = () => { const showSchedulePopup = (schedule: AccessSchedule, index: number) => { schedule = schedule || {}; - import('../../components/accessSchedule/accessSchedule').then(({ default: accessschedule }) => { + import('../../../../components/accessSchedule/accessSchedule').then(({ default: accessschedule }) => { accessschedule.show({ schedule: schedule }).then(function (updatedSchedule) { @@ -268,7 +269,7 @@ const UserParentalControl: FunctionComponent = () => { }; const showBlockedTagPopup = () => { - import('../../components/prompt/prompt').then(({ default: prompt }) => { + import('../../../../components/prompt/prompt').then(({ default: prompt }) => { prompt({ label: globalize.translate('LabelTag') }).then(function (value) { diff --git a/src/routes/user/userpassword.tsx b/src/apps/experimental/routes/user/userpassword.tsx similarity index 76% rename from src/routes/user/userpassword.tsx rename to src/apps/experimental/routes/user/userpassword.tsx index 5da2a2b5ef..3a518d6379 100644 --- a/src/routes/user/userpassword.tsx +++ b/src/apps/experimental/routes/user/userpassword.tsx @@ -1,10 +1,11 @@ import React, { FunctionComponent, useCallback, useEffect, useState } from 'react'; -import SectionTabs from '../../components/dashboard/users/SectionTabs'; -import UserPasswordForm from '../../components/dashboard/users/UserPasswordForm'; -import { getParameterByName } from '../../utils/url'; -import SectionTitleContainer from '../../elements/SectionTitleContainer'; -import Page from '../../components/Page'; -import loading from '../../components/loading/loading'; + +import SectionTabs from '../../../../components/dashboard/users/SectionTabs'; +import UserPasswordForm from '../../../../components/dashboard/users/UserPasswordForm'; +import { getParameterByName } from '../../../../utils/url'; +import SectionTitleContainer from '../../../../elements/SectionTitleContainer'; +import Page from '../../../../components/Page'; +import loading from '../../../../components/loading/loading'; const UserPassword: FunctionComponent = () => { const userId = getParameterByName('userId'); diff --git a/src/routes/user/userprofile.tsx b/src/apps/experimental/routes/user/userprofile.tsx similarity index 91% rename from src/routes/user/userprofile.tsx rename to src/apps/experimental/routes/user/userprofile.tsx index 0b35d50943..7b1575d2c1 100644 --- a/src/routes/user/userprofile.tsx +++ b/src/apps/experimental/routes/user/userprofile.tsx @@ -2,17 +2,17 @@ import type { UserDto } from '@jellyfin/sdk/lib/generated-client'; import { ImageType } from '@jellyfin/sdk/lib/generated-client/models/image-type'; import React, { FunctionComponent, useEffect, useState, useRef, useCallback } from 'react'; -import Dashboard from '../../utils/dashboard'; -import globalize from '../../scripts/globalize'; -import LibraryMenu from '../../scripts/libraryMenu'; -import { appHost } from '../../components/apphost'; -import confirm from '../../components/confirm/confirm'; -import ButtonElement from '../../elements/ButtonElement'; -import UserPasswordForm from '../../components/dashboard/users/UserPasswordForm'; -import loading from '../../components/loading/loading'; -import toast from '../../components/toast/toast'; -import { getParameterByName } from '../../utils/url'; -import Page from '../../components/Page'; +import Dashboard from '../../../../utils/dashboard'; +import globalize from '../../../../scripts/globalize'; +import LibraryMenu from '../../../../scripts/libraryMenu'; +import { appHost } from '../../../../components/apphost'; +import confirm from '../../../../components/confirm/confirm'; +import ButtonElement from '../../../../elements/ButtonElement'; +import UserPasswordForm from '../../../../components/dashboard/users/UserPasswordForm'; +import loading from '../../../../components/loading/loading'; +import toast from '../../../../components/toast/toast'; +import { getParameterByName } from '../../../../utils/url'; +import Page from '../../../../components/Page'; const UserProfile: FunctionComponent = () => { const userId = getParameterByName('userId'); diff --git a/src/routes/user/userprofiles.tsx b/src/apps/experimental/routes/user/userprofiles.tsx similarity index 84% rename from src/routes/user/userprofiles.tsx rename to src/apps/experimental/routes/user/userprofiles.tsx index 0f11fced60..1eb2c9ee2e 100644 --- a/src/routes/user/userprofiles.tsx +++ b/src/apps/experimental/routes/user/userprofiles.tsx @@ -1,18 +1,19 @@ import type { UserDto } from '@jellyfin/sdk/lib/generated-client'; import React, { FunctionComponent, useEffect, useState, useRef } from 'react'; -import Dashboard from '../../utils/dashboard'; -import globalize from '../../scripts/globalize'; -import loading from '../../components/loading/loading'; -import dom from '../../scripts/dom'; -import confirm from '../../components/confirm/confirm'; -import UserCardBox from '../../components/dashboard/users/UserCardBox'; -import SectionTitleContainer from '../../elements/SectionTitleContainer'; -import '../../elements/emby-button/emby-button'; -import '../../elements/emby-button/paper-icon-button-light'; -import '../../components/cardbuilder/card.scss'; -import '../../components/indicators/indicators.scss'; -import '../../styles/flexstyles.scss'; -import Page from '../../components/Page'; + +import Dashboard from '../../../../utils/dashboard'; +import globalize from '../../../../scripts/globalize'; +import loading from '../../../../components/loading/loading'; +import dom from '../../../../scripts/dom'; +import confirm from '../../../../components/confirm/confirm'; +import UserCardBox from '../../../../components/dashboard/users/UserCardBox'; +import SectionTitleContainer from '../../../../elements/SectionTitleContainer'; +import '../../../../elements/emby-button/emby-button'; +import '../../../../elements/emby-button/paper-icon-button-light'; +import '../../../../components/cardbuilder/card.scss'; +import '../../../../components/indicators/indicators.scss'; +import '../../../../styles/flexstyles.scss'; +import Page from '../../../../components/Page'; type MenuEntry = { name?: string; @@ -75,7 +76,7 @@ const UserProfiles: FunctionComponent = () => { icon: 'delete' }); - import('../../components/actionSheet/actionSheet').then(({ default: actionsheet }) => { + import('../../../../components/actionSheet/actionSheet').then(({ default: actionsheet }) => { actionsheet.show({ items: menuItems, positionTo: card, diff --git a/src/routes/search.tsx b/src/apps/stable/routes/search.tsx similarity index 76% rename from src/routes/search.tsx rename to src/apps/stable/routes/search.tsx index 192f90bb67..c9285f6075 100644 --- a/src/routes/search.tsx +++ b/src/apps/stable/routes/search.tsx @@ -1,12 +1,12 @@ import React, { FunctionComponent, useState } from 'react'; import { useSearchParams } from 'react-router-dom'; -import Page from '../components/Page'; -import SearchFields from '../components/search/SearchFields'; -import SearchResults from '../components/search/SearchResults'; -import SearchSuggestions from '../components/search/SearchSuggestions'; -import LiveTVSearchResults from '../components/search/LiveTVSearchResults'; -import globalize from '../scripts/globalize'; +import Page from '../../../components/Page'; +import SearchFields from '../../../components/search/SearchFields'; +import SearchResults from '../../../components/search/SearchResults'; +import SearchSuggestions from '../../../components/search/SearchSuggestions'; +import LiveTVSearchResults from '../../../components/search/LiveTVSearchResults'; +import globalize from '../../../scripts/globalize'; const Search: FunctionComponent = () => { const [ query, setQuery ] = useState(); diff --git a/src/components/AsyncPage.tsx b/src/components/AsyncPage.tsx deleted file mode 100644 index 4c1e6fa7a2..0000000000 --- a/src/components/AsyncPage.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import loadable from '@loadable/component'; - -interface AsyncPageProps { - /** The relative path to the page component in the routes directory. */ - page: string -} - -/** - * Page component that uses the loadable component library to load pages defined in the routes directory asynchronously - * with code splitting. - */ -const AsyncPage = loadable( - (props: AsyncPageProps) => import(/* webpackChunkName: "[request]" */ `../routes/${props.page}`), - { cacheKey: (props: AsyncPageProps) => props.page } -); - -export default AsyncPage; diff --git a/src/components/router/AsyncRoute.tsx b/src/components/router/AsyncRoute.tsx index 6fb189e8bf..9ed49544fb 100644 --- a/src/components/router/AsyncRoute.tsx +++ b/src/components/router/AsyncRoute.tsx @@ -1,19 +1,44 @@ +import loadable from '@loadable/component'; import React from 'react'; import { Route } from 'react-router-dom'; -import AsyncPage from '../AsyncPage'; +export enum AsyncRouteType { + Stable, + Experimental +} export interface AsyncRoute { /** The URL path for this route. */ path: string /** The relative path to the page component in the routes directory. */ page: string + /** The route should use the page component from the experimental app. */ + type?: AsyncRouteType } -export const toAsyncPageRoute = (route: AsyncRoute) => ( +interface AsyncPageProps { + /** The relative path to the page component in the routes directory. */ + page: string +} + +const ExperimentalAsyncPage = loadable( + (props: { page: string }) => import(/* webpackChunkName: "[request]" */ `../../apps/experimental/routes/${props.page}`), + { cacheKey: (props: AsyncPageProps) => props.page } +); + +const StableAsyncPage = loadable( + (props: { page: string }) => import(/* webpackChunkName: "[request]" */ `../../apps/stable/routes/${props.page}`), + { cacheKey: (props: AsyncPageProps) => props.page } +); + +export const toAsyncPageRoute = ({ path, page, type = AsyncRouteType.Stable }: AsyncRoute) => ( } + key={path} + path={path} + element={( + type === AsyncRouteType.Experimental ? + : + + )} /> ); From 023dd384cf562d3f39c1b1b8876169d51514e9fa Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Tue, 2 May 2023 01:42:23 -0400 Subject: [PATCH 3/3] Use react user pages in stable app --- .../experimental/routes/asyncRoutes/admin.ts | 14 +- .../experimental/routes/asyncRoutes/user.ts | 2 +- src/apps/stable/routes/AppRoutes.tsx | 3 +- src/apps/stable/routes/asyncRoutes/admin.ts | 10 + src/apps/stable/routes/asyncRoutes/index.ts | 1 + src/apps/stable/routes/asyncRoutes/user.ts | 3 +- src/apps/stable/routes/legacyRoutes/admin.ts | 36 --- src/apps/stable/routes/legacyRoutes/user.ts | 6 - .../routes/user/useredit.tsx | 0 .../routes/user/userlibraryaccess.tsx | 0 .../routes/user/usernew.tsx | 0 .../routes/user/userparentalcontrol.tsx | 0 .../routes/user/userpassword.tsx | 0 .../routes/user/userprofile.tsx | 0 .../routes/user/userprofiles.tsx | 0 src/controllers/dashboard/users/useredit.html | 198 ------------- src/controllers/dashboard/users/useredit.js | 196 ------------ .../dashboard/users/userlibraryaccess.html | 68 ----- .../dashboard/users/userlibraryaccess.js | 184 ------------ src/controllers/dashboard/users/usernew.html | 62 ---- src/controllers/dashboard/users/usernew.js | 128 -------- .../dashboard/users/userparentalcontrol.html | 60 ---- .../dashboard/users/userparentalcontrol.js | 278 ------------------ .../dashboard/users/userpassword.html | 72 ----- .../dashboard/users/userpasswordpage.js | 179 ----------- .../dashboard/users/userprofiles.html | 16 - .../dashboard/users/userprofilespage.js | 184 ------------ src/controllers/user/profile/index.html | 69 ----- src/controllers/user/profile/index.js | 105 ------- 29 files changed, 23 insertions(+), 1851 deletions(-) create mode 100644 src/apps/stable/routes/asyncRoutes/admin.ts rename src/apps/{experimental => stable}/routes/user/useredit.tsx (100%) rename src/apps/{experimental => stable}/routes/user/userlibraryaccess.tsx (100%) rename src/apps/{experimental => stable}/routes/user/usernew.tsx (100%) rename src/apps/{experimental => stable}/routes/user/userparentalcontrol.tsx (100%) rename src/apps/{experimental => stable}/routes/user/userpassword.tsx (100%) rename src/apps/{experimental => stable}/routes/user/userprofile.tsx (100%) rename src/apps/{experimental => stable}/routes/user/userprofiles.tsx (100%) delete mode 100644 src/controllers/dashboard/users/useredit.html delete mode 100644 src/controllers/dashboard/users/useredit.js delete mode 100644 src/controllers/dashboard/users/userlibraryaccess.html delete mode 100644 src/controllers/dashboard/users/userlibraryaccess.js delete mode 100644 src/controllers/dashboard/users/usernew.html delete mode 100644 src/controllers/dashboard/users/usernew.js delete mode 100644 src/controllers/dashboard/users/userparentalcontrol.html delete mode 100644 src/controllers/dashboard/users/userparentalcontrol.js delete mode 100644 src/controllers/dashboard/users/userpassword.html delete mode 100644 src/controllers/dashboard/users/userpasswordpage.js delete mode 100644 src/controllers/dashboard/users/userprofiles.html delete mode 100644 src/controllers/dashboard/users/userprofilespage.js delete mode 100644 src/controllers/user/profile/index.html delete mode 100644 src/controllers/user/profile/index.js diff --git a/src/apps/experimental/routes/asyncRoutes/admin.ts b/src/apps/experimental/routes/asyncRoutes/admin.ts index 6212330f96..0f2ec6b9cf 100644 --- a/src/apps/experimental/routes/asyncRoutes/admin.ts +++ b/src/apps/experimental/routes/asyncRoutes/admin.ts @@ -1,10 +1,10 @@ -import { AsyncRoute, AsyncRouteType } from '../../../../components/router/AsyncRoute'; +import { AsyncRoute } from '../../../../components/router/AsyncRoute'; export const ASYNC_ADMIN_ROUTES: AsyncRoute[] = [ - { path: 'usernew.html', page: 'user/usernew', type: AsyncRouteType.Experimental }, - { path: 'userprofiles.html', page: 'user/userprofiles', type: AsyncRouteType.Experimental }, - { path: 'useredit.html', page: 'user/useredit', type: AsyncRouteType.Experimental }, - { path: 'userlibraryaccess.html', page: 'user/userlibraryaccess', type: AsyncRouteType.Experimental }, - { path: 'userparentalcontrol.html', page: 'user/userparentalcontrol', type: AsyncRouteType.Experimental }, - { path: 'userpassword.html', page: 'user/userpassword', type: AsyncRouteType.Experimental } + { path: 'usernew.html', page: 'user/usernew' }, + { path: 'userprofiles.html', page: 'user/userprofiles' }, + { path: 'useredit.html', page: 'user/useredit' }, + { path: 'userlibraryaccess.html', page: 'user/userlibraryaccess' }, + { path: 'userparentalcontrol.html', page: 'user/userparentalcontrol' }, + { path: 'userpassword.html', page: 'user/userpassword' } ]; diff --git a/src/apps/experimental/routes/asyncRoutes/user.ts b/src/apps/experimental/routes/asyncRoutes/user.ts index 311b691b54..d7ea0dd7d4 100644 --- a/src/apps/experimental/routes/asyncRoutes/user.ts +++ b/src/apps/experimental/routes/asyncRoutes/user.ts @@ -2,7 +2,7 @@ import { AsyncRoute, AsyncRouteType } from '../../../../components/router/AsyncR export const ASYNC_USER_ROUTES: AsyncRoute[] = [ { path: 'search.html', page: 'search' }, - { path: 'userprofile.html', page: 'user/userprofile', type: AsyncRouteType.Experimental }, + { path: 'userprofile.html', page: 'user/userprofile' }, { path: 'home.html', page: 'home', type: AsyncRouteType.Experimental }, { path: 'movies.html', page: 'movies', type: AsyncRouteType.Experimental } ]; diff --git a/src/apps/stable/routes/AppRoutes.tsx b/src/apps/stable/routes/AppRoutes.tsx index cdeaedfe54..fb3527da75 100644 --- a/src/apps/stable/routes/AppRoutes.tsx +++ b/src/apps/stable/routes/AppRoutes.tsx @@ -5,7 +5,7 @@ import ConnectionRequired from '../../../components/ConnectionRequired'; import ServerContentPage from '../../../components/ServerContentPage'; import { toAsyncPageRoute } from '../../../components/router/AsyncRoute'; import { toViewManagerPageRoute } from '../../../components/router/LegacyRoute'; -import { ASYNC_USER_ROUTES } from './asyncRoutes'; +import { ASYNC_ADMIN_ROUTES, ASYNC_USER_ROUTES } from './asyncRoutes'; import { LEGACY_ADMIN_ROUTES, LEGACY_PUBLIC_ROUTES, LEGACY_USER_ROUTES } from './legacyRoutes'; export const AppRoutes = () => ( @@ -19,6 +19,7 @@ export const AppRoutes = () => ( {/* Admin routes */} }> + {ASYNC_ADMIN_ROUTES.map(toAsyncPageRoute)} {LEGACY_ADMIN_ROUTES.map(toViewManagerPageRoute)} - -
-
- -
-
-

- ${Help} -
-
- - -

- ${ButtonEditOtherUserPreferences} -

-
- - -
- -
- -
- -
${AuthProviderHelp}
-
- -
- -
${PasswordResetProviderHelp}
-
- -
- -
${AllowRemoteAccessHelp}
-
- - -
-

${HeaderFeatureAccess}

-
- - -
-
-
-

${HeaderPlayback}

-
- - - - - -
-
${OptionAllowMediaPlaybackTranscodingHelp}
-
-
-
-
- -
${LabelRemoteClientBitrateLimitHelp}
-
${LabelUserRemoteClientBitrateLimitHelp}
-
-
-
-
- -
${SyncPlayAccessHelp}
-
-
-
-

${HeaderAllowMediaDeletionFrom}

-
- -
-
-
-
-
-

${HeaderRemoteControl}

-
- - - -
-
${OptionAllowRemoteSharedDevicesHelp}
-
-

${Other}

-
- -
${OptionAllowContentDownloadHelp}
-
-
- -
${OptionDisableUserHelp}
-
-
- -
${OptionHideUserFromLoginHelp}
-
-
-
-
- -
${OptionLoginAttemptsBeforeLockout}
-
${OptionLoginAttemptsBeforeLockoutHelp}
-
-
-
-
-
- -
${OptionMaxActiveSessions}
-
${OptionMaxActiveSessionsHelp}
-
-
-
-
- - - -
-
-
-
- diff --git a/src/controllers/dashboard/users/useredit.js b/src/controllers/dashboard/users/useredit.js deleted file mode 100644 index 98aa0dd40e..0000000000 --- a/src/controllers/dashboard/users/useredit.js +++ /dev/null @@ -1,196 +0,0 @@ -import 'jquery'; -import loading from '../../../components/loading/loading'; -import libraryMenu from '../../../scripts/libraryMenu'; -import globalize from '../../../scripts/globalize'; -import Dashboard from '../../../utils/dashboard'; -import toast from '../../../components/toast/toast'; -import { getParameterByName } from '../../../utils/url.ts'; - -function loadDeleteFolders(page, user, mediaFolders) { - ApiClient.getJSON(ApiClient.getUrl('Channels', { - SupportsMediaDeletion: true - })).then(function (channelsResult) { - let isChecked; - let checkedAttribute; - let html = ''; - - for (const folder of mediaFolders) { - isChecked = user.Policy.EnableContentDeletion || user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id) != -1; - checkedAttribute = isChecked ? ' checked="checked"' : ''; - html += ''; - } - - for (const folder of channelsResult.Items) { - isChecked = user.Policy.EnableContentDeletion || user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id) != -1; - checkedAttribute = isChecked ? ' checked="checked"' : ''; - html += ''; - } - - $('.deleteAccess', page).html(html).trigger('create'); - $('#chkEnableDeleteAllFolders', page).prop('checked', user.Policy.EnableContentDeletion); - }); -} - -function loadAuthProviders(page, user, providers) { - if (providers.length > 1) { - page.querySelector('.fldSelectLoginProvider').classList.remove('hide'); - } else { - page.querySelector('.fldSelectLoginProvider').classList.add('hide'); - } - - const currentProviderId = user.Policy.AuthenticationProviderId; - page.querySelector('.selectLoginProvider').innerHTML = providers.map(function (provider) { - const selected = provider.Id === currentProviderId || providers.length < 2 ? ' selected' : ''; - return ''; - }); -} - -function loadPasswordResetProviders(page, user, providers) { - if (providers.length > 1) { - page.querySelector('.fldSelectPasswordResetProvider').classList.remove('hide'); - } else { - page.querySelector('.fldSelectPasswordResetProvider').classList.add('hide'); - } - - const currentProviderId = user.Policy.PasswordResetProviderId; - page.querySelector('.selectPasswordResetProvider').innerHTML = providers.map(function (provider) { - const selected = provider.Id === currentProviderId || providers.length < 2 ? ' selected' : ''; - return ''; - }); -} - -function loadUser(page, user) { - ApiClient.getJSON(ApiClient.getUrl('Auth/Providers')).then(function (providers) { - loadAuthProviders(page, user, providers); - }); - ApiClient.getJSON(ApiClient.getUrl('Auth/PasswordResetProviders')).then(function (providers) { - loadPasswordResetProviders(page, user, providers); - }); - ApiClient.getJSON(ApiClient.getUrl('Library/MediaFolders', { - IsHidden: false - })).then(function (folders) { - loadDeleteFolders(page, user, folders.Items); - }); - - if (user.Policy.IsDisabled) { - $('.disabledUserBanner', page).show(); - } else { - $('.disabledUserBanner', page).hide(); - } - - $('#txtUserName', page).prop('disabled', '').removeAttr('disabled'); - $('#fldConnectInfo', page).show(); - $('.lnkEditUserPreferences', page).attr('href', 'mypreferencesmenu.html?userId=' + user.Id); - libraryMenu.setTitle(user.Name); - page.querySelector('.username').innerHTML = user.Name; - $('#txtUserName', page).val(user.Name); - $('#chkIsAdmin', page).prop('checked', user.Policy.IsAdministrator); - $('#chkDisabled', page).prop('checked', user.Policy.IsDisabled); - $('#chkIsHidden', page).prop('checked', user.Policy.IsHidden); - $('#chkEnableCollectionManagement', page).prop('checked', user.Policy.chkEnableCollectionManagement); - $('#chkRemoteControlSharedDevices', page).prop('checked', user.Policy.EnableSharedDeviceControl); - $('#chkEnableRemoteControlOtherUsers', page).prop('checked', user.Policy.EnableRemoteControlOfOtherUsers); - $('#chkEnableDownloading', page).prop('checked', user.Policy.EnableContentDownloading); - $('#chkManageLiveTv', page).prop('checked', user.Policy.EnableLiveTvManagement); - $('#chkEnableLiveTvAccess', page).prop('checked', user.Policy.EnableLiveTvAccess); - $('#chkEnableMediaPlayback', page).prop('checked', user.Policy.EnableMediaPlayback); - $('#chkEnableAudioPlaybackTranscoding', page).prop('checked', user.Policy.EnableAudioPlaybackTranscoding); - $('#chkEnableVideoPlaybackTranscoding', page).prop('checked', user.Policy.EnableVideoPlaybackTranscoding); - $('#chkEnableVideoPlaybackRemuxing', page).prop('checked', user.Policy.EnablePlaybackRemuxing); - $('#chkForceRemoteSourceTranscoding', page).prop('checked', user.Policy.ForceRemoteSourceTranscoding); - $('#chkRemoteAccess', page).prop('checked', user.Policy.EnableRemoteAccess == null || user.Policy.EnableRemoteAccess); - $('#txtRemoteClientBitrateLimit', page).val(user.Policy.RemoteClientBitrateLimit / 1e6 || ''); - $('#txtLoginAttemptsBeforeLockout', page).val(user.Policy.LoginAttemptsBeforeLockout || '0'); - $('#txtMaxActiveSessions', page).val(user.Policy.MaxActiveSessions || '0'); - if (ApiClient.isMinServerVersion('10.6.0')) { - $('#selectSyncPlayAccess').val(user.Policy.SyncPlayAccess); - } - loading.hide(); -} - -function onSaveComplete() { - Dashboard.navigate('userprofiles.html'); - loading.hide(); - toast(globalize.translate('SettingsSaved')); -} - -function saveUser(user, page) { - user.Name = $('#txtUserName', page).val(); - user.Policy.IsAdministrator = $('#chkIsAdmin', page).is(':checked'); - user.Policy.IsHidden = $('#chkIsHidden', page).is(':checked'); - user.Policy.IsDisabled = $('#chkDisabled', page).is(':checked'); - user.Policy.EnableRemoteControlOfOtherUsers = $('#chkEnableRemoteControlOtherUsers', page).is(':checked'); - user.Policy.EnableLiveTvManagement = $('#chkManageLiveTv', page).is(':checked'); - user.Policy.EnableLiveTvAccess = $('#chkEnableLiveTvAccess', page).is(':checked'); - user.Policy.EnableSharedDeviceControl = $('#chkRemoteControlSharedDevices', page).is(':checked'); - user.Policy.EnableMediaPlayback = $('#chkEnableMediaPlayback', page).is(':checked'); - user.Policy.EnableAudioPlaybackTranscoding = $('#chkEnableAudioPlaybackTranscoding', page).is(':checked'); - user.Policy.EnableVideoPlaybackTranscoding = $('#chkEnableVideoPlaybackTranscoding', page).is(':checked'); - user.Policy.EnablePlaybackRemuxing = $('#chkEnableVideoPlaybackRemuxing', page).is(':checked'); - user.Policy.EnableCollectionManagement = $('#chkEnableCollectionManagement', page).is(':checked'); - user.Policy.ForceRemoteSourceTranscoding = $('#chkForceRemoteSourceTranscoding', page).is(':checked'); - user.Policy.EnableContentDownloading = $('#chkEnableDownloading', page).is(':checked'); - user.Policy.EnableRemoteAccess = $('#chkRemoteAccess', page).is(':checked'); - user.Policy.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($('#txtRemoteClientBitrateLimit', page).val() || '0'), 10); - user.Policy.LoginAttemptsBeforeLockout = parseInt($('#txtLoginAttemptsBeforeLockout', page).val() || '0', 10); - user.Policy.MaxActiveSessions = parseInt($('#txtMaxActiveSessions', page).val() || '0', 10); - user.Policy.AuthenticationProviderId = page.querySelector('.selectLoginProvider').value; - user.Policy.PasswordResetProviderId = page.querySelector('.selectPasswordResetProvider').value; - user.Policy.EnableContentDeletion = $('#chkEnableDeleteAllFolders', page).is(':checked'); - user.Policy.EnableContentDeletionFromFolders = user.Policy.EnableContentDeletion ? [] : $('.chkFolder', page).get().filter(function (c) { - return c.checked; - }).map(function (c) { - return c.getAttribute('data-id'); - }); - if (ApiClient.isMinServerVersion('10.6.0')) { - user.Policy.SyncPlayAccess = page.querySelector('#selectSyncPlayAccess').value; - } - ApiClient.updateUser(user).then(function () { - ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () { - onSaveComplete(); - }); - }); -} - -function onSubmit() { - const page = $(this).parents('.page')[0]; - loading.show(); - getUser().then(function (result) { - saveUser(result, page); - }); - return false; -} - -function getUser() { - const userId = getParameterByName('userId'); - return ApiClient.getUser(userId); -} - -function loadData(page) { - loading.show(); - getUser().then(function (user) { - loadUser(page, user); - }); -} - -$(document).on('pageinit', '#editUserPage', function () { - $('.editUserProfileForm').off('submit', onSubmit).on('submit', onSubmit); - const page = this; - $('#chkEnableDeleteAllFolders', this).on('change', function () { - if (this.checked) { - $('.deleteAccess', page).hide(); - } else { - $('.deleteAccess', page).show(); - } - }); - ApiClient.getServerConfiguration().then(function (config) { - if (config.EnableRemoteAccess) { - page.querySelector('.fldRemoteAccess').classList.remove('hide'); - } else { - page.querySelector('.fldRemoteAccess').classList.add('hide'); - } - }); -}).on('pagebeforeshow', '#editUserPage', function () { - loadData(this); -}); - diff --git a/src/controllers/dashboard/users/userlibraryaccess.html b/src/controllers/dashboard/users/userlibraryaccess.html deleted file mode 100644 index bf6ba93408..0000000000 --- a/src/controllers/dashboard/users/userlibraryaccess.html +++ /dev/null @@ -1,68 +0,0 @@ -
- -
-
- -
-
-

- ${Help} -
-
- - -
- -
-

${HeaderLibraryAccess}

- -
-
-
-
${LibraryAccessHelp}
-
-
- -
-
-

${HeaderDeviceAccess}

- -
-
-
-
${DeviceAccessHelp}
-
-
-
-
-
- -
-
-
-
-
diff --git a/src/controllers/dashboard/users/userlibraryaccess.js b/src/controllers/dashboard/users/userlibraryaccess.js deleted file mode 100644 index e84638e8e0..0000000000 --- a/src/controllers/dashboard/users/userlibraryaccess.js +++ /dev/null @@ -1,184 +0,0 @@ -import 'jquery'; -import loading from '../../../components/loading/loading'; -import libraryMenu from '../../../scripts/libraryMenu'; -import globalize from '../../../scripts/globalize'; -import Dashboard from '../../../utils/dashboard'; -import toast from '../../../components/toast/toast'; -import { getParameterByName } from '../../../utils/url.ts'; - -function triggerChange(select) { - const evt = document.createEvent('HTMLEvents'); - evt.initEvent('change', false, true); - select.dispatchEvent(evt); -} - -function loadMediaFolders(page, user, mediaFolders) { - let html = ''; - html += '

' + globalize.translate('HeaderLibraries') + '

'; - html += '
'; - - for (let i = 0, length = mediaFolders.length; i < length; i++) { - const folder = mediaFolders[i]; - const isChecked = user.Policy.EnableAllFolders || user.Policy.EnabledFolders.indexOf(folder.Id) != -1; - const checkedAttribute = isChecked ? ' checked="checked"' : ''; - html += ''; - } - - html += '
'; - page.querySelector('.folderAccess').innerHTML = html; - const chkEnableAllFolders = page.querySelector('#chkEnableAllFolders'); - chkEnableAllFolders.checked = user.Policy.EnableAllFolders; - triggerChange(chkEnableAllFolders); -} - -function loadChannels(page, user, channels) { - let html = ''; - html += '

' + globalize.translate('Channels') + '

'; - html += '
'; - - for (let i = 0, length = channels.length; i < length; i++) { - const folder = channels[i]; - const isChecked = user.Policy.EnableAllChannels || user.Policy.EnabledChannels.indexOf(folder.Id) != -1; - const checkedAttribute = isChecked ? ' checked="checked"' : ''; - html += ''; - } - - html += '
'; - $('.channelAccess', page).show().html(html); - - if (channels.length) { - $('.channelAccessContainer', page).show(); - } else { - $('.channelAccessContainer', page).hide(); - } - - const chkEnableAllChannels = page.querySelector('#chkEnableAllChannels'); - chkEnableAllChannels.checked = user.Policy.EnableAllChannels; - triggerChange(chkEnableAllChannels); -} - -function loadDevices(page, user, devices) { - let html = ''; - html += '

' + globalize.translate('HeaderDevices') + '

'; - html += '
'; - - for (let i = 0, length = devices.length; i < length; i++) { - const device = devices[i]; - const checkedAttribute = user.Policy.EnableAllDevices || user.Policy.EnabledDevices.indexOf(device.Id) != -1 ? ' checked="checked"' : ''; - html += ''; - } - - html += '
'; - $('.deviceAccess', page).show().html(html); - const chkEnableAllDevices = page.querySelector('#chkEnableAllDevices'); - chkEnableAllDevices.checked = user.Policy.EnableAllDevices; - triggerChange(chkEnableAllDevices); - - if (user.Policy.IsAdministrator) { - page.querySelector('.deviceAccessContainer').classList.add('hide'); - } else { - page.querySelector('.deviceAccessContainer').classList.remove('hide'); - } -} - -function loadUser(page, user, loggedInUser, mediaFolders, channels, devices) { - page.querySelector('.username').innerHTML = user.Name; - libraryMenu.setTitle(user.Name); - loadChannels(page, user, channels); - loadMediaFolders(page, user, mediaFolders); - loadDevices(page, user, devices); - loading.hide(); -} - -function onSaveComplete() { - loading.hide(); - toast(globalize.translate('SettingsSaved')); -} - -function saveUser(user, page) { - user.Policy.EnableAllFolders = $('#chkEnableAllFolders', page).is(':checked'); - user.Policy.EnabledFolders = user.Policy.EnableAllFolders ? [] : $('.chkFolder', page).get().filter(function (c) { - return c.checked; - }).map(function (c) { - return c.getAttribute('data-id'); - }); - user.Policy.EnableAllChannels = $('#chkEnableAllChannels', page).is(':checked'); - user.Policy.EnabledChannels = user.Policy.EnableAllChannels ? [] : $('.chkChannel', page).get().filter(function (c) { - return c.checked; - }).map(function (c) { - return c.getAttribute('data-id'); - }); - user.Policy.EnableAllDevices = $('#chkEnableAllDevices', page).is(':checked'); - user.Policy.EnabledDevices = user.Policy.EnableAllDevices ? [] : $('.chkDevice', page).get().filter(function (c) { - return c.checked; - }).map(function (c) { - return c.getAttribute('data-id'); - }); - user.Policy.BlockedChannels = null; - user.Policy.BlockedMediaFolders = null; - ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () { - onSaveComplete(); - }); -} - -function onSubmit() { - const page = $(this).parents('.page'); - loading.show(); - const userId = getParameterByName('userId'); - ApiClient.getUser(userId).then(function (result) { - saveUser(result, page); - }); - return false; -} - -$(document).on('pageinit', '#userLibraryAccessPage', function () { - const page = this; - $('#chkEnableAllDevices', page).on('change', function () { - if (this.checked) { - $('.deviceAccessListContainer', page).hide(); - } else { - $('.deviceAccessListContainer', page).show(); - } - }); - $('#chkEnableAllChannels', page).on('change', function () { - if (this.checked) { - $('.channelAccessListContainer', page).hide(); - } else { - $('.channelAccessListContainer', page).show(); - } - }); - page.querySelector('#chkEnableAllFolders').addEventListener('change', function () { - if (this.checked) { - page.querySelector('.folderAccessListContainer').classList.add('hide'); - } else { - page.querySelector('.folderAccessListContainer').classList.remove('hide'); - } - }); - $('.userLibraryAccessForm').off('submit', onSubmit).on('submit', onSubmit); -}).on('pageshow', '#userLibraryAccessPage', function () { - const page = this; - loading.show(); - let promise1; - const userId = getParameterByName('userId'); - - if (userId) { - promise1 = ApiClient.getUser(userId); - } else { - const deferred = $.Deferred(); - deferred.resolveWith(null, [{ - Configuration: {} - }]); - promise1 = deferred.promise(); - } - - const promise2 = Dashboard.getCurrentUser(); - const promise4 = ApiClient.getJSON(ApiClient.getUrl('Library/MediaFolders', { - IsHidden: false - })); - const promise5 = ApiClient.getJSON(ApiClient.getUrl('Channels')); - const promise6 = ApiClient.getJSON(ApiClient.getUrl('Devices')); - Promise.all([promise1, promise2, promise4, promise5, promise6]).then(function (responses) { - loadUser(page, responses[0], responses[1], responses[2].Items, responses[3].Items, responses[4].Items); - }); -}); - diff --git a/src/controllers/dashboard/users/usernew.html b/src/controllers/dashboard/users/usernew.html deleted file mode 100644 index 5d50ede80a..0000000000 --- a/src/controllers/dashboard/users/usernew.html +++ /dev/null @@ -1,62 +0,0 @@ -
-
-
-
-
-
-

${ButtonAddUser}

- ${Help} -
- -
- -
- -
- -
-
- -
-

${HeaderLibraryAccess}

-
- -
${LibraryAccessHelp}
-
-
-
-
-
-
- - - -
- - - -
-
-
-
-
diff --git a/src/controllers/dashboard/users/usernew.js b/src/controllers/dashboard/users/usernew.js deleted file mode 100644 index 9477506aca..0000000000 --- a/src/controllers/dashboard/users/usernew.js +++ /dev/null @@ -1,128 +0,0 @@ -import 'jquery'; -import loading from '../../../components/loading/loading'; -import globalize from '../../../scripts/globalize'; -import '../../../elements/emby-checkbox/emby-checkbox'; -import Dashboard from '../../../utils/dashboard'; -import toast from '../../../components/toast/toast'; - -function loadMediaFolders(page, mediaFolders) { - let html = ''; - html += '

' + globalize.translate('HeaderLibraries') + '

'; - html += '
'; - - for (let i = 0; i < mediaFolders.length; i++) { - const folder = mediaFolders[i]; - html += ''; - } - - html += '
'; - $('.folderAccess', page).html(html).trigger('create'); - $('#chkEnableAllFolders', page).prop('checked', false); -} - -function loadChannels(page, channels) { - let html = ''; - html += '

' + globalize.translate('Channels') + '

'; - html += '
'; - - for (let i = 0; i < channels.length; i++) { - const folder = channels[i]; - html += ''; - } - - html += '
'; - $('.channelAccess', page).show().html(html).trigger('create'); - - if (channels.length) { - $('.channelAccessContainer', page).show(); - } else { - $('.channelAccessContainer', page).hide(); - } - - $('#chkEnableAllChannels', page).prop('checked', false); -} - -function loadUser(page) { - $('#txtUsername', page).val(''); - $('#txtPassword', page).val(''); - loading.show(); - const promiseFolders = ApiClient.getJSON(ApiClient.getUrl('Library/MediaFolders', { - IsHidden: false - })); - const promiseChannels = ApiClient.getJSON(ApiClient.getUrl('Channels')); - Promise.all([promiseFolders, promiseChannels]).then(function (responses) { - loadMediaFolders(page, responses[0].Items); - loadChannels(page, responses[1].Items); - loading.hide(); - }); -} - -function saveUser(page) { - const _user = { - Name: $('#txtUsername', page).val(), - Password: $('#txtPassword', page).val() - }; - ApiClient.createUser(_user).then(function (user) { - user.Policy.EnableAllFolders = $('#chkEnableAllFolders', page).is(':checked'); - user.Policy.EnabledFolders = []; - - if (!user.Policy.EnableAllFolders) { - user.Policy.EnabledFolders = $('.chkFolder', page).get().filter(function (i) { - return i.checked; - }).map(function (i) { - return i.getAttribute('data-id'); - }); - } - - user.Policy.EnableAllChannels = $('#chkEnableAllChannels', page).is(':checked'); - user.Policy.EnabledChannels = []; - - if (!user.Policy.EnableAllChannels) { - user.Policy.EnabledChannels = $('.chkChannel', page).get().filter(function (i) { - return i.checked; - }).map(function (i) { - return i.getAttribute('data-id'); - }); - } - - ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () { - Dashboard.navigate('useredit.html?userId=' + user.Id); - }); - }, function () { - toast(globalize.translate('ErrorDefault')); - loading.hide(); - }); -} - -function onSubmit() { - const page = $(this).parents('.page')[0]; - loading.show(); - saveUser(page); - return false; -} - -function loadData(page) { - loadUser(page); -} - -$(document).on('pageinit', '#newUserPage', function () { - const page = this; - $('#chkEnableAllChannels', page).on('change', function () { - if (this.checked) { - $('.channelAccessListContainer', page).hide(); - } else { - $('.channelAccessListContainer', page).show(); - } - }); - $('#chkEnableAllFolders', page).on('change', function () { - if (this.checked) { - $('.folderAccessListContainer', page).hide(); - } else { - $('.folderAccessListContainer', page).show(); - } - }); - $('.newUserProfileForm').off('submit', onSubmit).on('submit', onSubmit); -}).on('pageshow', '#newUserPage', function () { - loadData(this); -}); - diff --git a/src/controllers/dashboard/users/userparentalcontrol.html b/src/controllers/dashboard/users/userparentalcontrol.html deleted file mode 100644 index 5b58047c60..0000000000 --- a/src/controllers/dashboard/users/userparentalcontrol.html +++ /dev/null @@ -1,60 +0,0 @@ -
-
-
-
-
-

- ${Help} -
-
- - - -
-
- -
${MaxParentalRatingHelp}
-
- -
-
-
- -
- -
-
-

${LabelBlockContentWithTags}

- -
-
-
- -
-
-

${HeaderAccessSchedule}

- -
- -

${HeaderAccessScheduleHelp}

-
-
- -
- -
-
-
-
-
diff --git a/src/controllers/dashboard/users/userparentalcontrol.js b/src/controllers/dashboard/users/userparentalcontrol.js deleted file mode 100644 index 0b527e09ef..0000000000 --- a/src/controllers/dashboard/users/userparentalcontrol.js +++ /dev/null @@ -1,278 +0,0 @@ -import 'jquery'; -import datetime from '../../../scripts/datetime'; -import loading from '../../../components/loading/loading'; -import libraryMenu from '../../../scripts/libraryMenu'; -import globalize from '../../../scripts/globalize'; -import '../../../components/listview/listview.scss'; -import '../../../elements/emby-button/paper-icon-button-light'; -import toast from '../../../components/toast/toast'; -import { getParameterByName } from '../../../utils/url.ts'; - -function populateRatings(allParentalRatings, page) { - let html = ''; - html += ""; - let rating; - const ratings = []; - - for (let i = 0, length = allParentalRatings.length; i < length; i++) { - rating = allParentalRatings[i]; - if (ratings.length) { - const lastRating = ratings[ratings.length - 1]; - - if (lastRating.Value === rating.Value) { - lastRating.Name += '/' + rating.Name; - continue; - } - } - - ratings.push({ - Name: rating.Name, - Value: rating.Value - }); - } - - for (let i = 0, length = ratings.length; i < length; i++) { - rating = ratings[i]; - html += "'; - } - - $('#selectMaxParentalRating', page).html(html); -} - -function loadUnratedItems(page, user) { - const items = [{ - name: globalize.translate('Books'), - value: 'Book' - }, { - name: globalize.translate('Channels'), - value: 'ChannelContent' - }, { - name: globalize.translate('LiveTV'), - value: 'LiveTvChannel' - }, { - name: globalize.translate('Movies'), - value: 'Movie' - }, { - name: globalize.translate('Music'), - value: 'Music' - }, { - name: globalize.translate('Trailers'), - value: 'Trailer' - }, { - name: globalize.translate('Shows'), - value: 'Series' - }]; - let html = ''; - html += '

' + globalize.translate('HeaderBlockItemsWithNoRating') + '

'; - html += '
'; - - for (let i = 0, length = items.length; i < length; i++) { - const item = items[i]; - const checkedAttribute = user.Policy.BlockUnratedItems.indexOf(item.value) != -1 ? ' checked="checked"' : ''; - html += ''; - } - - html += '
'; - $('.blockUnratedItems', page).html(html).trigger('create'); -} - -function loadUser(page, user, allParentalRatings) { - page.querySelector('.username').innerHTML = user.Name; - libraryMenu.setTitle(user.Name); - loadUnratedItems(page, user); - loadBlockedTags(page, user.Policy.BlockedTags); - populateRatings(allParentalRatings, page); - let ratingValue = ''; - - if (user.Policy.MaxParentalRating) { - for (let i = 0, length = allParentalRatings.length; i < length; i++) { - const rating = allParentalRatings[i]; - - if (user.Policy.MaxParentalRating >= rating.Value) { - ratingValue = rating.Value; - } - } - } - - $('#selectMaxParentalRating', page).val(ratingValue); - - if (user.Policy.IsAdministrator) { - $('.accessScheduleSection', page).hide(); - } else { - $('.accessScheduleSection', page).show(); - } - - renderAccessSchedule(page, user.Policy.AccessSchedules || []); - loading.hide(); -} - -function loadBlockedTags(page, tags) { - let html = tags.map(function (h) { - let li = '
'; - li += '
'; - li += '

'; - li += h; - li += '

'; - li += '
'; - li += ''; - li += '
'; - return li; - }).join(''); - - if (html) { - html = '
' + html + '
'; - } - - const blockedTags = page.querySelector('.blockedTags'); - blockedTags.innerHTML = html; - - for (const btnDeleteTag of blockedTags.querySelectorAll('.btnDeleteTag')) { - btnDeleteTag.addEventListener('click', function () { - const tag = this.getAttribute('data-tag'); - const newTags = tags.filter(function (t) { - return t != tag; - }); - loadBlockedTags(page, newTags); - }); - } -} - -function deleteAccessSchedule(page, schedules, index) { - schedules.splice(index, 1); - renderAccessSchedule(page, schedules); -} - -function renderAccessSchedule(page, schedules) { - let html = ''; - let index = 0; - html += schedules.map(function (a) { - let itemHtml = ''; - itemHtml += '
'; - itemHtml += '
'; - itemHtml += '

'; - itemHtml += globalize.translate('Option' + a.DayOfWeek); - itemHtml += '

'; - itemHtml += '
' + getDisplayTime(a.StartHour) + ' - ' + getDisplayTime(a.EndHour) + '
'; - itemHtml += '
'; - itemHtml += ''; - itemHtml += '
'; - index++; - return itemHtml; - }).join(''); - const accessScheduleList = page.querySelector('.accessScheduleList'); - accessScheduleList.innerHTML = html; - $('.btnDelete', accessScheduleList).on('click', function () { - deleteAccessSchedule(page, schedules, parseInt(this.getAttribute('data-index'), 10)); - }); -} - -function onSaveComplete() { - loading.hide(); - toast(globalize.translate('SettingsSaved')); -} - -function saveUser(user, page) { - user.Policy.MaxParentalRating = $('#selectMaxParentalRating', page).val() || null; - user.Policy.BlockUnratedItems = $('.chkUnratedItem', page).get().filter(function (i) { - return i.checked; - }).map(function (i) { - return i.getAttribute('data-itemtype'); - }); - user.Policy.AccessSchedules = getSchedulesFromPage(page); - user.Policy.BlockedTags = getBlockedTagsFromPage(page); - ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () { - onSaveComplete(); - }); -} - -function getDisplayTime(hours) { - let minutes = 0; - const pct = hours % 1; - - if (pct) { - minutes = parseInt(60 * pct, 10); - } - - return datetime.getDisplayTime(new Date(2000, 1, 1, hours, minutes, 0, 0)); -} - -function showSchedulePopup(page, schedule, index) { - schedule = schedule || {}; - import('../../../components/accessSchedule/accessSchedule').then(({ default: accessschedule }) => { - accessschedule.show({ - schedule: schedule - }).then(function (updatedSchedule) { - const schedules = getSchedulesFromPage(page); - - if (index == -1) { - index = schedules.length; - } - - schedules[index] = updatedSchedule; - renderAccessSchedule(page, schedules); - }); - }); -} - -function getSchedulesFromPage(page) { - return $('.liSchedule', page).map(function () { - return { - DayOfWeek: this.getAttribute('data-day'), - StartHour: this.getAttribute('data-start'), - EndHour: this.getAttribute('data-end') - }; - }).get(); -} - -function getBlockedTagsFromPage(page) { - return $('.blockedTag', page).map(function () { - return this.getAttribute('data-tag'); - }).get(); -} - -function showBlockedTagPopup(page) { - import('../../../components/prompt/prompt').then(({ default: prompt }) => { - prompt({ - label: globalize.translate('LabelTag') - }).then(function (value) { - const tags = getBlockedTagsFromPage(page); - - if (tags.indexOf(value) == -1) { - tags.push(value); - loadBlockedTags(page, tags); - } - }); - }); -} - -window.UserParentalControlPage = { - onSubmit: function () { - const page = $(this).parents('.page'); - loading.show(); - const userId = getParameterByName('userId'); - ApiClient.getUser(userId).then(function (result) { - saveUser(result, page); - }); - return false; - } -}; -$(document).on('pageinit', '#userParentalControlPage', function () { - const page = this; - $('.btnAddSchedule', page).on('click', function () { - showSchedulePopup(page, {}, -1); - }); - $('.btnAddBlockedTag', page).on('click', function () { - showBlockedTagPopup(page); - }); - $('.userParentalControlForm').off('submit', UserParentalControlPage.onSubmit).on('submit', UserParentalControlPage.onSubmit); -}).on('pageshow', '#userParentalControlPage', function () { - const page = this; - loading.show(); - const userId = getParameterByName('userId'); - const promise1 = ApiClient.getUser(userId); - const promise2 = ApiClient.getParentalRatings(); - Promise.all([promise1, promise2]).then(function (responses) { - loadUser(page, responses[0], responses[1]); - }); -}); - diff --git a/src/controllers/dashboard/users/userpassword.html b/src/controllers/dashboard/users/userpassword.html deleted file mode 100644 index 897f0e7bd5..0000000000 --- a/src/controllers/dashboard/users/userpassword.html +++ /dev/null @@ -1,72 +0,0 @@ -
-
-
-
-
-

- ${Help} -
-
- - - -
-
-
-
- -
-
- -
-
- -
-
-
- - -
-
-
-
-
-
-
- ${HeaderEasyPinCode} -
-
-
${EasyPasswordHelp}
-
-
- -
-
-
- -
${LabelInNetworkSignInWithEasyPasswordHelp}
-
-
- - -
-
-
-
-
-
-
diff --git a/src/controllers/dashboard/users/userpasswordpage.js b/src/controllers/dashboard/users/userpasswordpage.js deleted file mode 100644 index 4171c55d6e..0000000000 --- a/src/controllers/dashboard/users/userpasswordpage.js +++ /dev/null @@ -1,179 +0,0 @@ -import loading from '../../../components/loading/loading'; -import libraryMenu from '../../../scripts/libraryMenu'; -import globalize from '../../../scripts/globalize'; -import '../../../elements/emby-button/emby-button'; -import Dashboard from '../../../utils/dashboard'; -import toast from '../../../components/toast/toast'; -import confirm from '../../../components/confirm/confirm'; - -function loadUser(page, params) { - const userid = params.userId; - ApiClient.getUser(userid).then(function (user) { - Dashboard.getCurrentUser().then(function (loggedInUser) { - libraryMenu.setTitle(user.Name); - page.querySelector('.username').innerText = user.Name; - let showPasswordSection = true; - let showLocalAccessSection = false; - - if (user.ConnectLinkType == 'Guest') { - page.querySelector('.localAccessSection').classList.add('hide'); - showPasswordSection = false; - } else if (user.HasConfiguredPassword) { - page.querySelector('#btnResetPassword').classList.remove('hide'); - page.querySelector('#fldCurrentPassword').classList.remove('hide'); - showLocalAccessSection = true; - } else { - page.querySelector('#btnResetPassword').classList.add('hide'); - page.querySelector('#fldCurrentPassword').classList.add('hide'); - } - - if (showPasswordSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) { - page.querySelector('.passwordSection').classList.remove('hide'); - } else { - page.querySelector('.passwordSection').classList.add('hide'); - } - - if (showLocalAccessSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) { - page.querySelector('.localAccessSection').classList.remove('hide'); - } else { - page.querySelector('.localAccessSection').classList.add('hide'); - } - - const txtEasyPassword = page.querySelector('#txtEasyPassword'); - txtEasyPassword.value = ''; - - if (user.HasConfiguredEasyPassword) { - txtEasyPassword.placeholder = '******'; - page.querySelector('#btnResetEasyPassword').classList.remove('hide'); - } else { - txtEasyPassword.removeAttribute('placeholder'); - txtEasyPassword.placeholder = ''; - page.querySelector('#btnResetEasyPassword').classList.add('hide'); - } - - page.querySelector('.chkEnableLocalEasyPassword').checked = user.Configuration.EnableLocalPassword; - - import('../../../components/autoFocuser').then(({ default: autoFocuser }) => { - autoFocuser.autoFocus(page); - }); - }); - }); - page.querySelector('#txtCurrentPassword').value = ''; - page.querySelector('#txtNewPassword').value = ''; - page.querySelector('#txtNewPasswordConfirm').value = ''; -} - -export default function (view, params) { - function saveEasyPassword() { - const userId = params.userId; - const easyPassword = view.querySelector('#txtEasyPassword').value; - - if (easyPassword) { - ApiClient.updateEasyPassword(userId, easyPassword).then(function () { - onEasyPasswordSaved(userId); - }); - } else { - onEasyPasswordSaved(userId); - } - } - - function onEasyPasswordSaved(userId) { - ApiClient.getUser(userId).then(function (user) { - user.Configuration.EnableLocalPassword = view.querySelector('.chkEnableLocalEasyPassword').checked; - ApiClient.updateUserConfiguration(user.Id, user.Configuration).then(function () { - loading.hide(); - toast(globalize.translate('SettingsSaved')); - - loadUser(view, params); - }); - }); - } - - function savePassword() { - const userId = params.userId; - let currentPassword = view.querySelector('#txtCurrentPassword').value; - const newPassword = view.querySelector('#txtNewPassword').value; - - if (view.querySelector('#fldCurrentPassword').classList.contains('hide')) { - // Firefox does not respect autocomplete=off, so clear it if the field is supposed to be hidden (and blank) - // This should only happen when user.HasConfiguredPassword is false, but this information is not passed on - currentPassword = ''; - } - - ApiClient.updateUserPassword(userId, currentPassword, newPassword).then(function () { - loading.hide(); - toast(globalize.translate('PasswordSaved')); - - loadUser(view, params); - }, function () { - loading.hide(); - Dashboard.alert({ - title: globalize.translate('HeaderLoginFailure'), - message: globalize.translate('MessageInvalidUser') - }); - }); - } - - function onSubmit(e) { - const form = this; - - if (form.querySelector('#txtNewPassword').value != form.querySelector('#txtNewPasswordConfirm').value) { - toast(globalize.translate('PasswordMatchError')); - } else { - loading.show(); - savePassword(); - } - - e.preventDefault(); - return false; - } - - function onLocalAccessSubmit(e) { - loading.show(); - saveEasyPassword(); - e.preventDefault(); - return false; - } - - function resetPassword() { - const msg = globalize.translate('PasswordResetConfirmation'); - confirm(msg, globalize.translate('ResetPassword')).then(function () { - const userId = params.userId; - loading.show(); - ApiClient.resetUserPassword(userId).then(function () { - loading.hide(); - Dashboard.alert({ - message: globalize.translate('PasswordResetComplete'), - title: globalize.translate('ResetPassword') - }); - loadUser(view, params); - }); - }); - } - - function resetEasyPassword() { - const msg = globalize.translate('PinCodeResetConfirmation'); - - confirm(msg, globalize.translate('HeaderPinCodeReset')).then(function () { - const userId = params.userId; - loading.show(); - ApiClient.resetEasyPassword(userId).then(function () { - loading.hide(); - Dashboard.alert({ - message: globalize.translate('PinCodeResetComplete'), - title: globalize.translate('HeaderPinCodeReset') - }); - loadUser(view, params); - }); - }); - } - - view.querySelector('.updatePasswordForm').addEventListener('submit', onSubmit); - view.querySelector('.localAccessForm').addEventListener('submit', onLocalAccessSubmit); - view.querySelector('#btnResetEasyPassword').addEventListener('click', resetEasyPassword); - view.querySelector('#btnResetPassword').addEventListener('click', resetPassword); - view.addEventListener('viewshow', function () { - loadUser(view, params); - }); -} - diff --git a/src/controllers/dashboard/users/userprofiles.html b/src/controllers/dashboard/users/userprofiles.html deleted file mode 100644 index 9e2908266b..0000000000 --- a/src/controllers/dashboard/users/userprofiles.html +++ /dev/null @@ -1,16 +0,0 @@ -
-
-
-
-
-

${HeaderUsers}

- - ${Help} -
-
-
-
-
-
diff --git a/src/controllers/dashboard/users/userprofilespage.js b/src/controllers/dashboard/users/userprofilespage.js deleted file mode 100644 index 59d61a443f..0000000000 --- a/src/controllers/dashboard/users/userprofilespage.js +++ /dev/null @@ -1,184 +0,0 @@ -import loading from '../../../components/loading/loading'; -import dom from '../../../scripts/dom'; -import globalize from '../../../scripts/globalize'; -import { formatDistanceToNow } from 'date-fns'; -import { getLocaleWithSuffix } from '../../../utils/dateFnsLocale.ts'; -import '../../../elements/emby-button/paper-icon-button-light'; -import '../../../components/cardbuilder/card.scss'; -import '../../../elements/emby-button/emby-button'; -import '../../../components/indicators/indicators.scss'; -import '../../../styles/flexstyles.scss'; -import Dashboard, { pageIdOn } from '../../../utils/dashboard'; -import confirm from '../../../components/confirm/confirm'; -import cardBuilder from '../../../components/cardbuilder/cardBuilder'; - -function deleteUser(page, id) { - const msg = globalize.translate('DeleteUserConfirmation'); - - confirm({ - title: globalize.translate('DeleteUser'), - text: msg, - confirmText: globalize.translate('Delete'), - primary: 'delete' - }).then(function () { - loading.show(); - ApiClient.deleteUser(id).then(function () { - loadData(page); - }); - }); -} - -function showUserMenu(elem) { - const card = dom.parentWithClass(elem, 'card'); - const page = dom.parentWithClass(card, 'page'); - const userId = card.getAttribute('data-userid'); - const menuItems = []; - menuItems.push({ - name: globalize.translate('ButtonOpen'), - id: 'open', - icon: 'mode_edit' - }); - menuItems.push({ - name: globalize.translate('ButtonLibraryAccess'), - id: 'access', - icon: 'lock' - }); - menuItems.push({ - name: globalize.translate('ButtonParentalControl'), - id: 'parentalcontrol', - icon: 'person' - }); - menuItems.push({ - name: globalize.translate('Delete'), - id: 'delete', - icon: 'delete' - }); - - import('../../../components/actionSheet/actionSheet').then(({ default: actionsheet }) => { - actionsheet.show({ - items: menuItems, - positionTo: card, - callback: function (id) { - switch (id) { - case 'open': - Dashboard.navigate('useredit.html?userId=' + userId); - break; - - case 'access': - Dashboard.navigate('userlibraryaccess.html?userId=' + userId); - break; - - case 'parentalcontrol': - Dashboard.navigate('userparentalcontrol.html?userId=' + userId); - break; - - case 'delete': - deleteUser(page, userId); - } - } - }); - }); -} - -function getUserHtml(user) { - let html = ''; - let cssClass = 'card squareCard scalableCard squareCard-scalable'; - - if (user.Policy.IsDisabled) { - cssClass += ' grayscale'; - } - - html += "
"; - html += '
'; - html += '
'; - html += '
'; - html += ``; - let imgUrl; - - if (user.PrimaryImageTag) { - imgUrl = ApiClient.getUserImageUrl(user.Id, { - width: 300, - tag: user.PrimaryImageTag, - type: 'Primary' - }); - } - - let imageClass = 'cardImage'; - - if (user.Policy.IsDisabled) { - imageClass += ' disabledUser'; - } - - if (imgUrl) { - html += ''; - html += '
'; - html += '
'; - html += '
'; - html += user.Name; - html += '
'; - html += ''; - html += '
'; - html += '
'; - const lastSeen = getLastSeenText(user.LastActivityDate); - html += lastSeen != '' ? lastSeen : ' '; - html += '
'; - html += '
'; - html += '
'; - return html + '
'; -} -// FIXME: It seems that, sometimes, server sends date in the future, so date-fns displays messages like 'in less than a minute'. We should fix -// how dates are returned by the server when the session is active and show something like 'Active now', instead of past/future sentences -function getLastSeenText(lastActivityDate) { - const localeWithSuffix = getLocaleWithSuffix(); - - if (lastActivityDate) { - return globalize.translate('LastSeen', formatDistanceToNow(Date.parse(lastActivityDate), localeWithSuffix)); - } - - return ''; -} - -function getUserSectionHtml(users) { - return users.map(function (u__q) { - return getUserHtml(u__q); - }).join(''); -} - -function renderUsers(page, users) { - page.querySelector('.localUsers').innerHTML = getUserSectionHtml(users); -} - -function loadData(page) { - loading.show(); - ApiClient.getUsers().then(function (users) { - renderUsers(page, users); - loading.hide(); - }); -} - -pageIdOn('pageinit', 'userProfilesPage', function () { - const page = this; - page.querySelector('.btnAddUser').addEventListener('click', function() { - Dashboard.navigate('usernew.html'); - }); - page.querySelector('.localUsers').addEventListener('click', function (e__e) { - const btnUserMenu = dom.parentWithClass(e__e.target, 'btnUserMenu'); - - if (btnUserMenu) { - showUserMenu(btnUserMenu); - } - }); -}); - -pageIdOn('pagebeforeshow', 'userProfilesPage', function () { - loadData(this); -}); - diff --git a/src/controllers/user/profile/index.html b/src/controllers/user/profile/index.html deleted file mode 100644 index 3eaa2f7299..0000000000 --- a/src/controllers/user/profile/index.html +++ /dev/null @@ -1,69 +0,0 @@ -
-
-
-
- -
-
-
-

-
- - -
-
-
-
-

- ${HeaderPassword} -

-
- -
-
- -
-
- -
-
- - -
-
-
-
-
-

${HeaderEasyPinCode}

-
${EasyPasswordHelp}
-
-
- -
-
- -
${LabelInNetworkSignInWithEasyPasswordHelp}
-
-
- - -
-
-
-
-
diff --git a/src/controllers/user/profile/index.js b/src/controllers/user/profile/index.js deleted file mode 100644 index 07bab611c3..0000000000 --- a/src/controllers/user/profile/index.js +++ /dev/null @@ -1,105 +0,0 @@ -import UserPasswordPage from '../../dashboard/users/userpasswordpage'; -import loading from '../../../components/loading/loading'; -import libraryMenu from '../../../scripts/libraryMenu'; -import { appHost } from '../../../components/apphost'; -import globalize from '../../../scripts/globalize'; -import '../../../elements/emby-button/emby-button'; -import Dashboard from '../../../utils/dashboard'; -import toast from '../../../components/toast/toast'; -import confirm from '../../../components/confirm/confirm'; -import { getParameterByName } from '../../../utils/url.ts'; - -function reloadUser(page) { - const userId = getParameterByName('userId'); - loading.show(); - ApiClient.getUser(userId).then(function (user) { - page.querySelector('.username').innerText = user.Name; - libraryMenu.setTitle(user.Name); - - let imageUrl = 'assets/img/avatar.png'; - if (user.PrimaryImageTag) { - imageUrl = ApiClient.getUserImageUrl(user.Id, { - tag: user.PrimaryImageTag, - type: 'Primary' - }); - } - - const userImage = page.querySelector('#image'); - userImage.style.backgroundImage = 'url(' + imageUrl + ')'; - - Dashboard.getCurrentUser().then(function (loggedInUser) { - if (user.PrimaryImageTag) { - page.querySelector('#btnAddImage').classList.add('hide'); - page.querySelector('#btnDeleteImage').classList.remove('hide'); - } else if (appHost.supports('fileinput') && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) { - page.querySelector('#btnDeleteImage').classList.add('hide'); - page.querySelector('#btnAddImage').classList.remove('hide'); - } - }); - loading.hide(); - }); -} - -function onFileReaderError(evt) { - loading.hide(); - switch (evt.target.error.code) { - case evt.target.error.NOT_FOUND_ERR: - toast(globalize.translate('FileNotFound')); - break; - case evt.target.error.ABORT_ERR: - onFileReaderAbort(); - break; - case evt.target.error.NOT_READABLE_ERR: - default: - toast(globalize.translate('FileReadError')); - } -} - -function onFileReaderAbort() { - loading.hide(); - toast(globalize.translate('FileReadCancelled')); -} - -function setFiles(page, files) { - const userImage = page.querySelector('#image'); - const file = files[0]; - - if (!file || !file.type.match('image.*')) { - return false; - } - - const reader = new FileReader(); - reader.onerror = onFileReaderError; - reader.onabort = onFileReaderAbort; - reader.onload = function (evt) { - userImage.style.backgroundImage = 'url(' + evt.target.result + ')'; - const userId = getParameterByName('userId'); - ApiClient.uploadUserImage(userId, 'Primary', file).then(function () { - loading.hide(); - reloadUser(page); - }); - }; - - reader.readAsDataURL(file); -} - -export default function (view, params) { - reloadUser(view); - new UserPasswordPage(view, params); - view.querySelector('#btnDeleteImage').addEventListener('click', function () { - confirm(globalize.translate('DeleteImageConfirmation'), globalize.translate('DeleteImage')).then(function () { - loading.show(); - const userId = getParameterByName('userId'); - ApiClient.deleteUserImage(userId, 'primary').then(function () { - loading.hide(); - reloadUser(view); - }); - }); - }); - view.querySelector('#btnAddImage').addEventListener('click', function () { - view.querySelector('#uploadImage').click(); - }); - view.querySelector('#uploadImage').addEventListener('change', function (evt) { - setFiles(view, evt.target.files); - }); -}