leumas-private-shared
Version:
Private React JSX Package For Leumas Shared Components, Headers, Footers, Asides, Login Pages, API Key Manager and much more. Styles and everything reusable to avoid DRY code across all of our subdomains
90 lines (82 loc) • 2.72 kB
JSX
import React, { useState } from 'react';
import AceEditor from 'react-ace';
import 'ace-builds/src-noconflict/mode-javascript';
import 'ace-builds/src-noconflict/theme-github';
import mongooseSyntax from './mongooseSyntax.json';
import { Box, Button, Typography, Grid } from '@mui/material';
const initialSchema = `const mongoose = require('mongoose');
const schema = new mongoose.Schema({
// Add your fields here
});
module.exports = mongoose.model('ModelName', schema);`;
const SchemaBuilder = () => {
const [schema, setSchema] = useState(initialSchema);
const addField = (type) => {
const newField = `\n fieldName: { type: ${type} },`;
setSchema((prevSchema) => prevSchema.replace('// Add your fields here', `// Add your fields here${newField}`));
};
return (
<Box sx={{ display: 'flex', height: '100vh' }}>
<Box
component="aside"
sx={{
width: 300,
p: 2,
borderRight: 1,
borderColor: 'divider',
overflow: 'auto',
}}
>
<Typography variant="h6" gutterBottom>
Schema Types
</Typography>
<Grid container spacing={1}>
{mongooseSyntax.types.map((type) => (
<Grid item xs={6} key={type}>
<Button variant="contained" onClick={() => addField(type)} fullWidth>
{type}
</Button>
</Grid>
))}
</Grid>
<Typography variant="h6" gutterBottom sx={{ mt: 2 }}>
Validators
</Typography>
<Grid container spacing={1}>
{mongooseSyntax.validators.map((validator) => (
<Grid item xs={6} key={validator}>
<Button variant="contained" fullWidth>
{validator}
</Button>
</Grid>
))}
</Grid>
<Typography variant="h6" gutterBottom sx={{ mt: 2 }}>
Options
</Typography>
<Grid container spacing={1}>
{mongooseSyntax.options.map((option) => (
<Grid item xs={6} key={option}>
<Button variant="contained" fullWidth>
{option}
</Button>
</Grid>
))}
</Grid>
</Box>
<Box component="main" sx={{ flex: 1, p: 2 }}>
<AceEditor
mode="javascript"
theme="github"
onChange={setSchema}
name="mongoose-schema-editor"
editorProps={{ $blockScrolling: true }}
value={schema}
width="100%"
height="100%"
/>
</Box>
</Box>
);
};
export default SchemaBuilder;