basic state setup

This commit is contained in:
studavrije7683 2022-03-05 12:31:29 +01:00
parent 981dcb3789
commit 642083bad6
9 changed files with 138 additions and 111 deletions

View File

@ -4,18 +4,16 @@ import { h } from "preact";
const Pageselector = (props) => { const Pageselector = (props) => {
var items = [];
let start = 1; if(!isNaN(props.start)&&!isNaN(props.end)&&!isNaN(props.current))
let end = 7; for(var i=props.start; i<=props.end; i++){
items.push(<li><a {...(i==props.current?{className:'active'}:{})} href="#">{i}</a></li>);
}
items.push(<li><a href="#">&gt;</a></li>);
return ( return (
<div class="page-nav-bar"> <div class="page-nav-bar">
<ul> <ul>
<li><a href="#">1</a></li> {items}
<li><a href="#">2</a></li>
<li><a href="#">3</a></li>
<li><a href="#">4</a></li>
<li><a href="#">5</a></li>
<li><a href="#">&gt;</a></li>
</ul> </ul>
</div>); </div>);
} }

View File

@ -1,23 +1,57 @@
import { createRef, h } from 'preact'; import { Component, createRef, h } from "preact";
import { Router } from 'preact-router'; import { Router } from "preact-router";
import Header from './header'; import Header from "./header";
import Login from '../routes/login'; import Login from "../routes/login";
import Profile from '../routes/profile'; import Profile from "../routes/profile";
import Menu from './menu'; import Menu from "./menu";
import Users from '../routes/users'; import Users from "../routes/users";
import { useCallback, useState } from "preact/hooks";
const menu = createRef(); const menu = createRef();
class App extends Component {
toggleMenu() {
const [visible, setValue] = useState(false);
const toggle = useCallback(() => {
setValue(!visible);
return !visible;
}, [visible]);
return { visible, toggle };
}
authenticateUser() {
const [session, setValue] = useState({ token: null });
const login = (username, password) => {
if (username == "admin" && password == "admin") {
setValue({ ...session, token: "ABCDEFG" });
return true;
}
};
const logout = () => setValue({ ...session, token: null });
const isAuthenticated = () => session.token != null;
return { login, logout, isAuthenticated };
}
const App = () => ( render() {
const menu = this.toggleMenu();
const auth = this.authenticateUser();
return (
<div id="wrapper"> <div id="wrapper">
<Header menu={menu} /> <Header menu={menu} auth={auth} />
<Menu ref={menu} /> <Menu menu={menu} />
<Login /> {!menu.visible &&
(!auth.isAuthenticated() ? (
<Login auth={auth} />
) : (
<div class="page">
<Router> <Router>
<Profile path="/profile/" user="me" /> <Profile path="/test/" user="me" />
<Profile path="/profile/:user" /> <Profile path="/profile/:user" />
<Users path="/users" /> <Users path="/users" />
<div class="container" default>Error 404</div>
</Router> </Router>
</div> </div>
) ))}
</div>
);
}
}
export default App; export default App;

View File

@ -1,37 +1,21 @@
import { Component, createRef, h } from 'preact'; import { Component, createRef, h } from 'preact';
//import { Link } from 'preact-router/match'; //import { Link } from 'preact-router/match';
class Header extends Component { const Header = (props) => (
state = { shown: true }
hamburger = createRef();
togglemenu() {
if (this.props.menu.current) {
this.setState(prev => ({ shown: !prev.shown }));
this.props.menu.current.toggle(this.state);
if (this.state.shown) {
this.hamburger.current.classList.add('hamburger-active');
}
else {
this.hamburger.current.classList.remove('hamburger-active');
}
}
}
render(props){
return (
<header className='header'> <header className='header'>
<div className="container"> <div className="container">
<h1>Login</h1> <h1>Login</h1>
<div id="hamburger-button" ref={this.hamburger} className='hamburger' onClick={() => this.togglemenu(props)}> {props.auth.isAuthenticated() && (<div id="hamburger-button" className={`hamburger ${props.menu.visible && 'hamburger-active'}`}
onClick={() => props.menu.toggle()}>
<hr /> <hr />
<hr /> <hr />
<hr /> <hr />
</div> </div>)}
</div> </div>
</header> </header>
); );
}
}
export default Header; export default Header;

View File

@ -1,36 +1,34 @@
import { Component, h } from 'preact'; import { Component, h } from 'preact';
import { Link } from 'preact-router';
class Menu extends Component { class Menu extends Component {
menu_items = [ menu_items = [
{ text: "Übersicht", path: "/" }, { text: "Übersicht", path: "/" },
{ text: "Benutzer", path: "/user" }, { text: "Benutzer", path: "/users" },
{ text: "System", path: "/system" }, { text: "System", path: "/system" },
{ text: "Backup", path: "/backup" }, { text: "Backup", path: "/backup" },
{ text: "Abmelden", path: "/" } { text: "Abmelden", path: "/logout" }
] ]
state = { shown: false }
toggle(val) {
this.setState(val);
}
getAlert() { getAlert() {
alert("getAlert from Child"); alert("getAlert from Child");
} }
onClick = (e) => {
e.preventDefault();
this.props.menu.toggle();
}
render(props, state) { render(props, state) {
if (props.menu.visible)
return (<div id="menu-screen" className='page' style={`display: ${state.shown ? 'flex' : 'none'}`}> return (
<div class="container"> <div class="container" >
<nav className='menu'> <nav className='menu' >
<ul> <ul>
{this.menu_items.map((element,i) => (<li key={i}><a href={element.link}>{element.text}</a></li>))} <li><Link href="/test" >Test</Link></li>
{this.menu_items.map((element, i) => (<li key={i}><Link href={element.path} onClick={this.onClick} >{element.text}</Link></li>))}
</ul> </ul>
</nav> </nav>
</div>
</div>) </div>)
} }
} }

