From fdfb36bcd24cf805b2e5d51c9cfff051d0bd5fa9 Mon Sep 17 00:00:00 2001 From: Lukas Heiligenbrunner Date: Thu, 25 Jun 2020 22:43:26 +0200 Subject: [PATCH 01/15] new settingspage sidebar with general and moviesettings --- src/pages/SettingsPage/GeneralSettings.js | 19 ++++ .../SettingsPage/GeneralSettings.test.js | 20 +++++ src/pages/SettingsPage/MovieSettings.js | 77 ++++++++++++++++ src/pages/SettingsPage/MovieSettings.test.js | 20 +++++ src/pages/SettingsPage/SettingsPage.css | 39 ++++++++ src/pages/SettingsPage/SettingsPage.js | 88 ++++++------------- 6 files changed, 203 insertions(+), 60 deletions(-) create mode 100644 src/pages/SettingsPage/GeneralSettings.js create mode 100644 src/pages/SettingsPage/GeneralSettings.test.js create mode 100644 src/pages/SettingsPage/MovieSettings.js create mode 100644 src/pages/SettingsPage/MovieSettings.test.js create mode 100644 src/pages/SettingsPage/SettingsPage.css diff --git a/src/pages/SettingsPage/GeneralSettings.js b/src/pages/SettingsPage/GeneralSettings.js new file mode 100644 index 0000000..e33d38f --- /dev/null +++ b/src/pages/SettingsPage/GeneralSettings.js @@ -0,0 +1,19 @@ +import React from "react"; + +class GeneralSettings extends React.Component { + constructor(props) { + super(props); + + this.state = {}; + } + + render() { + return ( + <> + Generalsettings here + + ); + } +} + +export default GeneralSettings; \ No newline at end of file diff --git a/src/pages/SettingsPage/GeneralSettings.test.js b/src/pages/SettingsPage/GeneralSettings.test.js new file mode 100644 index 0000000..88d2f6a --- /dev/null +++ b/src/pages/SettingsPage/GeneralSettings.test.js @@ -0,0 +1,20 @@ +import {shallow} from "enzyme"; +import React from "react"; +import GeneralSettings from "./GeneralSettings"; + +function prepareFetchApi(response) { + const mockJsonPromise = Promise.resolve(response); + const mockFetchPromise = Promise.resolve({ + json: () => mockJsonPromise, + }); + return (jest.fn().mockImplementation(() => mockFetchPromise)); +} + +describe('', function () { + it('renders without crashing ', function () { + const wrapper = shallow(); + wrapper.unmount(); + }); + + +}); diff --git a/src/pages/SettingsPage/MovieSettings.js b/src/pages/SettingsPage/MovieSettings.js new file mode 100644 index 0000000..5ff54aa --- /dev/null +++ b/src/pages/SettingsPage/MovieSettings.js @@ -0,0 +1,77 @@ +import React from "react"; + +class MovieSettings extends React.Component { + constructor(props) { + super(props); + + this.state = { + text: [] + }; + } + + componentDidMount() { + if (this.myinterval) { + clearInterval(this.myinterval); + } + this.myinterval = setInterval(this.updateStatus, 1000); + } + + componentWillUnmount() { + clearInterval(this.myinterval); + } + + render() { + return ( + <> + +
{this.state.text.map(m => ( +
{m}
+ ))}
+ + ); + } + + startReindex() { + console.log("starting"); + const updateRequest = new FormData(); + // fetch all videos available + fetch('/api/extractvideopreviews.php', {method: 'POST', body: updateRequest}) + .then((response) => response.json() + .then((result) => { + console.log("returned"); + })) + .catch(() => { + console.log("no connection to backend"); + }); + if (this.myinterval) { + clearInterval(this.myinterval); + } + this.myinterval = setInterval(this.updateStatus, 1000); + console.log("sent"); + } + + updateStatus = () => { + const updateRequest = new FormData(); + fetch('/api/extractionData.php', {method: 'POST', body: updateRequest}) + .then((response) => response.json() + .then((result) => { + if (result.contentAvailable === true) { + console.log(result); + this.setState({ + text: [...result.message.split("\n"), + ...this.state.text] + }); + } else { + clearInterval(this.myinterval); + } + })) + .catch(() => { + console.log("no connection to backend"); + }); + }; +} + +export default MovieSettings; \ No newline at end of file diff --git a/src/pages/SettingsPage/MovieSettings.test.js b/src/pages/SettingsPage/MovieSettings.test.js new file mode 100644 index 0000000..61d7821 --- /dev/null +++ b/src/pages/SettingsPage/MovieSettings.test.js @@ -0,0 +1,20 @@ +import {shallow} from "enzyme"; +import React from "react"; +import MovieSettings from "./MovieSettings"; + +function prepareFetchApi(response) { + const mockJsonPromise = Promise.resolve(response); + const mockFetchPromise = Promise.resolve({ + json: () => mockJsonPromise, + }); + return (jest.fn().mockImplementation(() => mockFetchPromise)); +} + +describe('', function () { + it('renders without crashing ', function () { + const wrapper = shallow(); + wrapper.unmount(); + }); + + +}); diff --git a/src/pages/SettingsPage/SettingsPage.css b/src/pages/SettingsPage/SettingsPage.css new file mode 100644 index 0000000..216e5e2 --- /dev/null +++ b/src/pages/SettingsPage/SettingsPage.css @@ -0,0 +1,39 @@ +.SettingsSidebar { + padding-top: 20px; + float: left; + width: 10%; + background-color: #d3dcef; + min-height: calc(100vh - 56px); + min-width: 110px; +} + +.SettingsSidebarTitle { + text-align: center; + font-weight: bold; + text-transform: uppercase; + font-size: larger; + margin-bottom: 25px; +} + +.SettingsContent { + float: left; + width: 80%; + padding-left: 30px; + padding-top: 30px; +} + +.SettingSidebarElement { + margin: 10px 5px 5px; + padding: 5px; + background-color: #a8b2de; + text-align: center; + font-weight: bold; +} + +.SettingSidebarElement:hover { + font-weight: bolder; + background-color: #7d8dd4; + box-shadow: #7d8dd4 0 0 0 5px; + transition: all 300ms; + cursor: pointer; +} \ No newline at end of file diff --git a/src/pages/SettingsPage/SettingsPage.js b/src/pages/SettingsPage/SettingsPage.js index 776dae8..44aa747 100644 --- a/src/pages/SettingsPage/SettingsPage.js +++ b/src/pages/SettingsPage/SettingsPage.js @@ -1,82 +1,50 @@ import React from "react"; -import PageTitle from "../../elements/PageTitle/PageTitle"; +import MovieSettings from "./MovieSettings"; +import GeneralSettings from "./GeneralSettings"; +import "./SettingsPage.css" class SettingsPage extends React.Component { constructor(props, context) { super(props, context); + this.state = { - text: [] + currentpage: "general" }; } - updateStatus = () => { - const updateRequest = new FormData(); - fetch('/api/extractionData.php', {method: 'POST', body: updateRequest}) - .then((response) => response.json() - .then((result) => { - if (result.contentAvailable === true) { - console.log(result); - this.setState({ - text: [...result.message.split("\n"), - ...this.state.text] - }); - } else { - clearInterval(this.myinterval); - } - })) - .catch(() => { - console.log("no connection to backend"); - }); - }; - - componentDidMount() { - if (this.myinterval) { - clearInterval(this.myinterval); + getContent() { + switch (this.state.currentpage) { + case "general": + return ; + case "movies": + return ; + default: + return "unknown button clicked"; } - this.myinterval = setInterval(this.updateStatus, 1000); - } - - componentWillUnmount() { - clearInterval(this.myinterval); } render() { return (
- - - -
{this.state.text.map(m => ( -
{m}
- ))}
+
+
Settings
+
this.setState({currentpage: "general"})} + className='SettingSidebarElement'>General +
+
this.setState({currentpage: "movies"})} + className='SettingSidebarElement'>Movies +
+
this.setState({currentpage: "tv"})} + className='SettingSidebarElement'>TV Shows +
+
+
+ {this.getContent()} +
); } - - startReindex() { - console.log("starting"); - const updateRequest = new FormData(); - // fetch all videos available - fetch('/api/extractvideopreviews.php', {method: 'POST', body: updateRequest}) - .then((response) => response.json() - .then((result) => { - console.log("returned"); - })) - .catch(() => { - console.log("no connection to backend"); - }); - if (this.myinterval) { - clearInterval(this.myinterval); - } - this.myinterval = setInterval(this.updateStatus, 1000); - console.log("sent"); - } } export default SettingsPage; From 791f2327e1bdfe9cb2a07b9bbb672d58c638c940 Mon Sep 17 00:00:00 2001 From: Lukas Heiligenbrunner Date: Mon, 29 Jun 2020 19:55:40 +0200 Subject: [PATCH 02/15] added some tests and rounder buttons of settings items --- src/pages/SettingsPage/MovieSettings.test.js | 42 ++++++++++++++++++++ src/pages/SettingsPage/SettingsPage.css | 1 + src/pages/SettingsPage/SettingsPage.js | 2 + src/pages/SettingsPage/SettingsPage.test.js | 33 +++++++++------ 4 files changed, 65 insertions(+), 13 deletions(-) diff --git a/src/pages/SettingsPage/MovieSettings.test.js b/src/pages/SettingsPage/MovieSettings.test.js index 61d7821..51d38c3 100644 --- a/src/pages/SettingsPage/MovieSettings.test.js +++ b/src/pages/SettingsPage/MovieSettings.test.js @@ -16,5 +16,47 @@ describe('', function () { wrapper.unmount(); }); + it('received text renders into dom', function () { + const wrapper = shallow(); + wrapper.setState({ + text: [ + "firstline", + "secline" + ] + }); + + expect(wrapper.find(".indextextarea").find(".textarea-element")).toHaveLength(2); + }); + + it('test simulate reindex', function () { + global.fetch = prepareFetchApi({}); + const wrapper = shallow(); + + wrapper.find(".reindexbtn").simulate("click"); + + // initial send of reindex request to server + expect(global.fetch).toBeCalledTimes(1); + }); + + it('content available received and in state', done => { + global.fetch = prepareFetchApi({ + contentAvailable: true, + message: "firstline\nsecondline" + }); + const wrapper = shallow(); + wrapper.instance().updateStatus(); + + process.nextTick(() => { + expect(wrapper.state()).toMatchObject({ + text: [ + "firstline", + "secondline" + ] + }); + + global.fetch.mockClear(); + done(); + }); + }); }); diff --git a/src/pages/SettingsPage/SettingsPage.css b/src/pages/SettingsPage/SettingsPage.css index 216e5e2..b958e19 100644 --- a/src/pages/SettingsPage/SettingsPage.css +++ b/src/pages/SettingsPage/SettingsPage.css @@ -28,6 +28,7 @@ background-color: #a8b2de; text-align: center; font-weight: bold; + border-radius: 7px; } .SettingSidebarElement:hover { diff --git a/src/pages/SettingsPage/SettingsPage.js b/src/pages/SettingsPage/SettingsPage.js index 44aa747..f627fb5 100644 --- a/src/pages/SettingsPage/SettingsPage.js +++ b/src/pages/SettingsPage/SettingsPage.js @@ -19,6 +19,8 @@ class SettingsPage extends React.Component { return ; case "movies": return ; + case "tv": + return ; // todo this page default: return "unknown button clicked"; } diff --git a/src/pages/SettingsPage/SettingsPage.test.js b/src/pages/SettingsPage/SettingsPage.test.js index a842d0c..503e0eb 100644 --- a/src/pages/SettingsPage/SettingsPage.test.js +++ b/src/pages/SettingsPage/SettingsPage.test.js @@ -16,26 +16,33 @@ describe('', function () { wrapper.unmount(); }); - it('received text renders into dom', function () { + it('simulate topic clicka', function () { const wrapper = shallow(); - wrapper.setState({ - text: [ - "firstline", - "secline" - ] - }); + simulateSideBarClick("General",wrapper); + expect(wrapper.state().currentpage).toBe("general"); + expect(wrapper.find(".SettingsContent").find("GeneralSettings")).toHaveLength(1); - expect(wrapper.find(".indextextarea").find(".textarea-element")).toHaveLength(2); + simulateSideBarClick("Movies",wrapper); + expect(wrapper.state().currentpage).toBe("movies"); + expect(wrapper.find(".SettingsContent").find("MovieSettings")).toHaveLength(1); + + simulateSideBarClick("TV Shows",wrapper); + expect(wrapper.state().currentpage).toBe("tv"); + expect(wrapper.find(".SettingsContent").find("a")).toHaveLength(1); }); - it('test simulate reindex', function () { - global.fetch = prepareFetchApi({}); + function simulateSideBarClick(name, wrapper) { + wrapper.find(".SettingSidebarElement").findWhere(it => + it.text() === name && + it.type() === "div").simulate("click"); + } + + it('simulate unknown topic', function () { const wrapper = shallow(); + wrapper.setState({currentpage: "unknown"}); - wrapper.find(".reindexbtn").simulate("click"); + expect(wrapper.find(".SettingsContent").text()).toBe("unknown button clicked"); - // initial send of reindex request to server - expect(global.fetch).toBeCalledTimes(1); }); }); From 08c25675517a6685fdafe2d4f69210d3bb46a148 Mon Sep 17 00:00:00 2001 From: Lukas Heiligenbrunner Date: Mon, 29 Jun 2020 21:34:43 +0200 Subject: [PATCH 03/15] add a css file for general SettingsPage.js add a basic form for videopath --- src/pages/SettingsPage/GeneralSettings.css | 3 +++ src/pages/SettingsPage/GeneralSettings.js | 26 +++++++++++++++++++++ src/pages/SettingsPage/SettingsPage.js | 2 +- src/pages/SettingsPage/SettingsPage.test.js | 2 +- 4 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 src/pages/SettingsPage/GeneralSettings.css diff --git a/src/pages/SettingsPage/GeneralSettings.css b/src/pages/SettingsPage/GeneralSettings.css new file mode 100644 index 0000000..2d3d496 --- /dev/null +++ b/src/pages/SettingsPage/GeneralSettings.css @@ -0,0 +1,3 @@ +.GeneralForm { + width: 60%; +} \ No newline at end of file diff --git a/src/pages/SettingsPage/GeneralSettings.js b/src/pages/SettingsPage/GeneralSettings.js index e33d38f..618d6a7 100644 --- a/src/pages/SettingsPage/GeneralSettings.js +++ b/src/pages/SettingsPage/GeneralSettings.js @@ -1,4 +1,6 @@ import React from "react"; +import {Form, Col, Button} from "react-bootstrap"; +import "./GeneralSettings.css" class GeneralSettings extends React.Component { constructor(props) { @@ -11,6 +13,30 @@ class GeneralSettings extends React.Component { return ( <> Generalsettings here +
+
+ + + Video Path + + + + + Password + + + + + + Address + + + + +
+
); } diff --git a/src/pages/SettingsPage/SettingsPage.js b/src/pages/SettingsPage/SettingsPage.js index f627fb5..f3543a0 100644 --- a/src/pages/SettingsPage/SettingsPage.js +++ b/src/pages/SettingsPage/SettingsPage.js @@ -20,7 +20,7 @@ class SettingsPage extends React.Component { case "movies": return ; case "tv": - return
; // todo this page + return ; // todo this page default: return "unknown button clicked"; } diff --git a/src/pages/SettingsPage/SettingsPage.test.js b/src/pages/SettingsPage/SettingsPage.test.js index 503e0eb..5cac3a6 100644 --- a/src/pages/SettingsPage/SettingsPage.test.js +++ b/src/pages/SettingsPage/SettingsPage.test.js @@ -29,7 +29,7 @@ describe('', function () { simulateSideBarClick("TV Shows",wrapper); expect(wrapper.state().currentpage).toBe("tv"); - expect(wrapper.find(".SettingsContent").find("a")).toHaveLength(1); + expect(wrapper.find(".SettingsContent").find("span")).toHaveLength(1); }); function simulateSideBarClick(name, wrapper) { From 3b1d85824feb1333fc1b4a591afd84ec0f535c34 Mon Sep 17 00:00:00 2001 From: Lukas Heiligenbrunner Date: Fri, 3 Jul 2020 00:20:11 +0200 Subject: [PATCH 04/15] new fields in general settings and test for password switcher --- package.json | 2 +- src/elements/Preview/Preview.js | 10 ++--- src/pages/SettingsPage/GeneralSettings.js | 45 +++++++++++++++---- .../SettingsPage/GeneralSettings.test.js | 9 +++- 4 files changed, 48 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index e2c5e69..c13873a 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "text-summary" ] }, - "proxy": "http://192.168.0.248", + "proxy": "http://192.168.0.42", "homepage": "/", "eslintConfig": { "extends": "react-app" diff --git a/src/elements/Preview/Preview.js b/src/elements/Preview/Preview.js index c3a6810..394a008 100644 --- a/src/elements/Preview/Preview.js +++ b/src/elements/Preview/Preview.js @@ -13,10 +13,6 @@ class Preview extends React.Component { }; } - componentWillUnmount() { - this.setState({}); - } - componentDidMount() { this.setState({ previewpicture: null, @@ -30,9 +26,9 @@ class Preview extends React.Component { fetch('/api/videoload.php', {method: 'POST', body: updateRequest}) .then((response) => response.text() .then((result) => { - this.setState(prevState => ({ - ...prevState.previewpicture, previewpicture: result - })); + this.setState({ + previewpicture: result + }); })); } diff --git a/src/pages/SettingsPage/GeneralSettings.js b/src/pages/SettingsPage/GeneralSettings.js index 618d6a7..7d39876 100644 --- a/src/pages/SettingsPage/GeneralSettings.js +++ b/src/pages/SettingsPage/GeneralSettings.js @@ -6,31 +6,58 @@ class GeneralSettings extends React.Component { constructor(props) { super(props); - this.state = {}; + this.state = { + tvshowsupport: false, + videopath: "", + tvshowpath: "" + }; + } + + componentDidMount() { + const updateRequest = new FormData(); + updateRequest.append('action', 'loadVideo'); + updateRequest.append('movieid', this.props.movie_id); + + fetch('/api/videoload.php', {method: 'POST', body: updateRequest}) + .then((response) => response.json() + .then((result) => { + // todo 2020-07-3: set state here + })); } render() { return ( <> - Generalsettings here
Video Path - + - Password - + TV Show Path + - - Address - - + { + this.setState({tvshowsupport: !this.state.tvshowsupport}) + }} + /> + + {this.state.tvshowsupport ? + + Password + + : null + } + @@ -36,7 +38,12 @@ class MovieSettings extends React.Component { } startReindex() { - document.getElementsByClassName("indextextarea")[0].innerHTML = ""; + // clear output text before start + this.setState({text: []}); + + const btn = this.startbtn.current; + btn.disabled = true; + console.log("starting"); const updateRequest = new FormData(); // fetch all videos available @@ -44,7 +51,6 @@ class MovieSettings extends React.Component { .then((response) => response.json() .then((result) => { // todo 2020-07-4: some kind of start event - // maybe disable start btn console.log("returned"); })) .catch(() => { @@ -72,8 +78,10 @@ class MovieSettings extends React.Component { }); } else { // clear refresh interval if no content available - // todo 2020-07-4: maybe enable start btn again clearInterval(this.myinterval); + + const btn = this.startbtn.current; + btn.disabled = false; } })) .catch(() => { From 75ae0d7d8bce230d8259676a8128c2fabeb099ce Mon Sep 17 00:00:00 2001 From: lukas Date: Wed, 8 Jul 2020 19:33:23 +0200 Subject: [PATCH 07/15] use css modules add a mediacenter-name field use state for reindex-btn greyout --- src/pages/SettingsPage/GeneralSettings.css | 3 --- src/pages/SettingsPage/GeneralSettings.js | 10 +++++++--- .../SettingsPage/GeneralSettings.module.css | 8 ++++++++ src/pages/SettingsPage/MovieSettings.js | 20 ++++++++----------- ...eSettings.css => MovieSettings.module.css} | 2 +- src/pages/SettingsPage/SettingsPage.js | 14 ++++++------- ...ttingsPage.css => SettingsPage.module.css} | 0 7 files changed, 31 insertions(+), 26 deletions(-) delete mode 100644 src/pages/SettingsPage/GeneralSettings.css create mode 100644 src/pages/SettingsPage/GeneralSettings.module.css rename src/pages/SettingsPage/{MovieSettings.css => MovieSettings.module.css} (99%) rename src/pages/SettingsPage/{SettingsPage.css => SettingsPage.module.css} (100%) diff --git a/src/pages/SettingsPage/GeneralSettings.css b/src/pages/SettingsPage/GeneralSettings.css deleted file mode 100644 index 2d3d496..0000000 --- a/src/pages/SettingsPage/GeneralSettings.css +++ /dev/null @@ -1,3 +0,0 @@ -.GeneralForm { - width: 60%; -} \ No newline at end of file diff --git a/src/pages/SettingsPage/GeneralSettings.js b/src/pages/SettingsPage/GeneralSettings.js index 978fa59..7e1d914 100644 --- a/src/pages/SettingsPage/GeneralSettings.js +++ b/src/pages/SettingsPage/GeneralSettings.js @@ -1,6 +1,6 @@ import React from "react"; import {Form, Col, Button} from "react-bootstrap"; -import "./GeneralSettings.css" +import style from "./GeneralSettings.module.css" class GeneralSettings extends React.Component { constructor(props) { @@ -28,7 +28,7 @@ class GeneralSettings extends React.Component { render() { return ( <> -
+
{ e.preventDefault(); this.saveSettings(); @@ -61,6 +61,10 @@ class GeneralSettings extends React.Component { : null } + + The name of the Mediacenter + + -
{this.state.text.map(m => ( +
{this.state.text.map(m => (
{m}
))}
@@ -41,8 +40,7 @@ class MovieSettings extends React.Component { // clear output text before start this.setState({text: []}); - const btn = this.startbtn.current; - btn.disabled = true; + this.setState({startbtnDisabled: true}); console.log("starting"); const updateRequest = new FormData(); @@ -60,7 +58,6 @@ class MovieSettings extends React.Component { clearInterval(this.myinterval); } this.myinterval = setInterval(this.updateStatus, 1000); - console.log("sent"); } updateStatus = () => { @@ -80,8 +77,7 @@ class MovieSettings extends React.Component { // clear refresh interval if no content available clearInterval(this.myinterval); - const btn = this.startbtn.current; - btn.disabled = false; + this.setState({startbtnDisabled: false}); } })) .catch(() => { @@ -90,4 +86,4 @@ class MovieSettings extends React.Component { }; } -export default MovieSettings; \ No newline at end of file +export default MovieSettings; diff --git a/src/pages/SettingsPage/MovieSettings.css b/src/pages/SettingsPage/MovieSettings.module.css similarity index 99% rename from src/pages/SettingsPage/MovieSettings.css rename to src/pages/SettingsPage/MovieSettings.module.css index 6265fbf..4551e8d 100644 --- a/src/pages/SettingsPage/MovieSettings.css +++ b/src/pages/SettingsPage/MovieSettings.module.css @@ -10,4 +10,4 @@ width: 50%; background-color: #c2c2c2; border-radius: 5px; -} \ No newline at end of file +} diff --git a/src/pages/SettingsPage/SettingsPage.js b/src/pages/SettingsPage/SettingsPage.js index f3543a0..d93954b 100644 --- a/src/pages/SettingsPage/SettingsPage.js +++ b/src/pages/SettingsPage/SettingsPage.js @@ -1,7 +1,7 @@ import React from "react"; import MovieSettings from "./MovieSettings"; import GeneralSettings from "./GeneralSettings"; -import "./SettingsPage.css" +import style from "./SettingsPage.module.css" class SettingsPage extends React.Component { @@ -29,19 +29,19 @@ class SettingsPage extends React.Component { render() { return (
-
-
Settings
+
+
Settings
this.setState({currentpage: "general"})} - className='SettingSidebarElement'>General + className={style.SettingSidebarElement}>General
this.setState({currentpage: "movies"})} - className='SettingSidebarElement'>Movies + className={style.SettingSidebarElement}>Movies
this.setState({currentpage: "tv"})} - className='SettingSidebarElement'>TV Shows + className={style.SettingSidebarElement}>TV Shows
-
+
{this.getContent()}
diff --git a/src/pages/SettingsPage/SettingsPage.css b/src/pages/SettingsPage/SettingsPage.module.css similarity index 100% rename from src/pages/SettingsPage/SettingsPage.css rename to src/pages/SettingsPage/SettingsPage.module.css From 133851fe0db6dce69d4665304592c96fcfc6da96 Mon Sep 17 00:00:00 2001 From: Lukas Heiligenbrunner Date: Fri, 10 Jul 2020 01:18:23 +0200 Subject: [PATCH 08/15] added php code to get settings from database to react state add onchange events to change state on field change --- api/Settings.php | 26 ++++++++++++++++ src/pages/SettingsPage/GeneralSettings.js | 38 ++++++++++++++++------- 2 files changed, 52 insertions(+), 12 deletions(-) create mode 100644 api/Settings.php diff --git a/api/Settings.php b/api/Settings.php new file mode 100644 index 0000000..4afb181 --- /dev/null +++ b/api/Settings.php @@ -0,0 +1,26 @@ +getConnection(); + +if (isset($_POST['action'])) { + $action = $_POST['action']; + switch ($action) { + case "loadGeneralSettings": + $query = "SELECT * from settings"; + + $result = $conn->query($query); + if ($result->num_rows > 1) { + // todo throw error + } + + $r = mysqli_fetch_assoc($result); + if ($r['password'] != "-1") { + $r['passwordEnabled'] = true; + } else { + $r['passwordEnabled'] = true; + } + echo json_encode($r); + break; + } +} diff --git a/src/pages/SettingsPage/GeneralSettings.js b/src/pages/SettingsPage/GeneralSettings.js index 7e1d914..6ec0a98 100644 --- a/src/pages/SettingsPage/GeneralSettings.js +++ b/src/pages/SettingsPage/GeneralSettings.js @@ -7,9 +7,12 @@ class GeneralSettings extends React.Component { super(props); this.state = { - tvshowsupport: false, + passwordsupport: false, + videopath: "", - tvshowpath: "" + tvshowpath: "", + mediacentername: "", + password: "" }; } @@ -17,11 +20,16 @@ class GeneralSettings extends React.Component { const updateRequest = new FormData(); updateRequest.append('action', 'loadGeneralSettings'); - fetch('/api/settings.php', {method: 'POST', body: updateRequest}) + fetch('/api/Settings.php', {method: 'POST', body: updateRequest}) .then((response) => response.json() .then((result) => { - // todo 2020-07-3: set state here - // todo 2020-07-4: php and test code + this.setState({ + videopath: result.video_path, + tvshowpath: result.episode_path, + mediacentername: result.mediacenter_name, + password: result.password, + passwordsupport: result.passwordEnabled + }); })); } @@ -36,12 +44,15 @@ class GeneralSettings extends React.Component { Video Path - + this.setState({videopath: ee.target.value})}/> TV Show Path - + this.setState({tvshowpath: e.target.value})}/> @@ -49,21 +60,24 @@ class GeneralSettings extends React.Component { type="switch" id="custom-switch" label="Enable Password support" + checked={this.state.passwordsupport} onChange={() => { - this.setState({tvshowsupport: !this.state.tvshowsupport}) + this.setState({passwordsupport: !this.state.passwordsupport}) }} /> - {this.state.tvshowsupport ? + {this.state.passwordsupport ? Password - + this.setState({password: e.target.value})}/> : null } - + The name of the Mediacenter - + this.setState({mediacentername: e.target.value})}/>