|
@@ -10,6 +10,11 @@ import { GraphQLClient } from 'graphql-request';
|
|
|
|
|
|
import createModels2 from './front-models.mjs'
|
|
|
|
|
|
+import AceEditor from 'react-ace';
|
|
|
+import "ace-builds/src-noconflict/mode-markdown";
|
|
|
+import "ace-builds/src-noconflict/theme-github";
|
|
|
+
|
|
|
+
|
|
|
let gql;
|
|
|
|
|
|
const getGQL = () => new GraphQLClient(localStorage.url + 'graphql', {headers: localStorage.authToken ? {Authorization: 'Bearer '+localStorage.authToken} : {}})
|
|
@@ -163,8 +168,15 @@ const searchQueryBuilder = (search, model) => {
|
|
|
return {$or: model.fields.filter(field => field.type.kind == 'SCALAR').map(field => ({[field.name]: queryRegexp}))}
|
|
|
}
|
|
|
|
|
|
-const GridHeaderItem = ({field, sort:[sort], ...props}) =>
|
|
|
-<div className="GridHeaderItem" {...props}>
|
|
|
+const GridHeaderItem = ({field, sort:[sort], model, ...props}) =>
|
|
|
+<div className="GridHeaderItem"
|
|
|
+ onWheel={e => {
|
|
|
+ //const columnWidths = JSON.parse(localStorage.columWidths || '{}')
|
|
|
+ //if (!columnWidths[localStorage.url]) columnWidths[localStorage.url] = {}
|
|
|
+ //if (!columnWidths[localStorage.url][model.name]) columnWidths[localStorage.url][model.name] = {}
|
|
|
+ //columnWidths[localStorage.url][model.name][field.name]
|
|
|
+ }}
|
|
|
+ {...props}>
|
|
|
{field.name in sort && sort[field.name] === -1 && '^ '}
|
|
|
{field.name}
|
|
|
{field.name in sort && sort[field.name] === 1 && ' v'}
|
|
@@ -172,9 +184,9 @@ const GridHeaderItem = ({field, sort:[sort], ...props}) =>
|
|
|
|
|
|
|
|
|
|
|
|
-const GridHeader = ({fields, sort, onSort}) =>
|
|
|
+const GridHeader = ({fields, sort, onSort, model}) =>
|
|
|
<div className="GridHeader">
|
|
|
- {fields.map(field => <GridHeaderItem key={field.name} field={field} sort={sort} onClick={() => onSort(field.name)}/>)}
|
|
|
+ {fields.map(field => <GridHeaderItem model={model} key={field.name} field={field} sort={sort} onClick={() => onSort(field.name)}/>)}
|
|
|
</div>
|
|
|
|
|
|
const getModelByField = (field, models={}) => {
|
|
@@ -271,7 +283,9 @@ const ModelView = ({model, models={}, options, components:Components={Search, Co
|
|
|
sort={cursorCalls.sort}
|
|
|
onSort={sort => setCursorCalls({...cursorCalls,
|
|
|
sort: [{[sort]: cursorCalls.sort[0][sort] === 1 ? -1 : 1}]
|
|
|
- })}/>
|
|
|
+ })}
|
|
|
+ model={model}
|
|
|
+ />
|
|
|
|
|
|
<Add onClick={() => {
|
|
|
if (Add === 'button') (new model).save()
|
|
@@ -359,7 +373,17 @@ const arrayMove = (arr, newIndex, oldIndex) => {
|
|
|
}
|
|
|
const MDEdit = ({children, field, ...props}) =>
|
|
|
<div style={{display: 'flex'}}>
|
|
|
- <textarea style={{maxWidth: '50%', height: '400px'}} placeholder={field.name} value={children} {...props}/>
|
|
|
+ <AceEditor
|
|
|
+
|
|
|
+ mode="markdown"
|
|
|
+ width='100%'
|
|
|
+ height='400px'
|
|
|
+ theme='github'
|
|
|
+ fontFamily="TerminusTTF"
|
|
|
+ fontSize={15}
|
|
|
+ enableBasicAutocompletion={true}
|
|
|
+ enableLiveAutocompletion={true}
|
|
|
+ style={{maxWidth: '50%', height: '400px'}} placeholder={field.name} value={children} {...props}/>
|
|
|
<div style={{maxWidth: '50%', height: '400px', overflow: 'auto'}}>
|
|
|
{toReact(buildAST(children), React)}
|
|
|
</div>
|
|
@@ -414,7 +438,10 @@ const defaultAdminOptions =
|
|
|
edit: {
|
|
|
formatters:{
|
|
|
ID: ({children}) => <b>{children && children.slice(-6).toUpperCase()}</b>,
|
|
|
- String: ({children, field, ...props}) => <textarea placeholder={field.name} value={children} {...props}/>,
|
|
|
+ String: ({children, field, ...props}) => (typeof children === 'string' && children.includes('\n') ?
|
|
|
+ <textarea placeholder={field.name} value={children} {...props}/> :
|
|
|
+ <><input placeholder={field.name} value={children} {...props} />
|
|
|
+ <button onClick={() => props.onChange && props.onChange((children || '') + '\n')}>V</button> </> ),
|
|
|
Int: ({children, ...props}) => <input type='number' value={children} {...props}/>,
|
|
|
Float: ({children, ...props}) => <input type='number' value={children} {...props} onChange={(e) => props.onChange(+e.target.value)}/>,
|
|
|
Object: ({children, options, model, models, ...props}) => {
|