mirror of
https://github.com/qlik-oss/nebula.js.git
synced 2025-12-22 19:24:21 -05:00
* fix(deps): update minor and patch * chore: replace monaco plugin * chore: add file --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: caele <tsm@qlik.com>
101 lines
2.9 KiB
JavaScript
101 lines
2.9 KiB
JavaScript
import React, { useEffect, useState, useCallback } from 'react';
|
|
|
|
import { Button, Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material';
|
|
import { useTheme } from '@nebula.js/ui/theme';
|
|
import useRect from '@nebula.js/nucleus/src/hooks/useRect';
|
|
import * as monaco from '../../monaco-setup';
|
|
|
|
export default function PropertiesDialog({ model, show, close }) {
|
|
const [objectProps, setObjectProps] = useState('');
|
|
const [monacoEditor, setMonacoEditor] = useState(null);
|
|
const [monacoEditorMarkers, setMonacoEditorMarkers] = useState([]);
|
|
const [monacoRef, monacoRect, monacoNode] = useRect();
|
|
const theme = useTheme();
|
|
|
|
const onConfirm = useCallback(() => {
|
|
if (monacoEditorMarkers.length) {
|
|
return;
|
|
}
|
|
model.setProperties(JSON.parse(monacoEditor.getValue())).then(close);
|
|
});
|
|
|
|
useEffect(() => {
|
|
if (!show) {
|
|
return undefined;
|
|
}
|
|
const onChanged = () => {
|
|
model &&
|
|
show &&
|
|
model.getProperties().then((props) => {
|
|
show && setObjectProps(JSON.stringify(props || {}, null, 2));
|
|
});
|
|
};
|
|
|
|
model.on('changed', onChanged);
|
|
onChanged();
|
|
return () => {
|
|
model && model.removeListener('changed', onChanged);
|
|
};
|
|
}, [model && model.id, show]);
|
|
|
|
useEffect(() => {
|
|
if (!monacoRef || !monacoNode || !monacoRect || !objectProps) {
|
|
return undefined;
|
|
}
|
|
const { left, top, width, height } = monacoRect;
|
|
if (left === 0 && top === 0 && width === 0 && height === 0) {
|
|
return undefined;
|
|
}
|
|
const editor = monaco.editor.create(monacoNode, {
|
|
value: objectProps,
|
|
language: 'json',
|
|
scrollBeyondLastLine: false,
|
|
theme: theme.palette.mode === 'dark' ? 'vs-dark' : 'vs-light',
|
|
});
|
|
editor.layout({ width: monacoRect.width, height: monacoRect.height });
|
|
const subscription = editor.onDidChangeModelDecorations(() => {
|
|
const m = monaco.editor.getModelMarkers();
|
|
setMonacoEditorMarkers(m);
|
|
});
|
|
editor.focus();
|
|
setMonacoEditor(editor);
|
|
return () => {
|
|
subscription.dispose();
|
|
const editorModel = editor.getModel();
|
|
if (editorModel) {
|
|
editorModel.dispose();
|
|
}
|
|
editor.dispose();
|
|
};
|
|
}, [monacoNode, monacoRect, objectProps]);
|
|
|
|
return (
|
|
<Dialog
|
|
disableEscapeKeyDown
|
|
open={show}
|
|
scroll="paper"
|
|
maxWidth="md"
|
|
onClose={close}
|
|
PaperProps={{
|
|
style: {
|
|
height: '80%',
|
|
width: '80%',
|
|
},
|
|
}}
|
|
>
|
|
<DialogTitle>Modify object properties</DialogTitle>
|
|
<DialogContent dividers>
|
|
<div ref={monacoRef} style={{ overflow: 'hidden', height: '100%' }} />
|
|
</DialogContent>
|
|
<DialogActions>
|
|
<Button variant="contained" onClick={close}>
|
|
Cancel
|
|
</Button>
|
|
<Button variant="contained" onClick={onConfirm} disabled={monacoEditorMarkers.length > 0}>
|
|
Confirm
|
|
</Button>
|
|
</DialogActions>
|
|
</Dialog>
|
|
);
|
|
}
|