qr checkbox reihenfolge
This commit is contained in:
42
src/components/Checkbox.tsx
Normal file
42
src/components/Checkbox.tsx
Normal 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;
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
|||||||
@ -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,18 +134,44 @@ 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>
|
||||||
|
<Checkbox
|
||||||
|
id='name'
|
||||||
|
label={'Name'}
|
||||||
|
checked={(visibleItem & 0b100) > 0}
|
||||||
|
changeEvent={checkBoxChange}
|
||||||
|
/>
|
||||||
|
<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>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{/* <div>Logged in als:</div>
|
|
||||||
<div>{user?.email}</div>
|
|
||||||
<div>{user?.qr_id}</div>
|
|
||||||
<div>{dog.data.qr_code}</div> */}
|
|
||||||
|
|
||||||
<div className='blockRepeat'>
|
<div className='blockRepeat'>
|
||||||
<div className='qrCodeBackFront'>
|
<div className='qrCodeBackFront'>
|
||||||
@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user