jsreport-studio
Version:
jsreport templates editor and designer
127 lines (102 loc) • 4.21 kB
JavaScript
import 'babel-polyfill'
import Promise from 'bluebird'
import PropTypes from 'prop-types'
import React from 'react'
import ReactDOM from 'react-dom'
import { Provider } from 'react-redux'
import { createBrowserHistory } from 'history'
import { ConnectedRouter } from 'connected-react-router'
import ReactModal from 'react-modal'
import zipObject from 'lodash/zipObject'
import createStore from './redux/create'
import getRoutes from './routes'
import fetchExtensions from './lib/fetchExtensions'
import './theme/style.scss'
import * as entities from './redux/entities'
import * as settings from './redux/settings'
import * as configuration from './lib/configuration.js'
import defaults from './configurationDefaults.js'
import getEntityTreeOrder from './helpers/getEntityTreeOrder'
window.React = React
// NOTE: we add this alias just to be able to support compatibility between
// older extensions and studio with react 16, we plan to remove remove this line in v3
window.React.PropTypes = PropTypes
ReactModal.setAppElement(getAppElement())
// eslint-disable-next-line no-undef, camelcase
__webpack_public_path__ = configuration.rootPath() + '/studio/assets/'
defaults()
const browserHistory = createBrowserHistory()
const store = createStore(browserHistory)
// we need to require the Studio file api at this point because it requires some component files
// that need to be evaluated/executed after we set the correct __webpack_public_path__
const { createStudio } = require('./Studio')
var Studio = window.Studio = createStudio(store)
const start = async () => {
await fetchExtensions()
const extensionsArray = await Studio.api.get('/api/extensions')
configuration.extensions = zipObject(extensionsArray.map((e) => e.name), extensionsArray)
const oldMonacoGetWorkerUrl = window.MonacoEnvironment.getWorkerUrl
// we override the function created by monaco-editor-webpack-plugin because
// it does not require chunks with cache in mind
window.MonacoEnvironment.getWorkerUrl = function (...args) {
const url = oldMonacoGetWorkerUrl.apply(window.MonacoEnvironment, args)
return `${url}?${configuration.extensions.studio.options.serverStartupHash}`
}
for (const key in Studio.initializeListeners) {
await Studio.initializeListeners[key]()
}
// add folders to referenceAttributes for all entities
Object.keys(Studio.entitySets).forEach((entitySetName) => {
let entitySet = Studio.entitySets[entitySetName]
if (entitySet.referenceAttributes.indexOf('folder') === -1) {
entitySet.referenceAttributes.push('folder')
}
})
// calculate EntityTree order after initializeListeners
configuration.entityTreeOrder = getEntityTreeOrder(
configuration.extensions['studio'].options.entityTreeOrder,
Studio.entitySets
)
// check is user theme preference is another than the default one, if yes change the theme
if (Studio.getCurrentTheme().theme !== configuration.extensions.studio.options.theme) {
await new Promise((resolve) => {
Studio.setCurrentTheme({
theme: Studio.getCurrentTheme().theme
}, {
onComplete: resolve,
onError: resolve
})
})
}
await Promise.all(
[
...Object.keys(Studio.entitySets).map((t) => entities.actions.loadReferences(t)(store.dispatch)),
Studio.api.get('/api/version', { parseJSON: false }).then((version) => (configuration.version = version)),
Studio.api.get('/api/engine').then((engs) => (configuration.engines = engs)),
Studio.api.get('/api/recipe').then((recs) => (configuration.recipes = recs)),
settings.actions.load()(store.dispatch)
]
)
const routes = getRoutes(window.Studio.routes)
let component = (
<ConnectedRouter history={browserHistory}>
{routes}
</ConnectedRouter>
)
ReactDOM.render(
<React.StrictMode>
<Provider store={store} key='provider'>
{component}
</Provider>
</React.StrictMode>,
getAppElement()
)
document.getElementById('loader').style.display = 'none'
for (const key in Studio.readyListeners) {
await Studio.readyListeners[key]()
}
}
function getAppElement () {
return document.getElementById('content')
}
start()