Add: FilesInFolder page
This commit is contained in:
@@ -9,6 +9,7 @@ import "./App.css";
|
|||||||
import GetRandomFiles from "./component/GetRandomFiles";
|
import GetRandomFiles from "./component/GetRandomFiles";
|
||||||
import SearchFiles from "./component/SearchFiles";
|
import SearchFiles from "./component/SearchFiles";
|
||||||
import SearchFolders from "./component/SearchFolders";
|
import SearchFolders from "./component/SearchFolders";
|
||||||
|
import FilesInFolder from "./component/FilesInFolder";
|
||||||
import Manage from "./component/Manage";
|
import Manage from "./component/Manage";
|
||||||
import Share from "./component/Share";
|
import Share from "./component/Share";
|
||||||
import AudioPlayer from "./component/AudioPlayer";
|
import AudioPlayer from "./component/AudioPlayer";
|
||||||
@@ -56,7 +57,7 @@ function App() {
|
|||||||
/>
|
/>
|
||||||
<Route
|
<Route
|
||||||
path="/search-folders/:id"
|
path="/search-folders/:id"
|
||||||
element={<SearchFolders setPlayingFile={setPlayingFile} />}
|
element={<FilesInFolder setPlayingFile={setPlayingFile} />}
|
||||||
/>
|
/>
|
||||||
<Route path="/manage" element={<Manage />} />
|
<Route path="/manage" element={<Manage />} />
|
||||||
<Route
|
<Route
|
||||||
|
|||||||
60
web/src/component/FilesInFolder.js
Normal file
60
web/src/component/FilesInFolder.js
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
import { useParams } from "react-router";
|
||||||
|
import { useState, useEffect } from "react";
|
||||||
|
import FilesTable from "./FilesTable";
|
||||||
|
|
||||||
|
function FilesInFolder(props) {
|
||||||
|
let params = useParams();
|
||||||
|
const [files, setFiles] = useState([]);
|
||||||
|
const [isLoading, setIsLoading] = useState(false);
|
||||||
|
const [offset, setOffset] = useState(0);
|
||||||
|
const limit = 10;
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setIsLoading(true);
|
||||||
|
fetch("/api/v1/get_files_in_folder", {
|
||||||
|
method: "POST",
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
body: JSON.stringify({
|
||||||
|
folder_id: parseInt(params.id),
|
||||||
|
offset: offset,
|
||||||
|
limit: limit,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
.then((response) => response.json())
|
||||||
|
.then((data) => {
|
||||||
|
setFiles(data.files ? data.files : []);
|
||||||
|
})
|
||||||
|
.catch((error) => alert(error))
|
||||||
|
.finally(() => {
|
||||||
|
setIsLoading(false);
|
||||||
|
});
|
||||||
|
}, [params.id, offset]);
|
||||||
|
|
||||||
|
function nextPage() {
|
||||||
|
setOffset(offset + limit);
|
||||||
|
}
|
||||||
|
|
||||||
|
function lastPage() {
|
||||||
|
const offsetValue = offset - limit;
|
||||||
|
if (offsetValue < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setOffset(offsetValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="page">
|
||||||
|
<h3>Files in Folder</h3>
|
||||||
|
<div className="search_toolbar">
|
||||||
|
<button onClick={lastPage}>Last page</button>
|
||||||
|
<button disabled>
|
||||||
|
{isLoading ? "Loading..." : `${offset} - ${offset + files.length}`}
|
||||||
|
</button>
|
||||||
|
<button onClick={nextPage}>Next page</button>
|
||||||
|
</div>
|
||||||
|
<FilesTable setPlayingFile={props.setPlayingFile} files={files} />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default FilesInFolder;
|
||||||
@@ -9,25 +9,14 @@ function SearchFiles(props) {
|
|||||||
const limit = 10;
|
const limit = 10;
|
||||||
|
|
||||||
function searchFiles() {
|
function searchFiles() {
|
||||||
if (
|
|
||||||
filename === "" &&
|
|
||||||
(props.folder === undefined || props.folder.id === undefined)
|
|
||||||
) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const folder = props.folder ? props.folder : {};
|
|
||||||
const url = folder.id
|
|
||||||
? "/api/v1/get_files_in_folder"
|
|
||||||
: "/api/v1/search_files";
|
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
fetch(url, {
|
fetch("/api/v1/search_files", {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
headers: { "Content-Type": "application/json" },
|
headers: { "Content-Type": "application/json" },
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
filename: filename,
|
filename: filename,
|
||||||
limit: limit,
|
limit: limit,
|
||||||
offset: offset,
|
offset: offset,
|
||||||
folder_id: folder.id,
|
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
.then((response) => response.json())
|
.then((response) => response.json())
|
||||||
@@ -36,7 +25,7 @@ function SearchFiles(props) {
|
|||||||
setFiles(files);
|
setFiles(files);
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
alert("get_files_in_folder error: " + error);
|
alert("search_files error: " + error);
|
||||||
})
|
})
|
||||||
.finally(() => {
|
.finally(() => {
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
@@ -55,35 +44,29 @@ function SearchFiles(props) {
|
|||||||
setOffset(offsetValue);
|
setOffset(offsetValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => searchFiles(), [offset, props.folder]); // eslint-disable-line react-hooks/exhaustive-deps
|
useEffect(() => searchFiles(), [offset]); // eslint-disable-line react-hooks/exhaustive-deps
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="page">
|
<div className="page">
|
||||||
<h3>Search Files</h3>
|
<h3>Search Files</h3>
|
||||||
<div className="search_toolbar">
|
<div className="search_toolbar">
|
||||||
{!props.folder && (
|
<input
|
||||||
<input
|
onChange={(event) => setFilename(event.target.value)}
|
||||||
onChange={(event) => setFilename(event.target.value)}
|
onKeyDown={(event) => {
|
||||||
onKeyDown={(event) => {
|
if (event.key === "Enter") {
|
||||||
if (event.key === "Enter") {
|
searchFiles();
|
||||||
searchFiles();
|
}
|
||||||
}
|
}}
|
||||||
}}
|
type="text"
|
||||||
type="text"
|
placeholder="Enter filename"
|
||||||
placeholder="Enter filename"
|
/>
|
||||||
/>
|
|
||||||
)}
|
|
||||||
<button
|
<button
|
||||||
disabled={!!props.folder}
|
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
searchFiles();
|
searchFiles();
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{isLoading ? "Loading..." : "Search"}
|
{isLoading ? "Loading..." : "Search"}
|
||||||
</button>
|
</button>
|
||||||
{props.folder && props.folder.foldername && (
|
|
||||||
<button onClick={searchFiles}>{props.folder.foldername}</button>
|
|
||||||
)}
|
|
||||||
<button onClick={lastPage}>Last page</button>
|
<button onClick={lastPage}>Last page</button>
|
||||||
<button disabled>
|
<button disabled>
|
||||||
{offset} - {offset + files.length}
|
{offset} - {offset + files.length}
|
||||||
|
|||||||
@@ -1,12 +1,9 @@
|
|||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { useParams } from "react-router";
|
|
||||||
import FoldersTable from "./FoldersTable";
|
import FoldersTable from "./FoldersTable";
|
||||||
import SearchFiles from "./SearchFiles";
|
|
||||||
|
|
||||||
function SearchFolders(props) {
|
function SearchFolders() {
|
||||||
const [foldername, setFoldername] = useState("");
|
const [foldername, setFoldername] = useState("");
|
||||||
const [folders, setFolders] = useState([]);
|
const [folders, setFolders] = useState([]);
|
||||||
const [folder, setFolder] = useState({});
|
|
||||||
const [offset, setOffset] = useState(0);
|
const [offset, setOffset] = useState(0);
|
||||||
const [isLoading, setIsLoading] = useState(false);
|
const [isLoading, setIsLoading] = useState(false);
|
||||||
const limit = 10;
|
const limit = 10;
|
||||||
@@ -27,13 +24,7 @@ function SearchFolders(props) {
|
|||||||
})
|
})
|
||||||
.then((response) => response.json())
|
.then((response) => response.json())
|
||||||
.then((data) => {
|
.then((data) => {
|
||||||
let folders;
|
setFolders(data.folders ? data.folders : []);
|
||||||
if (data.folders) {
|
|
||||||
folders = data.folders;
|
|
||||||
} else {
|
|
||||||
folders = [];
|
|
||||||
}
|
|
||||||
setFolders(folders);
|
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
alert("search_folders error: " + error);
|
alert("search_folders error: " + error);
|
||||||
@@ -55,17 +46,7 @@ function SearchFolders(props) {
|
|||||||
setOffset(offsetValue);
|
setOffset(offsetValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
function viewFolder(folder) {
|
|
||||||
setFolder(folder);
|
|
||||||
}
|
|
||||||
|
|
||||||
let params = useParams();
|
|
||||||
useEffect(() => searchFolder(), [offset]); // eslint-disable-line react-hooks/exhaustive-deps
|
useEffect(() => searchFolder(), [offset]); // eslint-disable-line react-hooks/exhaustive-deps
|
||||||
useEffect(() => {
|
|
||||||
if (params.id !== undefined) {
|
|
||||||
setFolder({ id: parseInt(params.id) });
|
|
||||||
}
|
|
||||||
}, [params.id]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="page">
|
<div className="page">
|
||||||
@@ -90,8 +71,7 @@ function SearchFolders(props) {
|
|||||||
</button>
|
</button>
|
||||||
<button onClick={nextPage}>Next page</button>
|
<button onClick={nextPage}>Next page</button>
|
||||||
</div>
|
</div>
|
||||||
<FoldersTable viewFolder={viewFolder} folders={folders} />
|
<FoldersTable folders={folders} />
|
||||||
<SearchFiles setPlayingFile={props.setPlayingFile} folder={folder} />
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user