From a589b9dbfbb34d30069e14de6f3607811ce9eebd Mon Sep 17 00:00:00 2001 From: grimsi <9295182+grimsi@users.noreply.github.com> Date: Sun, 30 Mar 2025 21:54:09 +0200 Subject: [PATCH] Start library management UI implementation Minor layout fixes Minor refactorings --- .../administration/ConfigFormField.tsx | 6 +-- .../administration/LibraryManagement.tsx | 37 +++++++++++++++++-- .../administration/PluginManagement.tsx | 4 +- .../administration/ProfileManagement.tsx | 2 +- .../administration/SsoManagement.tsx | 1 + .../administration/UserManagement.tsx | 6 +-- .../messages/SendTestNotificationModal.tsx | 2 +- .../administration/withConfigPage.tsx | 2 +- .../components/general/PluginLogo.tsx | 2 +- .../cards}/GameOverviewCard.tsx | 0 .../general/cards/LibraryOverviewCard.tsx | 13 +++++++ .../{ => cards}/PluginManagementCard.tsx | 2 +- .../{ => cards}/UserManagementCard.tsx | 6 +-- .../general/{ => input}/CheckboxInput.tsx | 0 .../components/general/{ => input}/Input.tsx | 0 .../general/{ => input}/SelectInput.tsx | 0 .../general/{ => modals}/AssignRolesModal.tsx | 0 .../{ => modals}/ConfirmUserDeletionModal.tsx | 0 .../general/{ => modals}/InviteUserModal.tsx | 0 .../{ => modals}/PasswordResetModal.tsx | 0 .../{ => modals}/PasswortResetTokenModal.tsx | 0 .../{ => modals}/PluginDetailsModal.tsx | 2 +- .../{ => modals}/PluginPrioritiesModal.tsx | 0 .../general/{ => modals}/SignUpModal.tsx | 2 +- .../frontend/views/AdministrationView.tsx | 3 +- .../views/InvitationRegistrationView.tsx | 2 +- .../src/main/frontend/views/LoginView.tsx | 6 +-- .../src/main/frontend/views/MainLayout.tsx | 2 +- .../main/frontend/views/PasswordResetView.tsx | 2 +- .../src/main/frontend/views/SetupView.tsx | 2 +- gameyfin/src/main/frontend/views/TestView.tsx | 2 +- .../de/grimsi/gameyfin/games/GameService.kt | 5 +++ plugins/igdb/build.gradle.kts | 2 +- 33 files changed, 81 insertions(+), 32 deletions(-) rename gameyfin/src/main/frontend/components/{games => general/cards}/GameOverviewCard.tsx (100%) create mode 100644 gameyfin/src/main/frontend/components/general/cards/LibraryOverviewCard.tsx rename gameyfin/src/main/frontend/components/general/{ => cards}/PluginManagementCard.tsx (98%) rename gameyfin/src/main/frontend/components/general/{ => cards}/UserManagementCard.tsx (97%) rename gameyfin/src/main/frontend/components/general/{ => input}/CheckboxInput.tsx (100%) rename gameyfin/src/main/frontend/components/general/{ => input}/Input.tsx (100%) rename gameyfin/src/main/frontend/components/general/{ => input}/SelectInput.tsx (100%) rename gameyfin/src/main/frontend/components/general/{ => modals}/AssignRolesModal.tsx (100%) rename gameyfin/src/main/frontend/components/general/{ => modals}/ConfirmUserDeletionModal.tsx (100%) rename gameyfin/src/main/frontend/components/general/{ => modals}/InviteUserModal.tsx (100%) rename gameyfin/src/main/frontend/components/general/{ => modals}/PasswordResetModal.tsx (100%) rename gameyfin/src/main/frontend/components/general/{ => modals}/PasswortResetTokenModal.tsx (100%) rename gameyfin/src/main/frontend/components/general/{ => modals}/PluginDetailsModal.tsx (98%) rename gameyfin/src/main/frontend/components/general/{ => modals}/PluginPrioritiesModal.tsx (100%) rename gameyfin/src/main/frontend/components/general/{ => modals}/SignUpModal.tsx (98%) diff --git a/gameyfin/src/main/frontend/components/administration/ConfigFormField.tsx b/gameyfin/src/main/frontend/components/administration/ConfigFormField.tsx index 8a66b3f..d64e669 100644 --- a/gameyfin/src/main/frontend/components/administration/ConfigFormField.tsx +++ b/gameyfin/src/main/frontend/components/administration/ConfigFormField.tsx @@ -1,8 +1,8 @@ import ConfigEntryDto from "Frontend/generated/de/grimsi/gameyfin/config/dto/ConfigEntryDto"; import React from "react"; -import Input from "Frontend/components/general/Input"; -import CheckboxInput from "Frontend/components/general/CheckboxInput"; -import SelectInput from "Frontend/components/general/SelectInput"; +import Input from "Frontend/components/general/input/Input"; +import CheckboxInput from "Frontend/components/general/input/CheckboxInput"; +import SelectInput from "Frontend/components/general/input/SelectInput"; export default function ConfigFormField({configElement, ...props}: any) { function inputElement(configElement: ConfigEntryDto) { diff --git a/gameyfin/src/main/frontend/components/administration/LibraryManagement.tsx b/gameyfin/src/main/frontend/components/administration/LibraryManagement.tsx index 28ab650..72c6a72 100644 --- a/gameyfin/src/main/frontend/components/administration/LibraryManagement.tsx +++ b/gameyfin/src/main/frontend/components/administration/LibraryManagement.tsx @@ -1,16 +1,27 @@ -import React from "react"; +import React, {useEffect} from "react"; import ConfigFormField from "Frontend/components/administration/ConfigFormField"; import withConfigPage from "Frontend/components/administration/withConfigPage"; import Section from "Frontend/components/general/Section"; import * as Yup from 'yup'; +import {Button, Divider, Tooltip} from "@heroui/react"; +import {Plus} from "@phosphor-icons/react"; +import {LibraryEndpoint} from "Frontend/generated/endpoints"; +import LibraryDto from "Frontend/generated/de/grimsi/gameyfin/libraries/LibraryDto"; +import {LibraryOverviewCard} from "Frontend/components/general/cards/LibraryOverviewCard"; +import {ListData, useListData} from "@react-stately/data"; function LibraryManagementLayout({getConfig, formik}: any) { + const libraries: ListData = useListData({}); + + useEffect(() => { + LibraryEndpoint.getAllLibraries().then( + (response) => libraries.items = response as LibraryDto[] + ); + }, []); + return (
-
- {/* TODO */} -
@@ -23,6 +34,24 @@ function LibraryManagementLayout({getConfig, formik}: any) {
+ +
+

Libraries

+ + + +
+ + {libraries.items.length > 0 ? +
+ {libraries.items.map((library) => )} +
: + "No libraries configured. Add your first library!" + } ); } diff --git a/gameyfin/src/main/frontend/components/administration/PluginManagement.tsx b/gameyfin/src/main/frontend/components/administration/PluginManagement.tsx index 2545a79..ff9a6b4 100644 --- a/gameyfin/src/main/frontend/components/administration/PluginManagement.tsx +++ b/gameyfin/src/main/frontend/components/administration/PluginManagement.tsx @@ -1,10 +1,10 @@ import React, {useEffect, useState} from "react"; import {PluginManagementEndpoint} from "Frontend/generated/endpoints"; import PluginDto from "Frontend/generated/de/grimsi/gameyfin/core/plugins/management/PluginDto"; -import {PluginManagementCard} from "Frontend/components/general/PluginManagementCard"; +import {PluginManagementCard} from "Frontend/components/general/cards/PluginManagementCard"; import {Button, Divider, Tooltip, useDisclosure} from "@heroui/react"; import {ListNumbers} from "@phosphor-icons/react"; -import PluginPrioritiesModal from "Frontend/components/general/PluginPrioritiesModal"; +import PluginPrioritiesModal from "Frontend/components/general/modals/PluginPrioritiesModal"; export default function PluginManagement() { const [plugins, setPlugins] = useState([]); diff --git a/gameyfin/src/main/frontend/components/administration/ProfileManagement.tsx b/gameyfin/src/main/frontend/components/administration/ProfileManagement.tsx index d37331a..b3276ee 100644 --- a/gameyfin/src/main/frontend/components/administration/ProfileManagement.tsx +++ b/gameyfin/src/main/frontend/components/administration/ProfileManagement.tsx @@ -1,5 +1,5 @@ import Section from "Frontend/components/general/Section"; -import Input from "Frontend/components/general/Input"; +import Input from "Frontend/components/general/input/Input"; import {addToast, Button, Input as NextUiInput, Tooltip} from "@heroui/react"; import {Form, Formik} from "formik"; import {ArrowCounterClockwise, Check, Info, Trash} from "@phosphor-icons/react"; diff --git a/gameyfin/src/main/frontend/components/administration/SsoManagement.tsx b/gameyfin/src/main/frontend/components/administration/SsoManagement.tsx index 3477b71..3d361dc 100644 --- a/gameyfin/src/main/frontend/components/administration/SsoManagement.tsx +++ b/gameyfin/src/main/frontend/components/administration/SsoManagement.tsx @@ -45,6 +45,7 @@ function SsoManagementLayout({getConfig, formik, setSaveMessage}: any) {
+
diff --git a/gameyfin/src/main/frontend/components/administration/UserManagement.tsx b/gameyfin/src/main/frontend/components/administration/UserManagement.tsx index 48d9783..3976a0a 100644 --- a/gameyfin/src/main/frontend/components/administration/UserManagement.tsx +++ b/gameyfin/src/main/frontend/components/administration/UserManagement.tsx @@ -4,11 +4,11 @@ import withConfigPage from "Frontend/components/administration/withConfigPage"; import Section from "Frontend/components/general/Section"; import {ConfigEndpoint, UserEndpoint} from "Frontend/generated/endpoints"; import UserInfoDto from "Frontend/generated/de/grimsi/gameyfin/users/dto/UserInfoDto"; -import {UserManagementCard} from "Frontend/components/general/UserManagementCard"; +import {UserManagementCard} from "Frontend/components/general/cards/UserManagementCard"; import {SmallInfoField} from "Frontend/components/general/SmallInfoField"; import {Info, UserPlus} from "@phosphor-icons/react"; import {Button, Divider, Tooltip, useDisclosure} from "@heroui/react"; -import InviteUserModal from "Frontend/components/general/InviteUserModal"; +import InviteUserModal from "Frontend/components/general/modals/InviteUserModal"; function UserManagementLayout({getConfig, formik}: any) { const inviteUserModal = useDisclosure(); @@ -36,7 +36,7 @@ function UserManagementLayout({getConfig, formik}: any) {
-

Users

+

Users

{!autoRegisterNewUsers && diff --git a/gameyfin/src/main/frontend/components/administration/messages/SendTestNotificationModal.tsx b/gameyfin/src/main/frontend/components/administration/messages/SendTestNotificationModal.tsx index 3380c8d..939d3ec 100644 --- a/gameyfin/src/main/frontend/components/administration/messages/SendTestNotificationModal.tsx +++ b/gameyfin/src/main/frontend/components/administration/messages/SendTestNotificationModal.tsx @@ -1,7 +1,7 @@ import React from "react"; import {Form, Formik} from "formik"; import {addToast, Button, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader} from "@heroui/react"; -import Input from "Frontend/components/general/Input"; +import Input from "Frontend/components/general/input/Input"; import {MessageEndpoint} from "Frontend/generated/endpoints"; import * as Yup from "yup"; import MessageTemplateDto from "Frontend/generated/de/grimsi/gameyfin/messages/templates/MessageTemplateDto"; diff --git a/gameyfin/src/main/frontend/components/administration/withConfigPage.tsx b/gameyfin/src/main/frontend/components/administration/withConfigPage.tsx index af3cd43..6a8848c 100644 --- a/gameyfin/src/main/frontend/components/administration/withConfigPage.tsx +++ b/gameyfin/src/main/frontend/components/administration/withConfigPage.tsx @@ -128,7 +128,7 @@ export default function withConfigPage(WrappedComponent: React.ComponentType {(formik) => (
-
+

{title}

diff --git a/gameyfin/src/main/frontend/components/general/PluginLogo.tsx b/gameyfin/src/main/frontend/components/general/PluginLogo.tsx index fe61b1f..c4ba464 100644 --- a/gameyfin/src/main/frontend/components/general/PluginLogo.tsx +++ b/gameyfin/src/main/frontend/components/general/PluginLogo.tsx @@ -11,7 +11,7 @@ export default function PluginLogo({plugin}: PluginLogoProps) { return ( <> {plugin.hasLogo ? - : + : } diff --git a/gameyfin/src/main/frontend/components/games/GameOverviewCard.tsx b/gameyfin/src/main/frontend/components/general/cards/GameOverviewCard.tsx similarity index 100% rename from gameyfin/src/main/frontend/components/games/GameOverviewCard.tsx rename to gameyfin/src/main/frontend/components/general/cards/GameOverviewCard.tsx diff --git a/gameyfin/src/main/frontend/components/general/cards/LibraryOverviewCard.tsx b/gameyfin/src/main/frontend/components/general/cards/LibraryOverviewCard.tsx new file mode 100644 index 0000000..8e6c6f6 --- /dev/null +++ b/gameyfin/src/main/frontend/components/general/cards/LibraryOverviewCard.tsx @@ -0,0 +1,13 @@ +import {Card} from "@heroui/react"; +import LibraryDto from "Frontend/generated/de/grimsi/gameyfin/libraries/LibraryDto"; + +export function LibraryOverviewCard({library}: { library: LibraryDto }) { + return ( + +
+

{library.name}

+

{library.path}

+
+
+ ); +} \ No newline at end of file diff --git a/gameyfin/src/main/frontend/components/general/PluginManagementCard.tsx b/gameyfin/src/main/frontend/components/general/cards/PluginManagementCard.tsx similarity index 98% rename from gameyfin/src/main/frontend/components/general/PluginManagementCard.tsx rename to gameyfin/src/main/frontend/components/general/cards/PluginManagementCard.tsx index d39da76..87bcb49 100644 --- a/gameyfin/src/main/frontend/components/general/PluginManagementCard.tsx +++ b/gameyfin/src/main/frontend/components/general/cards/PluginManagementCard.tsx @@ -13,7 +13,7 @@ import {PluginManagementEndpoint} from "Frontend/generated/endpoints"; import PluginDto from "Frontend/generated/de/grimsi/gameyfin/core/plugins/management/PluginDto"; import PluginState from "Frontend/generated/org/pf4j/PluginState"; import React, {ReactNode, useEffect, useState} from "react"; -import PluginDetailsModal from "Frontend/components/general/PluginDetailsModal"; +import PluginDetailsModal from "Frontend/components/general/modals/PluginDetailsModal"; import PluginLogo from "Frontend/components/general/PluginLogo"; export function PluginManagementCard({plugin, updatePlugin}: { diff --git a/gameyfin/src/main/frontend/components/general/UserManagementCard.tsx b/gameyfin/src/main/frontend/components/general/cards/UserManagementCard.tsx similarity index 97% rename from gameyfin/src/main/frontend/components/general/UserManagementCard.tsx rename to gameyfin/src/main/frontend/components/general/cards/UserManagementCard.tsx index d5ffd68..86eec03 100644 --- a/gameyfin/src/main/frontend/components/general/UserManagementCard.tsx +++ b/gameyfin/src/main/frontend/components/general/cards/UserManagementCard.tsx @@ -5,12 +5,12 @@ import {useEffect, useState} from "react"; import {MessageEndpoint, PasswordResetEndpoint, UserEndpoint} from "Frontend/generated/endpoints"; import {AvatarEndpoint} from "Frontend/endpoints/endpoints"; import Avatar from "Frontend/components/general/Avatar"; -import ConfirmUserDeletionModal from "Frontend/components/general/ConfirmUserDeletionModal"; -import PasswordResetTokenModal from "Frontend/components/general/PasswortResetTokenModal"; +import ConfirmUserDeletionModal from "Frontend/components/general/modals/ConfirmUserDeletionModal"; +import PasswordResetTokenModal from "Frontend/components/general/modals/PasswortResetTokenModal"; import TokenDto from "Frontend/generated/de/grimsi/gameyfin/shared/token/TokenDto"; import UserInfoDto from "Frontend/generated/de/grimsi/gameyfin/users/dto/UserInfoDto"; import RoleChip from "Frontend/components/general/RoleChip"; -import AssignRolesModal from "Frontend/components/general/AssignRolesModal"; +import AssignRolesModal from "Frontend/components/general/modals/AssignRolesModal"; export function UserManagementCard({user}: { user: UserInfoDto }) { const userDeletionConfirmationModal = useDisclosure(); diff --git a/gameyfin/src/main/frontend/components/general/CheckboxInput.tsx b/gameyfin/src/main/frontend/components/general/input/CheckboxInput.tsx similarity index 100% rename from gameyfin/src/main/frontend/components/general/CheckboxInput.tsx rename to gameyfin/src/main/frontend/components/general/input/CheckboxInput.tsx diff --git a/gameyfin/src/main/frontend/components/general/Input.tsx b/gameyfin/src/main/frontend/components/general/input/Input.tsx similarity index 100% rename from gameyfin/src/main/frontend/components/general/Input.tsx rename to gameyfin/src/main/frontend/components/general/input/Input.tsx diff --git a/gameyfin/src/main/frontend/components/general/SelectInput.tsx b/gameyfin/src/main/frontend/components/general/input/SelectInput.tsx similarity index 100% rename from gameyfin/src/main/frontend/components/general/SelectInput.tsx rename to gameyfin/src/main/frontend/components/general/input/SelectInput.tsx diff --git a/gameyfin/src/main/frontend/components/general/AssignRolesModal.tsx b/gameyfin/src/main/frontend/components/general/modals/AssignRolesModal.tsx similarity index 100% rename from gameyfin/src/main/frontend/components/general/AssignRolesModal.tsx rename to gameyfin/src/main/frontend/components/general/modals/AssignRolesModal.tsx diff --git a/gameyfin/src/main/frontend/components/general/ConfirmUserDeletionModal.tsx b/gameyfin/src/main/frontend/components/general/modals/ConfirmUserDeletionModal.tsx similarity index 100% rename from gameyfin/src/main/frontend/components/general/ConfirmUserDeletionModal.tsx rename to gameyfin/src/main/frontend/components/general/modals/ConfirmUserDeletionModal.tsx diff --git a/gameyfin/src/main/frontend/components/general/InviteUserModal.tsx b/gameyfin/src/main/frontend/components/general/modals/InviteUserModal.tsx similarity index 100% rename from gameyfin/src/main/frontend/components/general/InviteUserModal.tsx rename to gameyfin/src/main/frontend/components/general/modals/InviteUserModal.tsx diff --git a/gameyfin/src/main/frontend/components/general/PasswordResetModal.tsx b/gameyfin/src/main/frontend/components/general/modals/PasswordResetModal.tsx similarity index 100% rename from gameyfin/src/main/frontend/components/general/PasswordResetModal.tsx rename to gameyfin/src/main/frontend/components/general/modals/PasswordResetModal.tsx diff --git a/gameyfin/src/main/frontend/components/general/PasswortResetTokenModal.tsx b/gameyfin/src/main/frontend/components/general/modals/PasswortResetTokenModal.tsx similarity index 100% rename from gameyfin/src/main/frontend/components/general/PasswortResetTokenModal.tsx rename to gameyfin/src/main/frontend/components/general/modals/PasswortResetTokenModal.tsx diff --git a/gameyfin/src/main/frontend/components/general/PluginDetailsModal.tsx b/gameyfin/src/main/frontend/components/general/modals/PluginDetailsModal.tsx similarity index 98% rename from gameyfin/src/main/frontend/components/general/PluginDetailsModal.tsx rename to gameyfin/src/main/frontend/components/general/modals/PluginDetailsModal.tsx index 16583aa..f862106 100644 --- a/gameyfin/src/main/frontend/components/general/PluginDetailsModal.tsx +++ b/gameyfin/src/main/frontend/components/general/modals/PluginDetailsModal.tsx @@ -4,7 +4,7 @@ import {Form, Formik} from "formik"; import {PluginConfigEndpoint, PluginManagementEndpoint} from "Frontend/generated/endpoints"; import PluginDto from "Frontend/generated/de/grimsi/gameyfin/core/plugins/management/PluginDto"; import PluginConfigElement from "Frontend/generated/de/grimsi/gameyfin/pluginapi/core/PluginConfigElement"; -import Input from "Frontend/components/general/Input"; +import Input from "Frontend/components/general/input/Input"; import PluginLogo from "Frontend/components/general/PluginLogo"; interface PluginDetailsModalProps { diff --git a/gameyfin/src/main/frontend/components/general/PluginPrioritiesModal.tsx b/gameyfin/src/main/frontend/components/general/modals/PluginPrioritiesModal.tsx similarity index 100% rename from gameyfin/src/main/frontend/components/general/PluginPrioritiesModal.tsx rename to gameyfin/src/main/frontend/components/general/modals/PluginPrioritiesModal.tsx diff --git a/gameyfin/src/main/frontend/components/general/SignUpModal.tsx b/gameyfin/src/main/frontend/components/general/modals/SignUpModal.tsx similarity index 98% rename from gameyfin/src/main/frontend/components/general/SignUpModal.tsx rename to gameyfin/src/main/frontend/components/general/modals/SignUpModal.tsx index 31a3b90..fc0a76b 100644 --- a/gameyfin/src/main/frontend/components/general/SignUpModal.tsx +++ b/gameyfin/src/main/frontend/components/general/modals/SignUpModal.tsx @@ -4,7 +4,7 @@ import {RegistrationEndpoint} from "Frontend/generated/endpoints"; import UserRegistrationDto from "Frontend/generated/de/grimsi/gameyfin/users/dto/UserRegistrationDto"; import {Form, Formik} from "formik"; import * as Yup from "yup"; -import Input from "Frontend/components/general/Input"; +import Input from "Frontend/components/general/input/Input"; interface SignUpModalProps { isOpen: boolean; diff --git a/gameyfin/src/main/frontend/views/AdministrationView.tsx b/gameyfin/src/main/frontend/views/AdministrationView.tsx index 72f820f..ddf403b 100644 --- a/gameyfin/src/main/frontend/views/AdministrationView.tsx +++ b/gameyfin/src/main/frontend/views/AdministrationView.tsx @@ -34,4 +34,5 @@ const menuItems: MenuItem[] = [ } ] -export const AdministrationView = withSideMenu(menuItems); \ No newline at end of file +export const AdministrationView = withSideMenu(menuItems); +export default AdministrationView; \ No newline at end of file diff --git a/gameyfin/src/main/frontend/views/InvitationRegistrationView.tsx b/gameyfin/src/main/frontend/views/InvitationRegistrationView.tsx index ca516c9..aa9679e 100644 --- a/gameyfin/src/main/frontend/views/InvitationRegistrationView.tsx +++ b/gameyfin/src/main/frontend/views/InvitationRegistrationView.tsx @@ -1,7 +1,7 @@ import {addToast, Button, Card, CardBody, CardHeader} from "@heroui/react"; import {useNavigate, useSearchParams} from "react-router-dom"; import {Form, Formik} from "formik"; -import Input from "Frontend/components/general/Input"; +import Input from "Frontend/components/general/input/Input"; import * as Yup from "yup"; import {RegistrationEndpoint} from "Frontend/generated/endpoints"; import React, {useEffect, useState} from "react"; diff --git a/gameyfin/src/main/frontend/views/LoginView.tsx b/gameyfin/src/main/frontend/views/LoginView.tsx index 195b918..5317585 100644 --- a/gameyfin/src/main/frontend/views/LoginView.tsx +++ b/gameyfin/src/main/frontend/views/LoginView.tsx @@ -3,9 +3,9 @@ import {useEffect, useState} from "react"; import {Button, Card, CardBody, CardHeader, Link, useDisclosure} from "@heroui/react"; import {useNavigate} from "react-router-dom"; import {Form, Formik} from "formik"; -import Input from "Frontend/components/general/Input"; -import PasswordResetModal from "Frontend/components/general/PasswordResetModal"; -import SignUpModal from "Frontend/components/general/SignUpModal"; +import Input from "Frontend/components/general/input/Input"; +import PasswordResetModal from "Frontend/components/general/modals/PasswordResetModal"; +import SignUpModal from "Frontend/components/general/modals/SignUpModal"; import {RegistrationEndpoint} from "Frontend/generated/endpoints"; export default function LoginView() { diff --git a/gameyfin/src/main/frontend/views/MainLayout.tsx b/gameyfin/src/main/frontend/views/MainLayout.tsx index e99579f..34be7d3 100644 --- a/gameyfin/src/main/frontend/views/MainLayout.tsx +++ b/gameyfin/src/main/frontend/views/MainLayout.tsx @@ -83,7 +83,7 @@ export default function MainLayout() {
- +