qr checkbox reihenfolge

This commit is contained in:
2023-01-06 01:35:04 +01:00
parent 44b4605324
commit 4de971490a
3 changed files with 216 additions and 48 deletions

View File

@ -0,0 +1,42 @@
import { useState } from "react";
const Checkbox = (
{
id,
label,
checked,
changeEvent,
...props
}:
{
id: string,
label: string,
checked: boolean,
changeEvent: (id: string, checked: boolean) => void
}) =>
{
const defaultChecked = checked ? checked : false;
const [isChecked, setIsChecked] = useState(defaultChecked);
return (
<div className="checkbox-wrapper">
<label>
<input
id={id}
type="checkbox"
checked={isChecked}
onChange=
{
() =>
{
setIsChecked((prev) => !prev);
changeEvent(id, !checked); // now is the opposite
}
}
{...props}
/>
<span>{label}</span>
</label>
</div>
);
};
export default Checkbox;

View File

@ -62,3 +62,17 @@ img
{ {
order: 3; order: 3;
} }
.list-container
{
margin-top:40px;
}
.list-item
{
display:flex;
align-items: center;
padding:0px 20px;
margin-top:15px;
cursor:move;
}

View File

@ -1,15 +1,33 @@
import React, { useContext, useState } from 'react' import React, { useContext, useState } from 'react'
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import { UserCtx, UserCtxT, DogT, Axios, ResponseT, TUser } from '../context/UserContext'; import { UserCtx, UserCtxT, DogT, Axios, ResponseT, TUser } from '../context/UserContext';
import Checkbox from './Checkbox';
import Img from './Img'; import Img from './Img';
import './Qr.css'; import './Qr.css';
type ListItemT =
{
name: string;
ordernum: number;
}
export default function Qr() export default function Qr()
{ {
const { user } = useContext<UserCtxT | null>(UserCtx) as UserCtxT; const { user } = useContext<UserCtxT | null>(UserCtx) as UserCtxT;
const [dog, setDog] = useState<DogT | any>({}); // local dog not the dog in UserContext const [dog, setDog] = useState<DogT | any>({}); // local dog not the dog in UserContext
const [fontSize, setFontSize] = useState(100); const [fontSize, setFontSize] = useState(100);
const [visibleItem, setVisibleItem] = useState(0b111); // 100 name, 10 phone, 1 email
const [itemOrder, setItemOrder] = useState(123); // name first, phone second, email third
const [itemList, setItemList] = useState([
{name:'Name', ordernum: 1},
{name:'Telefon', ordernum: 2},
{name:'Email', ordernum: 3}
]);
//save reference for dragItem and dragOverItem
const dragItem = React.useRef<any>(null);
const dragOverItem = React.useRef<any>(null);
function incrementFontSize() function incrementFontSize()
{ {
if(fontSize < 200) if(fontSize < 200)
@ -17,6 +35,7 @@ export default function Qr()
setFontSize(fontSize + 1); setFontSize(fontSize + 1);
} }
} }
function decrementFontSize() function decrementFontSize()
{ {
if(fontSize > 1) if(fontSize > 1)
@ -25,6 +44,75 @@ export default function Qr()
} }
} }
function setBitField(val: number, checked: boolean, bit: number) : number
{
if(checked)
{
val |= bit;
}
else
{
val ^= bit;
}
return val;
}
function checkBoxChange(id: string, checked: boolean) : void
{
let value = visibleItem;
if(id==="name")
{
value = setBitField(value, checked, 0b100);
}
if(id==="phone")
{
value = setBitField(value, checked, 0b010);
}
if(id==="email")
{
value = setBitField(value, checked, 0b001);
}
setVisibleItem(value);
}
function getItemOrderNumber(digit: number)
{
let ordernum = itemOrder; // 123
ordernum = ordernum % (digit*10); // 123
ordernum = Math.trunc(ordernum / digit);
return ordernum;
}
//const handle drag sorting
function handleSort()
{
//duplicate items
let _itemList = [...itemList];
//remove and save the dragged item content
const draggedItemContent = _itemList.splice(dragItem.current, 1)[0];
//switch the position
_itemList.splice(dragOverItem.current, 0, draggedItemContent);
//reset the position ref
dragItem.current = null;
dragOverItem.current = null;
//update the actual array
setItemList(_itemList);
// set new itemorder
let newItemOrder = 0;
let digit = 100;
_itemList.map((item, index) =>
{
newItemOrder += item.ordernum * digit;
digit /= 10;
});
setItemOrder(newItemOrder);
}
if(user && dog.success === undefined) if(user && dog.success === undefined)
{ {
Axios.post<ResponseT>('getDog.php', Axios.post<ResponseT>('getDog.php',
@ -46,19 +134,45 @@ export default function Qr()
<Link to={"/profil"}>Zurück zum Profil</Link> <Link to={"/profil"}>Zurück zum Profil</Link>
<div> <div>
<button onClick={incrementFontSize}>up</button> <button onClick={incrementFontSize}>up</button>
<div>{fontSize}</div> <div>{fontSize}</div>
<button onClick={decrementFontSize}>down</button> <button onClick={decrementFontSize}>down</button>
</div> </div>
<div>
<Checkbox
id='name'
label={'Name'}
{/* <div>Logged in als:</div> checked={(visibleItem & 0b100) > 0}
<div>{user?.email}</div> changeEvent={checkBoxChange}
<div>{user?.qr_id}</div> />
<div>{dog.data.qr_code}</div> */} <Checkbox
id='phone'
label={'Telefon'}
checked={(visibleItem & 0b010) > 0}
changeEvent={checkBoxChange}
/>
<Checkbox
id='email'
label={'Email'}
checked={(visibleItem & 0b001) > 0}
changeEvent={checkBoxChange}
/>
</div>
<div className="list-container">
{itemList.map((item, index) => (
<div
key={index}
className="list-item"
draggable
onDragStart={(e) => (dragItem.current = index)}
onDragEnter={(e) => (dragOverItem.current = index)}
onDragEnd={handleSort}
onDragOver={(e) => e.preventDefault()}>
<h6>{item.name}</h6>
</div>
))}
</div>
<div className='blockRepeat'> <div className='blockRepeat'>
<div className='qrCodeBackFront'> <div className='qrCodeBackFront'>
<div className='qrCode frame'> <div className='qrCode frame'>
@ -66,9 +180,31 @@ export default function Qr()
<Img pth={dog.data.qr_code}/> <Img pth={dog.data.qr_code}/>
</div> </div>
<div className='qrCodeVert frame' style={{ fontSize: fontSize + '%' }}> <div className='qrCodeVert frame' style={{ fontSize: fontSize + '%' }}>
<div className='vertFont'>{dog.data.name}</div> {((visibleItem & 0b100) > 0) && <div className={`vertFont order${getItemOrderNumber(100)}`}>{dog.data.name}</div>}
<div className='vertFont'>{dog.data.phone}</div> {((visibleItem & 0b010) > 0) && <div className={`vertFont order${getItemOrderNumber(10)}`}>{dog.data.phone}</div>}
<div className='vertFont'>{dog.data.email}</div> {((visibleItem & 0b001) > 0) && <div className={`vertFont order${getItemOrderNumber(1)}`}>{dog.data.email}</div>}
</div>
</div>
<div className='qrCodeBackFront'>
<div className='qrCode frame'>
<div className='qrCode__'>SCAN ME</div>
<Img pth={dog.data.qr_code}/>
</div>
<div className='qrCodeVert frame' style={{ fontSize: fontSize + '%' }}>
{((visibleItem & 0b100) > 0) && <div className={`vertFont order${getItemOrderNumber(100)}`}>{dog.data.name}</div>}
{((visibleItem & 0b010) > 0) && <div className={`vertFont order${getItemOrderNumber(10)}`}>{dog.data.phone}</div>}
{((visibleItem & 0b001) > 0) && <div className={`vertFont order${getItemOrderNumber(1)}`}>{dog.data.email}</div>}
</div>
</div>
<div className='qrCodeBackFront'>
<div className='qrCode frame'>
<div className='qrCode__'>SCAN ME</div>
<Img pth={dog.data.qr_code}/>
</div>
<div className='qrCodeVert frame' style={{ fontSize: fontSize + '%' }}>
{((visibleItem & 0b100) > 0) && <div className={`vertFont order${getItemOrderNumber(100)}`}>{dog.data.name}</div>}
{((visibleItem & 0b010) > 0) && <div className={`vertFont order${getItemOrderNumber(10)}`}>{dog.data.phone}</div>}
{((visibleItem & 0b001) > 0) && <div className={`vertFont order${getItemOrderNumber(1)}`}>{dog.data.email}</div>}
</div> </div>
</div> </div>
@ -79,9 +215,9 @@ export default function Qr()
<Img pth={dog.data.qr_code}/> <Img pth={dog.data.qr_code}/>
</div> </div>
<div className='qrCodeVert frame' style={{ fontSize: fontSize + '%' }}> <div className='qrCodeVert frame' style={{ fontSize: fontSize + '%' }}>
<div className='vertFont order2'>{dog.data.name}</div> {((visibleItem & 0b100) > 0) && <div className={`vertFont order${getItemOrderNumber(100)}`}>{dog.data.name}</div>}
<div className='vertFont order3'>{dog.data.phone}</div> {((visibleItem & 0b010) > 0) && <div className={`vertFont order${getItemOrderNumber(10)}`}>{dog.data.phone}</div>}
<div className='vertFont order1'>{dog.data.email}</div> {((visibleItem & 0b001) > 0) && <div className={`vertFont order${getItemOrderNumber(1)}`}>{dog.data.email}</div>}
</div> </div>
</div> </div>
<div className='qrCodeBackFront'> <div className='qrCodeBackFront'>
@ -90,9 +226,9 @@ export default function Qr()
<Img pth={dog.data.qr_code}/> <Img pth={dog.data.qr_code}/>
</div> </div>
<div className='qrCodeVert frame' style={{ fontSize: fontSize + '%' }}> <div className='qrCodeVert frame' style={{ fontSize: fontSize + '%' }}>
<div className='vertFont'>{dog.data.name}</div> {((visibleItem & 0b100) > 0) && <div className={`vertFont order${getItemOrderNumber(100)}`}>{dog.data.name}</div>}
<div className='vertFont'>{dog.data.phone}</div> {((visibleItem & 0b010) > 0) && <div className={`vertFont order${getItemOrderNumber(10)}`}>{dog.data.phone}</div>}
<div className='vertFont'>{dog.data.email}</div> {((visibleItem & 0b001) > 0) && <div className={`vertFont order${getItemOrderNumber(1)}`}>{dog.data.email}</div>}
</div> </div>
</div> </div>
@ -103,33 +239,9 @@ export default function Qr()
<Img pth={dog.data.qr_code}/> <Img pth={dog.data.qr_code}/>
</div> </div>
<div className='qrCodeVert frame' style={{ fontSize: fontSize + '%' }}> <div className='qrCodeVert frame' style={{ fontSize: fontSize + '%' }}>
<div className='vertFont'>{dog.data.name}</div> {((visibleItem & 0b100) > 0) && <div className={`vertFont order${getItemOrderNumber(100)}`}>{dog.data.name}</div>}
<div className='vertFont'>{dog.data.phone}</div> {((visibleItem & 0b010) > 0) && <div className={`vertFont order${getItemOrderNumber(10)}`}>{dog.data.phone}</div>}
<div className='vertFont'>{dog.data.email}</div> {((visibleItem & 0b001) > 0) && <div className={`vertFont order${getItemOrderNumber(1)}`}>{dog.data.email}</div>}
</div>
</div>
<div className='qrCodeBackFront'>
<div className='qrCode frame'>
<div className='qrCode__'>SCAN ME</div>
<Img pth={dog.data.qr_code}/>
</div>
<div className='qrCodeVert frame' style={{ fontSize: fontSize + '%' }}>
<div className='vertFont'>{dog.data.name}</div>
<div className='vertFont'>{dog.data.phone}</div>
<div className='vertFont'>{dog.data.email}</div>
</div>
</div>
<div className='qrCodeBackFront'>
<div className='qrCode frame'>
<div className='qrCode__'>SCAN ME</div>
<Img pth={dog.data.qr_code}/>
</div>
<div className='qrCodeVert frame' style={{ fontSize: fontSize + '%' }}>
<div className='vertFont'>{dog.data.name}</div>
<div className='vertFont'>{dog.data.phone}</div>
<div className='vertFont'>{dog.data.email}</div>
</div> </div>
</div> </div>
</div> </div>