mirror of
https://github.com/BrenBroZAYT/gameyfin.git
synced 2026-06-13 16:40:01 +00:00
8d8dca32d8
* chore: bump version to v2.3.0-preview * Customize start page (#803) * Update ConfigService to support complex Objects Implemented tests for ConfigService * Added DB migration for config table * Fixed version in banner.txt not being displayed * Implement Library ordering Implement "Show recently added games on homepage" * Fix build.gradle.kts * FIx bug when creating libraries * Fix TypeScript errors Fix library sorting * Bump actions/checkout from 5 to 6 (#811) Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Added automatic scanning using file system watchers (#813) * Implement collections (#814) * Backend implementation for collections * Fix database schema and migration script * Refactor some config values Fix ArrayInput not being deactivatable * Remove "AutoRegisterNewUsers" config option * Fix bug when removing ignored paths * Add UI for collections (WIP) * Fix table actions not synced with state Fix tests * Finish implementation of collection feature * Fix tests * Bump actions/checkout from 5 to 6 (#815) Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fix "allow guests to create game requests" not being enabled when guest access is activated * Fix: Disable loading of EditGameMetadataModal and MatchGameModal in GameView when user is not admin * WIP: Update start page layout * Performance improvements (lazy loading and virtualized grids/lists) Fix various smaller issues * Implement use of blurhash for all images in backend and covers in frontend * Fix bugs and test * Fix code analysis issues * Remove "UI settings" since they have been made obsolete --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
105 lines
5.4 KiB
TypeScript
105 lines
5.4 KiB
TypeScript
import React, {useState} from "react";
|
|
import {addToast, Button, Checkbox, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader} from "@heroui/react";
|
|
import {Form, Formik} from "formik";
|
|
import {LibraryEndpoint} from "Frontend/generated/endpoints";
|
|
import Input from "Frontend/components/general/input/Input";
|
|
import * as Yup from "yup";
|
|
import DirectoryMappingInput from "Frontend/components/general/input/DirectoryMappingInput";
|
|
import ArrayInputAutocomplete from "Frontend/components/general/input/ArrayInputAutocomplete";
|
|
import {useSnapshot} from "valtio/react";
|
|
import {platformState} from "Frontend/state/PlatformState";
|
|
import LibraryAdminDto from "Frontend/generated/org/gameyfin/app/libraries/dto/LibraryAdminDto";
|
|
|
|
interface LibraryCreationModalProps {
|
|
isOpen: boolean;
|
|
onOpenChange: () => void;
|
|
}
|
|
|
|
export default function LibraryCreationModal({
|
|
isOpen,
|
|
onOpenChange
|
|
}: LibraryCreationModalProps) {
|
|
|
|
const [scanAfterCreation, setScanAfterCreation] = useState<boolean>(true);
|
|
const availablePlatforms = useSnapshot(platformState).available;
|
|
|
|
async function createLibrary(library: LibraryAdminDto) {
|
|
await LibraryEndpoint.createLibrary(library, scanAfterCreation);
|
|
|
|
addToast({
|
|
title: "New library created",
|
|
description: `Library ${library.name} created!`,
|
|
color: "success"
|
|
});
|
|
}
|
|
|
|
return (availablePlatforms &&
|
|
<>
|
|
<Modal isOpen={isOpen} onOpenChange={onOpenChange} backdrop="opaque" size="xl">
|
|
<ModalContent>
|
|
{(onClose) => (
|
|
<Formik
|
|
initialValues={{
|
|
name: "",
|
|
directories: [],
|
|
platforms: []
|
|
}}
|
|
validationSchema={Yup.object({
|
|
name: Yup.string()
|
|
.required("Library name is required")
|
|
.max(255, "Library name must be 255 characters or less"),
|
|
directories: Yup.array()
|
|
.of(Yup.object())
|
|
.min(1, "At least one directory is required")
|
|
})}
|
|
isInitialValid={false}
|
|
onSubmit={async (values: any) => {
|
|
await createLibrary(values);
|
|
onClose();
|
|
}}
|
|
>
|
|
{(formik) =>
|
|
<Form>
|
|
<ModalHeader className="flex flex-col gap-1">Add a new library</ModalHeader>
|
|
<ModalBody>
|
|
<div className="flex flex-col gap-2">
|
|
<Input
|
|
name="name"
|
|
label="Library Name"
|
|
placeholder="Enter library name"
|
|
value={formik.values.name}
|
|
required
|
|
/>
|
|
<ArrayInputAutocomplete options={Array.from(availablePlatforms)}
|
|
name="platforms"
|
|
label="Platforms"
|
|
placeholder="Platform(s) of the games in this library (leave empty for all platforms)"
|
|
/>
|
|
<DirectoryMappingInput name="directories"/>
|
|
</div>
|
|
</ModalBody>
|
|
<ModalFooter className="flex flex-row justify-between">
|
|
<Checkbox isSelected={scanAfterCreation} onValueChange={setScanAfterCreation}>Scan
|
|
after creation?</Checkbox>
|
|
<div className="flex flex-row">
|
|
<Button variant="light" onPress={onClose}>
|
|
Cancel
|
|
</Button>
|
|
<Button color="primary"
|
|
isLoading={formik.isSubmitting}
|
|
isDisabled={formik.isSubmitting}
|
|
type="submit"
|
|
>
|
|
{formik.isSubmitting ? "" : "Add"}
|
|
</Button>
|
|
</div>
|
|
</ModalFooter>
|
|
</Form>
|
|
}
|
|
</Formik>
|
|
)}
|
|
</ModalContent>
|
|
</Modal>
|
|
</>
|
|
);
|
|
} |