diff --git a/output/forms.eslint.txt b/output/forms.eslint.txt new file mode 100644 index 0000000000..f8b9a7fa90 --- /dev/null +++ b/output/forms.eslint.txt @@ -0,0 +1,5 @@ + +/home/travis/build/Talend/ui/packages/forms/src/UIForm/fields/Code/Code.component.js + 47:20 error 'value' is already declared in the upper scope no-shadow + +✖ 1 problem (1 error, 0 warnings) diff --git a/packages/components/src/ImportLazy/ImportLazy.component.js b/packages/components/src/ImportLazy/ImportLazy.component.js new file mode 100644 index 0000000000..2af2a76295 --- /dev/null +++ b/packages/components/src/ImportLazy/ImportLazy.component.js @@ -0,0 +1,55 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import Skeleton from '../Skeleton'; + +function DefaultSkeleton() { + return ( +
+ + + + + +
+ ); +} + +/** + * ImportLazy component replace the need for react lazy + */ +export function ImportLazy({skeleton, name, version, path, varName, children}) { + const [added, setAdded] = React.useState(false); + const [loaded, setLoaded] = React.useState(false); + React.useEffect(() => { + const src = window.Talend.getAssetUrl({name, version, path}); + const onload = () => { + if (!varName) { + setLoaded(true); + } + }; + window.Talend.addScript({src, onload}); + if (varName) { + const intervalId = setInterval(() => { + if (window[varName]) { + clearInterval(intervalId); + setLoaded(true); + } + }, 200); + } + }, []); + if (added && loaded) { + if (typeof children[0] === 'function') { + return children[0](loaded); + } + return children; + } + if (skeleton) { + return skeleton; + } + return ; +} + +ImportLazy.propTypes = { + children: PropTypes.node, + skeleton: PropTypes.node, +}; diff --git a/packages/components/src/ImportLazy/index.js b/packages/components/src/ImportLazy/index.js new file mode 100644 index 0000000000..effcb2adbc --- /dev/null +++ b/packages/components/src/ImportLazy/index.js @@ -0,0 +1 @@ +export { ImportLazy } from './ImportLazy.component'; diff --git a/packages/components/src/index.js b/packages/components/src/index.js index 3c4f71047d..107e5f9a93 100644 --- a/packages/components/src/index.js +++ b/packages/components/src/index.js @@ -22,6 +22,7 @@ import CollapsiblePanel from './CollapsiblePanel'; import ConfirmDialog from './ConfirmDialog'; import Datalist from './Datalist'; import { ModelViewer, RecordsViewer } from './DataViewer'; +import { ImportLazy } from './ImportLazy'; import { DatePicker, InputDatePicker, @@ -165,4 +166,5 @@ export { VirtualizedList, WithDrawer, getTheme, + ImportLazy, }; diff --git a/packages/forms/src/UIForm/fields/Code/Code.component.js b/packages/forms/src/UIForm/fields/Code/Code.component.js index 3676e033a8..d6a01d17ab 100644 --- a/packages/forms/src/UIForm/fields/Code/Code.component.js +++ b/packages/forms/src/UIForm/fields/Code/Code.component.js @@ -1,161 +1,143 @@ import PropTypes from 'prop-types'; -import React from 'react'; +import React, { useEffect } from 'react'; import { withTranslation } from 'react-i18next'; import keyCode from 'keycode'; +import { ImportLazy, Skeleton } from '@talend/react-components'; import FieldTemplate from '../FieldTemplate'; -import TextArea from '../TextArea'; + import { generateId, generateDescriptionId, generateErrorId } from '../../Message/generateId'; import getDefaultT from '../../../translate'; import { I18N_DOMAIN_FORMS } from '../../../constants'; -let CodeWidget = TextArea; -let AceEditor; +function CodeSkeleton() { + return ( +
+ + + + + +
+ ); +} + const DEFAULT_SET_OPTIONS = { enableBasicAutocompletion: true, enableLiveAutocompletion: true, enableSnippets: true, }; -class WrappedTextArea extends React.PureComponent { - constructor() { - super(); - // eslint-disable-next-line no-console - console.warn('CodeWidget react-ace not found, fallback to Textarea'); - } - - render() { - return