admin: ctrl+enter to submit form
Massimo Melina committed
Feb 11, 2022 at 10:38 UTC
e851268d7c1003f137a873f14ba700532b375220
5 files changed
+17
-9
admin/src/FileCard.ts
+1
-1
@@ -63,7 +63,7 @@ function FileForm({ file }:any) {
63
{ k: 'forbid', comp: BoolField, md: 6 },
64
{ k: 'perm', comp: PermField, label: values.perm ? 'Access restricted' : 'Access not restricted' },
65
{ k: 'mime', lg: 6, label:"MIME type" },
66
- realFolder && { k: 'default', lg: 6, label:"File to serve instead of file list" },
66
+ realFolder && { k: 'default', lg: 6, label:"Serve file instead of list" },
67
]
68
})
69
}
admin/src/Form.ts
+10
-2
@@ -29,7 +29,15 @@ interface FormProps {
29
[rest:string]: any,
30
}
31
export function Form({ fields, values, set, defaults, save, sticky, addToBar=[], barSx, ...rest }: FormProps) {
32
- return h('form', { onSubmit(ev){ ev.preventDefault() } },
32
+ return h('form', {
33
+ onSubmit(ev) {
34
+ ev.preventDefault()
35
+ },
36
+ onKeyDown(ev) {
37
+ if (!save?.disabled && (ev.ctrlKey || ev.metaKey) && ev.key === 'Enter')
38
+ save?.onClick?.()
39
+ }
40
+ },
41
h(Box, rest,
42
save && h(Box, {
43
display: 'flex',
@@ -49,7 +57,7 @@ export function Form({ fields, values, set, defaults, save, sticky, addToBar=[],
57
h(Grid, { container:true, rowSpacing:3, columnSpacing:1 },
58
fields.map((row, idx) => {
59
if (!row)
52
- return
60
+ return null
61
if (isValidElement(row))
62
return h(Grid, { key: idx, item: true, xs: 12 }, row)
63
let field = row
admin/src/api.ts
+5
-4
@@ -1,4 +1,4 @@
1
-import { createElement as h, useEffect, useMemo } from 'react'
1
+import { createElement as h, useCallback, useEffect, useMemo } from 'react'
2
import { Dict, Falsy, getCookie, spinner, useStateMounted } from './misc'
3
import { Alert } from '@mui/material'
4
import _ from 'lodash'
@@ -10,7 +10,7 @@ export function useApiComp(...args: any[]): ReturnType<typeof useApi> {
10
res === undefined ? [spinner(), reload]
11
: res && res instanceof Error ? [h(Alert, { severity: 'error' }, String(res)), reload]
12
: [res, reload],
13
- [res])
13
+ [res, reload])
14
}
15
16
const PREFIX = '/~/api/'
@@ -53,7 +53,8 @@ export function useApi(cmd: string | Falsy, params?: object) : [any, ()=>void] {
53
.then(setRet, setRet)
54
.finally(()=> state.loading = false)
55
}, [cmd, JSON.stringify(params), forcer]) //eslint-disable-line
56
- return [ret, ()=> state.loading || setForcer(v => v+1)]
56
+ const reload = useCallback(()=> state.loading || setForcer(v => v+1), [])
57
+ return [ret, reload]
58
}
59
60
type EventHandler = (type:string, data?:any) => void
@@ -159,6 +160,6 @@ export function useApiList<Record>(cmd:string|Falsy, params: Dict={}) {
160
setLoading(false)
161
clearInterval(timer)
162
}
162
- }, [cmd, JSON.stringify(params)])
163
+ }, [cmd, JSON.stringify(params)]) //eslint-disable-line
164
return { list, loading, error }
165
}
admin/src/dialog.ts
+1
-1
@@ -89,7 +89,7 @@ export async function alertDialog(msg: ReactElement | string | Error, type:Alert
89
90
function Content(){
91
if (typeof msg === 'string' || msg instanceof Error)
92
- msg = h('p', {}, String(msg))
92
+ msg = h('div', {}, String(msg))
93
return msg
94
}
95
}
todo.md
-1
@@ -1,6 +1,5 @@
1
# To do
2
- admin: warn in case of items with same name
3
-- admin: ctrl+enter to submit form
3
- password protect admin
4
- explain fields in admin
5
- allowed referer