View File

@ -1,4 +1,6 @@
import './style/style.sass'; import './style/style.sass';
import App from './components/app'; import App from './components/app';
import { h, render, Component } from "preact"
export default App; render(<App />, document.body)
//export default App;

View File

@ -2,12 +2,14 @@ import { Component, h } from 'preact';
import Breadcrumbs from '../../components/breadcrumbs'; import Breadcrumbs from '../../components/breadcrumbs';
class Login extends Component { class Login extends Component {
state = { name: '', password: '' }; state = { username: '', password: '' };
navigation = ["Login"]; navigation = ["Login"];
onSubmit = (e) => { onSubmit = (e) => {
e.preventDefault(); e.preventDefault();
console.log(this.state); console.log(this.state);
this.setState({ name: '', password: '' }); this.setState({ username: '', password: '' });
if(!this.props.auth.login(this.state.username,this.state.password))
alert("Wrong login")
} }
render() { render() {
@ -21,7 +23,7 @@ class Login extends Component {
Bitte melden Sie sich mit ihren Nutzerdaten an. Bitte melden Sie sich mit ihren Nutzerdaten an.
</p> </p>
<div class="input-box"> <div class="input-box">
<input id="name" type="text" placeholder="Username" onInput={e => this.setState(prev => ({ ...prev, name: e.target.value }))} value={this.state.name} /> <input id="name" type="text" placeholder="Username" onInput={e => this.setState(prev => ({ ...prev, username: e.target.value }))} value={this.state.username} />
<label for="name">Benutzername</label> <label for="name">Benutzername</label>
</div> </div>
<div class="input-box"> <div class="input-box">

View File

@ -2,6 +2,9 @@ import { Component } from "preact";
import UserList from "../../components/userlist"; import UserList from "../../components/userlist";
import Pageselector from "../../components/Pageselector"; import Pageselector from "../../components/Pageselector";
class Users extends Component { class Users extends Component {
shouldComponentUpdate() {
return false
}
userlist = [ userlist = [
{ uid: 1234, first_name: 'Max', last_name: 'Muster', rfid: 'D3A2E35E', pin: 1234 }, { uid: 1234, first_name: 'Max', last_name: 'Muster', rfid: 'D3A2E35E', pin: 1234 },
{ uid: 12341, first_name: 'Max1', last_name: 'Muster', rfid: 'D3A2E35E', pin: 1234 }, { uid: 12341, first_name: 'Max1', last_name: 'Muster', rfid: 'D3A2E35E', pin: 1234 },
@ -9,12 +12,12 @@ class Users extends Component {
]; ];
render() { render() {
return ( return (
<div id="user-screen" class="page">
<div class="container"> <div class="container">
<UserList userlist={this.userlist} /> <UserList userlist={this.userlist} />
<Pageselector /> <Pageselector start={1} end={9} current={2} />
</div> </div>
</div>); );
} }
} }

View File

@ -0,0 +1,26 @@
@mixin pageselector
text-align: center
//background-color: #ccc
margin: 1em
ul
list-style: none
justify-content: center
margin: 0
padding: 0
display: flex
li a
text-decoration: none
font-weight: bold
padding: .2em .5em
margin: .3em
border-radius: .3em
background: #eee
color: #ccc
border: .1em solid #ccc
&.active
background: #888
color: #eee
&:hover
color: #333
background: #fff
border: .1em solid #ccc

View File

@ -2,6 +2,7 @@
@use 'menu' @use 'menu'
@use 'login' @use 'login'
@use 'breadcrumbs' @use 'breadcrumbs'
@use 'pageselector'
* *
//border: red 1px dotted //border: red 1px dotted
box-sizing: border-box box-sizing: border-box
@ -53,7 +54,7 @@ body
display: flex display: flex
background: white background: white
width: 100% width: 100%
padding-top: 3em padding-top: 6em
.menu .menu
@include menu.nav @include menu.nav
@ -61,28 +62,7 @@ body
@include login.login-form @include login.login-form
.page-nav-bar .page-nav-bar
text-align: center @include pageselector.pageselector
//background-color: #ccc
margin: 1em
ul
list-style: none
justify-content: center
margin: 0
padding: 0
display: flex
li a
text-decoration: none
font-weight: bold
padding: .2em .5em
margin: .3em
border-radius: .3em
background: #eee
color: #ccc
border: .1em solid #ccc
&:hover
color: #333
background: #fff
border: .1em solid #ccc
.user-list-item .user-list-item
overflow: hidden overflow: hidden
display: flex display: flex