Modify all admin editing panels to standard input boxes.
This commit is contained in:
parent
766ac6a5b5
commit
cc138fd586
BIN
public/spinner.gif
Normal file
BIN
public/spinner.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 36 KiB |
76
src/App.js
76
src/App.js
@ -370,48 +370,17 @@ function PopupWindow(p) {
|
|||||||
</Modal>
|
</Modal>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function InputBox(p) {
|
||||||
function EditBackendBox(p) {
|
const [value,setValue] = useState(p.value)
|
||||||
useEffect(()=>{
|
const [failed,setFailed] = useState(false)
|
||||||
var timer1 = setTimeout(()=>{document.getElementById("editBox").focus()},100)
|
const [sending,setSending] = useState(false)
|
||||||
return () => {
|
return <input className={failed?"failedInput":sending?"submitting":""} onChange={(f)=>{setValue(f.currentTarget.value)}} onBlur={(f)=>{
|
||||||
clearTimeout(timer1);
|
setSending(true)
|
||||||
};
|
setFailed(false)
|
||||||
})
|
p.callback(f.currentTarget.value)
|
||||||
return <input id="editBox" onKeyDown={(e)=>{
|
.then(()=>{setFailed(false)})
|
||||||
if (e.key==="Enter") {p.setEdit(false);p.setUpdate(true)}
|
.catch(()=>{setFailed(true)})
|
||||||
else if (e.key==="Escape") {p.setEdit(false)}
|
.then(()=>{setSending(false)})}} value={value}/>
|
||||||
}} maxLength={p.maxlength?p.maxlength:20} onBlur={()=>{p.setEdit(false);p.setUpdate(true)}} value={p.value} onChange={(f)=>{f.currentTarget.value.length>0?p.setName(f.currentTarget.value):p.setName(p.originalName)}}>
|
|
||||||
</input>
|
|
||||||
}
|
|
||||||
|
|
||||||
function EditableBackendBox(p) {
|
|
||||||
const [update,setUpdate] = useState(false)
|
|
||||||
const [edit,setEdit] = useState(false)
|
|
||||||
const [value,setValue] = useState(p.children)
|
|
||||||
const [originalValue,setOriginalValue] = useState(p.children)
|
|
||||||
|
|
||||||
useEffect(()=>{
|
|
||||||
if (p.callback&&update) {
|
|
||||||
p.callback(value)
|
|
||||||
.then(()=>{
|
|
||||||
setUpdate(false)
|
|
||||||
setOriginalValue(value)
|
|
||||||
})
|
|
||||||
.catch(()=>{
|
|
||||||
setUpdate(false)
|
|
||||||
setValue(originalValue)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},[update,originalValue,p,value])
|
|
||||||
|
|
||||||
return <>
|
|
||||||
<div className="hover table-padding" onClick={(f)=>{setEdit(true)}}>
|
|
||||||
{edit?
|
|
||||||
<EditBackendBox maxlength={p.maxlength} setUpdate={setUpdate} setEdit={setEdit} originalName={originalValue} setName={setValue} value={value}/>
|
|
||||||
:<>{value}</>}
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function TableEditor(p) {
|
function TableEditor(p) {
|
||||||
@ -431,6 +400,7 @@ function TableEditor(p) {
|
|||||||
const [update,setUpdate] = useState(false)
|
const [update,setUpdate] = useState(false)
|
||||||
const [submitVals,setSubmitVal] = useReducer(updateVals,initialVals)
|
const [submitVals,setSubmitVal] = useReducer(updateVals,initialVals)
|
||||||
const [report,setReport] = useState("")
|
const [report,setReport] = useState("")
|
||||||
|
const [loading,setLoading] = useState(false)
|
||||||
|
|
||||||
function SubmitBoxes() {
|
function SubmitBoxes() {
|
||||||
axios.post(BACKEND_URL+p.path,submitVals)
|
axios.post(BACKEND_URL+p.path,submitVals)
|
||||||
@ -448,43 +418,49 @@ function TableEditor(p) {
|
|||||||
|
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
if (update) {
|
if (update) {
|
||||||
|
setLoading(true)
|
||||||
axios.get(BACKEND_URL+p.path)
|
axios.get(BACKEND_URL+p.path)
|
||||||
.then((data)=>{
|
.then((data)=>{
|
||||||
var cols = data.data.fields
|
var cols = data.data.fields
|
||||||
var rows = data.data.rows
|
var rows = data.data.rows
|
||||||
|
|
||||||
setFields(cols.filter((col)=>col.name!=="id").map((col)=>col.name))
|
setFields(cols.filter((col)=>col.name!=="id"))
|
||||||
setData(rows)
|
setData(rows)
|
||||||
})
|
})
|
||||||
.catch((err)=>{
|
.catch((err)=>{
|
||||||
setReport(JSON.stringify(err))
|
setReport(JSON.stringify(err))
|
||||||
})
|
})
|
||||||
|
.then(()=>{
|
||||||
|
setLoading(false)
|
||||||
|
})
|
||||||
setUpdate(false)
|
setUpdate(false)
|
||||||
}
|
}
|
||||||
},[update,p.path])
|
},[update,p.path])
|
||||||
|
|
||||||
return <>
|
return <>
|
||||||
|
{!loading?
|
||||||
<div className="table-responsive">
|
<div className="table-responsive">
|
||||||
<table cellPadding="10" className="table text-light table-padding">
|
<table cellPadding="10" className="table text-light table-padding">
|
||||||
<caption>{JSON.stringify(report)}</caption>
|
<caption>{JSON.stringify(fields)}</caption>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th className="table-padding"></th>
|
<th className="table-padding"></th>
|
||||||
{fields.map((field,i)=><React.Fragment key={i}><th scope="col" className="table-padding">{field}</th></React.Fragment>)}
|
{fields.map((field,i)=><React.Fragment key={i}><th scope="col" className="table-padding">{field.name}</th></React.Fragment>)}
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{data.map((dat)=><tr key={dat.id}>
|
{data.map((dat)=><tr key={dat.id}>
|
||||||
<td><XSquareFill className="webicon" onClick={()=>{axios.delete(BACKEND_URL+p.path,{data:{id:dat.id}}).then(()=>{setUpdate(true)}).catch((err)=>{alert(err.response.data)})}}/></td>{fields.map((col,i)=><td key={dat.id+"_"+i} className="table-padding table"><EditableBackendBox callback={(value)=>{
|
<td><XSquareFill className="webicon" onClick={()=>{axios.delete(BACKEND_URL+p.path,{data:{id:dat.id}}).then(()=>{setUpdate(true)}).catch((err)=>{alert(err.response.data)})}}/></td>{fields.map((col,i)=><td key={dat.id+"_"+i} className="table-padding table">
|
||||||
|
<InputBox callback={(value)=>{
|
||||||
return axios.patch(BACKEND_URL+p.path,{
|
return axios.patch(BACKEND_URL+p.path,{
|
||||||
[col]:value,
|
[col.name]:value,
|
||||||
id:dat.id
|
id:dat.id
|
||||||
})
|
})
|
||||||
}}>{String(dat[col])}</EditableBackendBox></td>)}</tr>)}
|
}} value={String(dat[col.name])}/></td>)}</tr>)}
|
||||||
{<tr><td></td>{fields.map((col,i)=><td key={i}>{<input id={"submitField"+i} onBlur={(i===fields.length-1)?(f)=>{setSubmitVal({field:col,value:f.currentTarget.value});SubmitBoxes();document.getElementById("submitField0").focus()}:(f)=>{setSubmitVal({field:col,value:f.currentTarget.value})}}/>}</td>)}</tr>}
|
{<tr><td></td>{fields.map((col,i)=><td key={i}>{<input id={"submitField"+i} onBlur={(i===fields.length-1)?(f)=>{setSubmitVal({field:col.name,value:f.currentTarget.value});SubmitBoxes();document.getElementById("submitField0").focus()}:(f)=>{setSubmitVal({field:col.name,value:f.currentTarget.value})}}/>}</td>)}</tr>}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>:<img src={process.env.PUBLIC_URL+"/spinner.gif"} alt=""/>}
|
||||||
</>
|
</>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -893,3 +893,9 @@ button{
|
|||||||
color:rgba(200,0,0,1);
|
color:rgba(200,0,0,1);
|
||||||
cursor:pointer;
|
cursor:pointer;
|
||||||
}
|
}
|
||||||
|
.failedInput{
|
||||||
|
border: 1px solid rgba(200,0,0,1);
|
||||||
|
}
|
||||||
|
.submitting{
|
||||||
|
border: 1px solid rgba(0,150,200,1);
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user