usereditor, userlist ctx
This commit is contained in:
parent
54bcf8aa68
commit
154366c20e
@ -9,7 +9,7 @@ function checkAuth(token){
|
|||||||
return token==='DUMMYTOKEN';
|
return token==='DUMMYTOKEN';
|
||||||
}
|
}
|
||||||
|
|
||||||
function fetchdb(token){
|
async function fetchdb(token){
|
||||||
//fetch(`${server}/api/userdb`).then()
|
//fetch(`${server}/api/userdb`).then()
|
||||||
let xmlHttp = new XMLHttpRequest();
|
let xmlHttp = new XMLHttpRequest();
|
||||||
xmlHttp.open( "GET", `${server}/api/userdb`, false ); // false for synchronous request
|
xmlHttp.open( "GET", `${server}/api/userdb`, false ); // false for synchronous request
|
||||||
@ -22,8 +22,8 @@ function parsedb(raw){
|
|||||||
let lines = raw.split('\n');
|
let lines = raw.split('\n');
|
||||||
let users = [];
|
let users = [];
|
||||||
lines.map((l,line)=>{
|
lines.map((l,line)=>{
|
||||||
let [uid, first_name, last_name, rfid_uid, user_pin, enabled] = l.split(';');
|
let [uid, first_name, last_name, rfid_uid, user_pin, active] = l.split([';']);
|
||||||
users.push({ line, uid, first_name, last_name, rfid_uid, user_pin, enabled: enabled === '1' });
|
users.push({ line, uid, first_name, last_name, rfid_uid, user_pin, enabled: active[0]==='1' });
|
||||||
});
|
});
|
||||||
return users;
|
return users;
|
||||||
|
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
import { h } from "preact";
|
import { h } from "preact";
|
||||||
|
|
||||||
|
import { Link } from "preact-router";
|
||||||
|
|
||||||
|
|
||||||
const Pageselector = (props) => {
|
const Pageselector = (props) => {
|
||||||
var items = [];
|
var items = [];
|
||||||
if(!isNaN(props.start)&&!isNaN(props.end)&&!isNaN(props.current))
|
if(!isNaN(props.start)&&!isNaN(props.end)&&!isNaN(props.current))
|
||||||
for(var i=props.start; i<=props.end; i++){
|
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><Link {...(i==props.current?{className:'active'}:{})} href={`/users/${i}`} value={i} >{i}</Link></li>);
|
||||||
}
|
}
|
||||||
items.push(<li><a href="#">></a></li>);
|
//items.push(<li><a href="" >></a></li>);
|
||||||
return (
|
return (
|
||||||
<div class="page-nav-bar">
|
<div class="page-nav-bar">
|
||||||
<ul>
|
<ul>
|
||||||
|
@ -1,17 +1,16 @@
|
|||||||
import { h } from "preact";
|
import { h } from "preact";
|
||||||
import { Router, route } from "preact-router";
|
import { Router, route } from "preact-router";
|
||||||
import {Header, Menu} from "./index.js";
|
import { useReducer } from "preact/hooks";
|
||||||
import { menuReducer, sessionReducer } from "../store/reducers";
|
import { Header, Menu } from "./index.js";
|
||||||
import { useEffect, useReducer } from "preact/hooks";
|
import { Home, Users, EditUser, Login, Logout, System } from "../route";
|
||||||
import { Home, Users, Login, Logout, System } from "../route";
|
import { AppStateProvider, UserTableProvider, menuReducer, sessionReducer, userTableReducer } from "../store";
|
||||||
import { AppStateProvider } from "../store/AppState";
|
|
||||||
function App() {
|
function App() {
|
||||||
// useReducer
|
// useReducer
|
||||||
const menu = useReducer(menuReducer, false);
|
const menu = useReducer(menuReducer, false);
|
||||||
const session = useReducer(sessionReducer, {active: true});
|
const session = useReducer(sessionReducer, { active: true });
|
||||||
useEffect(()=>{
|
const [usertable, userreducer] = useReducer(userTableReducer, []);
|
||||||
console.log("Use cookies here");
|
|
||||||
});
|
|
||||||
this.menu_items = [
|
this.menu_items = [
|
||||||
{ text: "Übersicht", path: "/" },
|
{ text: "Übersicht", path: "/" },
|
||||||
{ text: "Benutzer", path: "/users" },
|
{ text: "Benutzer", path: "/users" },
|
||||||
@ -27,21 +26,23 @@ function App() {
|
|||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
|
|
||||||
<AppStateProvider value={{ menu, session}} >
|
<AppStateProvider value={{ menu, session }} >
|
||||||
<div id="wrapper">
|
<div id="wrapper">
|
||||||
<Header />
|
<Header />
|
||||||
<div class="page">
|
<div class="page">
|
||||||
<Menu items={this.menu_items} />
|
<Menu items={this.menu_items} />
|
||||||
{!menu[0] &&
|
{!menu[0] &&
|
||||||
|
<UserTableProvider value={{ usertable, userreducer }} >
|
||||||
<Router onChange={this.handleRoute}>
|
<Router onChange={this.handleRoute}>
|
||||||
<Home path="/" user="me" />
|
<Home path="/" user="me" />
|
||||||
<Login path="login" />
|
<Login path="login" />
|
||||||
<System path="/system" />
|
<System path="/system" />
|
||||||
<Logout path="/logout" />
|
<Logout path="/logout" />
|
||||||
<Users path="/users" />
|
<Users path="/users/:pageid?" />
|
||||||
|
<EditUser path="/edituser/:userid" />
|
||||||
<div class="container" default>Error 404</div>
|
<div class="container" default>Error 404</div>
|
||||||
</Router>
|
</Router>
|
||||||
|
</UserTableProvider>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
|
@ -1,22 +1,13 @@
|
|||||||
import { h } from "preact";
|
import { h } from "preact";
|
||||||
import { useState } from "preact/hooks";
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function UserList({userlist}) {
|
function UserList({userlist,editUser, deleteUser, start, end}) {
|
||||||
const [list, setuserlist] = useState(userlist);
|
|
||||||
|
|
||||||
const deleteUser=(user)=>{
|
|
||||||
let temp = [...list];
|
|
||||||
temp.splice(temp.indexOf(user),1);
|
|
||||||
setuserlist(temp);
|
|
||||||
}
|
|
||||||
const editUser=(user)=>{
|
|
||||||
alert(`edit: ${user.uid}`);
|
|
||||||
}
|
|
||||||
const displayUser=(user)=>{
|
const displayUser=(user)=>{
|
||||||
return (
|
return (
|
||||||
<div key={`user${user.line}`} class="user-list-item">
|
<div key={`user${user.line}`} class="user-list-item" >
|
||||||
<div class="user-attributes">
|
<div class="user-attributes">
|
||||||
<span><b>UID:</b> {user.uid}</span> <span>(<b>{user.enabled?'Aktiv':'Inaktiv'}</b>)</span><br />
|
<span><b>UID:</b> {user.uid}</span> <span>(<b>{user.enabled?'Aktiv':'Inaktiv'}</b>)</span><br />
|
||||||
<span><b>Vorname:</b> {user.first_name}</span><br />
|
<span><b>Vorname:</b> {user.first_name}</span><br />
|
||||||
@ -34,7 +25,7 @@ function UserList({userlist}) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{list&&list.map((user)=>displayUser(user))}
|
{userlist&&(start!==undefined&&end?userlist.slice(start,end).map((user)=>displayUser(user)):userlist.map((user)=>displayUser(user)))}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -1,36 +1,37 @@
|
|||||||
import {h} from 'preact';
|
import {h} from 'preact';
|
||||||
function EditUser(){
|
import { useContext, useState } from 'preact/hooks';
|
||||||
|
import { route } from 'preact-router';
|
||||||
|
import { UserTable } from "../../store";
|
||||||
|
function EditUser({userid}){
|
||||||
|
const { usertable, userreducer } = useContext(UserTable);
|
||||||
|
let user = usertable.find(u=>u.uid===userid)
|
||||||
|
const [formdata, formchange] = useState(user?user:{});
|
||||||
|
const onChange=(e)=>{
|
||||||
|
console.log(e);
|
||||||
|
if(e.target.type==='checkbox')
|
||||||
|
formchange({...formdata, [e.target.id]:e.target.checked})
|
||||||
|
else
|
||||||
|
formchange({...formdata, [e.target.id]:e.target.value})
|
||||||
|
}
|
||||||
|
const onSubmit=(e)=>{
|
||||||
|
e.preventDefault();
|
||||||
|
userreducer({type:'update', user: formdata})
|
||||||
|
route('/users');
|
||||||
|
}
|
||||||
|
const Input = ({id, type='text', label, disabled})=>(<div><label for={id}>{label}</label><input disabled={disabled} type={type} checked={type=='checkbox'&&formdata[id]?'on':''} value={formdata[id]} id={id} onChange={onChange} name={`edit-${id}`} /></div>)
|
||||||
return(
|
return(
|
||||||
<div className='container'>
|
<div className='container'>
|
||||||
<h1>Benutzer Bearbeiten</h1>
|
<h1>Benutzer Bearbeiten</h1>
|
||||||
<form>
|
<form onSubmit={onSubmit}>
|
||||||
<div>
|
<Input id="uid" label="UserID" />
|
||||||
<label>ID</label>
|
<Input id="first_name" label="Vorname" />
|
||||||
<input />
|
<Input id="last_name" label="NachName" />
|
||||||
</div>
|
<Input id="rfid_uid" label="RFID" />
|
||||||
<div>
|
<Input id="user_pin" label="Pin" />
|
||||||
<label>Vorname</label>
|
<Input id="enabled" type={'checkbox'} label="Vorname" />
|
||||||
<input />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label>Nachname</label>
|
|
||||||
<input />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label>RFID</label>
|
|
||||||
<input />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label>Pin</label>
|
|
||||||
<input />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label>Aktiv</label>
|
|
||||||
<input type={'checkbox'} />
|
|
||||||
</div>
|
|
||||||
<input type={'submit'}>Speichern</input>
|
<input type={'submit'}>Speichern</input>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
export default EditUser;
|
@ -1,7 +1,8 @@
|
|||||||
import Home from "./home"
|
import Home from "./home"
|
||||||
import Users from './users'
|
import Users from './users'
|
||||||
|
import EditUser from "./edituser"
|
||||||
import Profile from "./profile"
|
import Profile from "./profile"
|
||||||
import Login from "./login"
|
import Login from "./login"
|
||||||
import Logout from './logout'
|
import Logout from './logout'
|
||||||
import System from './system'
|
import System from './system'
|
||||||
export {Home, Users, Profile, Login, Logout, System }
|
export {Home, Users, EditUser, Profile, Login, Logout, System }
|
@ -1,16 +1,65 @@
|
|||||||
import { h } from "preact";
|
import { h } from "preact";
|
||||||
import UserList from "../../components/userlist";
|
import { UserList, Pageselector, Breadcrumbs } from "../../components";
|
||||||
import {Pageselector, Breadcrumbs} from "../../components";
|
import api from '../../api'
|
||||||
import api, {parsedb} from '../../api'
|
import { route } from 'preact-router';
|
||||||
function Users() {
|
import { useContext, useEffect, useState } from "preact/hooks";
|
||||||
console.log(parsedb)
|
import { UserTable } from "../../store";
|
||||||
|
function Users({pageid}) {
|
||||||
|
const [viewstate, setview] = useState({limit:100, page:1, pages:null})
|
||||||
|
const { usertable, userreducer } = useContext(UserTable)
|
||||||
|
const setPage = (e)=>{
|
||||||
|
e.preventDefault();
|
||||||
|
console.log(e)
|
||||||
|
let page = e.target.text;
|
||||||
|
setview({...viewstate, page})
|
||||||
|
}
|
||||||
|
if (usertable.length === 0)
|
||||||
|
api.fetchdb().then(imported => {
|
||||||
|
let action = { type: 'import', imported };
|
||||||
|
userreducer(action);
|
||||||
|
});
|
||||||
|
useEffect(() => {
|
||||||
|
if (usertable.length === 0)
|
||||||
|
api.fetchdb().then(imported => {
|
||||||
|
let action = { type: 'import', imported };
|
||||||
|
userreducer(action);
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
useEffect(()=>{
|
||||||
|
setview({...viewstate,pages:Math.ceil(usertable.length/viewstate.limit)});
|
||||||
|
console.log("New View effect")
|
||||||
|
},[usertable])
|
||||||
|
useEffect(()=>{
|
||||||
|
if(pageid&&!isNaN(pageid))
|
||||||
|
setview({...viewstate, page: pageid})
|
||||||
|
},[pageid])
|
||||||
|
const deleteUser = (user) => {
|
||||||
|
let action = {
|
||||||
|
type: 'delete',
|
||||||
|
user
|
||||||
|
}
|
||||||
|
userreducer(action)
|
||||||
|
}
|
||||||
|
const calculateView=()=>{
|
||||||
|
let start=viewstate.limit*(viewstate.page-1);
|
||||||
|
let end=viewstate.limit*(viewstate.page);
|
||||||
|
return {start, end}
|
||||||
|
}
|
||||||
|
const editUser = (user) => {
|
||||||
|
route(`/edituser/${user.uid}`);
|
||||||
|
}
|
||||||
const navigation = ["Users"];
|
const navigation = ["Users"];
|
||||||
|
console.log(viewstate);
|
||||||
|
//
|
||||||
return (
|
return (
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<Breadcrumbs items={navigation} />
|
<Breadcrumbs items={navigation} />
|
||||||
<div>Suche: <input type={'text'} /><button>Hinzufügen</button> Limit: <select><optgroup label={'Anzahl'}><option>10</option><option>25</option><option>50</option><option>100</option></optgroup><option>Alle</option></select></div>
|
<div>Suche: <input type={'text'} /><button>Hinzufügen</button> Limit: <select><optgroup label={'Anzahl'}><option>10</option><option>25</option><option>50</option><option>100</option></optgroup><option>Alle</option></select></div>
|
||||||
<UserList userlist={api.fetchdb()} />
|
<UserList {...calculateView()} userlist={usertable} deleteUser={deleteUser} editUser={editUser} />
|
||||||
<Pageselector start={1} end={9} current={2} />
|
<Pageselector start={1} end={viewstate.pages} current={viewstate.page} setPage={setPage} />
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
import { createContext } from "preact";
|
import { createContext } from "preact";
|
||||||
|
|
||||||
const AppState = createContext({});
|
const AppState = createContext({});
|
||||||
|
const AppStateProvider = AppState.Provider;
|
||||||
export const AppStateProvider = AppState.Provider;
|
|
||||||
export default AppState;
|
export default AppState;
|
||||||
|
export {AppStateProvider};
|
8
src/store/UserTable.js
Normal file
8
src/store/UserTable.js
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import { createContext } from "preact";
|
||||||
|
export function CreateUserTable(){
|
||||||
|
const usercontext = createContext();
|
||||||
|
return usercontext;
|
||||||
|
}
|
||||||
|
const UserTable = CreateUserTable();
|
||||||
|
export default UserTable.Provider;
|
||||||
|
export {UserTable}
|
5
src/store/index.js
Normal file
5
src/store/index.js
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import AppState, {AppStateProvider} from "./AppState";
|
||||||
|
import UserTableProvider,{UserTable} from './UserTable';
|
||||||
|
import {menuReducer, sessionReducer, userTableReducer} from './reducers';
|
||||||
|
export default AppState;
|
||||||
|
export {AppStateProvider, UserTableProvider, UserTable, menuReducer, sessionReducer, userTableReducer}
|
@ -9,8 +9,41 @@ export const menuReducer = (state, action) => {
|
|||||||
|
|
||||||
export const sessionReducer = (state, action) => {
|
export const sessionReducer = (state, action) => {
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
case 'start': return {active: true, token: action.token, username: action.username}
|
case 'start': return { active: true, token: action.token, username: action.username }
|
||||||
case 'end': return {active: false, token: null, username: null, exiry: null}
|
case 'end': return { active: false, token: null, username: null, exiry: null }
|
||||||
default: throw new Error("action type unknown to session reducer");
|
default: throw new Error("action type unknown to session reducer");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const userTableReducer = (state, action) => {
|
||||||
|
let user = action.user;
|
||||||
|
switch (action.type) {
|
||||||
|
case 'create': return [...state, { line: state.length, ...user }]
|
||||||
|
case 'delete': {
|
||||||
|
let newstate = [];
|
||||||
|
let newindex = 0;
|
||||||
|
state.forEach((u, i) => {
|
||||||
|
if (user.uid && u.uid !== user.uid|| user.line && i !== user.line )
|
||||||
|
newstate.push({ ...u, line: newindex++ })
|
||||||
|
return newstate;
|
||||||
|
}, []);
|
||||||
|
return newstate;
|
||||||
|
}
|
||||||
|
case 'update': {
|
||||||
|
let newstate = [];
|
||||||
|
state.forEach((u, i) => {
|
||||||
|
if (user.uid && u.uid === user.uid || user.line && i === user.line)
|
||||||
|
newstate.push(user);
|
||||||
|
else
|
||||||
|
newstate.push(u);
|
||||||
|
});
|
||||||
|
return [...newstate]
|
||||||
|
}
|
||||||
|
case 'import':
|
||||||
|
return action.imported;
|
||||||
|
case 'reset':
|
||||||
|
return [];
|
||||||
|
default:
|
||||||
|
throw new Error("action type unknown to usertable reducer");
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user