diff --git a/Gruntfile.js b/Gruntfile.js index 16e14a027f..8a28bea404 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -42,7 +42,15 @@ module.exports = grunt => { const originalLibDir = 'client/lib/original'; - let bundleJsFileList = buildUtils.getPreparedBundleLibList(libs).concat(originalLibDir + '/espo.js'); + let bundleFileMap = {'client/lib/espo-libs.min.js': buildUtils.getPreparedBundleLibList(libs)}; + + for (let i = 0; i < bundleConfig.chunkNumber; i++) { + let bundleFile = originalLibDir + `/espo-${i}.js`; + let minFile = `client/lib/espo-${i}.min.js`; + + bundleFileMap[minFile] = [bundleFile]; + } + let copyJsFileList = buildUtils.getCopyLibDataList(libs); let minifyLibFileList = copyJsFileList @@ -142,9 +150,7 @@ module.exports = grunt => { options: { banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n', }, - files: { - 'client/lib/espo.min.js': bundleJsFileList, - }, + files: bundleFileMap, }, lib: { files: minifyLibFileList, @@ -252,13 +258,23 @@ module.exports = grunt => { grunt.registerTask('espo-bundle', () => { const Bundler = require('./js/bundler'); - let contents = (new Bundler()).bundle(bundleConfig.jsFiles); + let chunks = (new Bundler()).bundle({ + files: bundleConfig.files, + patterns: bundleConfig.patterns, + allPatterns: ['client/src/**/*.js'], + chunkNumber: bundleConfig.chunkNumber, + libs: libs, + }); if (!fs.existsSync(originalLibDir)) { fs.mkdirSync(originalLibDir); } - fs.writeFileSync(originalLibDir + '/espo.js', contents, 'utf8'); + chunks.forEach((chunk, i) => { + let file = originalLibDir + `/espo-${i}.js`; + + fs.writeFileSync(file, chunk, 'utf8'); + }); }); grunt.registerTask('prepare-lib-original', () => { diff --git a/application/Espo/Core/Utils/ClientManager.php b/application/Espo/Core/Utils/ClientManager.php index 6f6a0a1645..58b0a5e5e0 100644 --- a/application/Espo/Core/Utils/ClientManager.php +++ b/application/Espo/Core/Utils/ClientManager.php @@ -179,6 +179,7 @@ class ClientManager $cssFileList = $this->metadata->get(['app', 'client', 'cssList'], []); $linkList = $this->metadata->get(['app', 'client', 'linkList'], []); + $jsLibs = $this->metadata->get(['app', 'jsLibs'], []); $scriptsHtml = ''; @@ -252,6 +253,12 @@ class ClientManager 'internalModuleList' => Json::encode($internalModuleList), 'applicationDescription' => $this->config->get('applicationDescription') ?? self::APP_DESCRIPTION, 'nonce' => $this->nonce, + 'jsLibs' => Json::encode($jsLibs), + 'loaderParams' => Json::encode([ + 'basePath' => $this->basePath, + 'cacheTimestamp' => $loaderCacheTimestamp, + 'internalModuleList' => $internalModuleList, + ]), ]; $html = $this->fileManager->getContents($htmlFilePath); diff --git a/application/Espo/Resources/metadata/app/client.json b/application/Espo/Resources/metadata/app/client.json index 3d4fac4a59..b429acd6b2 100644 --- a/application/Espo/Resources/metadata/app/client.json +++ b/application/Espo/Resources/metadata/app/client.json @@ -1,6 +1,10 @@ { "scriptList": [ - "client/lib/espo.min.js" + "client/lib/espo-libs.min.js", + "client/lib/espo-0.min.js", + "client/lib/espo-1.min.js", + "client/lib/espo-2.min.js", + "client/lib/espo-3.min.js" ], "developerModeScriptList": [ "client/src/loader.js", diff --git a/application/Espo/Tools/App/SettingsService.php b/application/Espo/Tools/App/SettingsService.php index 0a14568f6d..833835d659 100644 --- a/application/Espo/Tools/App/SettingsService.php +++ b/application/Espo/Tools/App/SettingsService.php @@ -90,8 +90,6 @@ class SettingsService { $data = (object) []; - $data->jsLibs = $this->metadata->get(['app', 'jsLibs']); - unset($data->loginView); $loginView = $this->metadata->get(['clientDefs', 'App', 'loginView']); diff --git a/client/modules/crm/src/views/mass-email/fields/smtp-account.js b/client/modules/crm/src/views/mass-email/fields/smtp-account.js index 55fa4a296e..e8d14522f3 100644 --- a/client/modules/crm/src/views/mass-email/fields/smtp-account.js +++ b/client/modules/crm/src/views/mass-email/fields/smtp-account.js @@ -26,128 +26,10 @@ * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ -define('crm:views/mass-email/fields/smtp-account', ['views/fields/enum'], function (Dep) { +define('crm:views/mass-email/fields/smtp-account', ['views/lead-capture/fields/smtp-account'], function (Dep) { return Dep.extend({ dataUrl: 'MassEmail/action/smtpAccountDataList', - - getAttributeList: function () { - return [this.name, 'inboundEmailId']; - }, - - data: function () { - var data = Dep.prototype.data.call(this); - - data.valueIsSet = true; - data.isNotEmpty = true; - - return data; - }, - - setupOptions: function () { - Dep.prototype.setupOptions.call(this); - - this.params.options = []; - this.translatedOptions = {}; - - this.params.options.push('system'); - - if (!this.loadedOptionList) { - if (this.model.get('inboundEmailId')) { - var item = 'inboundEmail:' + this.model.get('inboundEmailId'); - - this.params.options.push(item); - - this.translatedOptions[item] = - (this.model.get('inboundEmailName') || this.model.get('inboundEmailId')) + - ' (' + this.translate('group', 'labels', 'MassEmail') + ')'; - } - } else { - this.loadedOptionList.forEach((item) => { - this.params.options.push(item); - - this.translatedOptions[item] = - (this.loadedOptionTranslations[item] || item) + - ' (' + this.translate('group', 'labels', 'MassEmail') + ')'; - }); - } - - this.translatedOptions['system'] = - this.getConfig().get('outboundEmailFromAddress') + - ' (' + this.translate('system', 'labels', 'MassEmail') + ')'; - }, - - getValueForDisplay: function () { - if (!this.model.has(this.name) && this.isReadMode()) { - if (this.model.has('inboundEmailId')) { - if (this.model.get('inboundEmailId')) { - return 'inboundEmail:' + this.model.get('inboundEmailId'); - } else { - return 'system'; - } - } else { - return '...'; - } - } - - return this.model.get(this.name); - }, - - setup: function () { - Dep.prototype.setup.call(this); - - if ( - this.getAcl().checkScope('MassEmail', 'create') || - this.getAcl().checkScope('MassEmail', 'edit') - ) { - - Espo.Ajax.getRequest(this.dataUrl).then(dataList => { - if (!dataList.length) { - return; - } - - this.loadedOptionList = []; - - this.loadedOptionTranslations = {}; - this.loadedOptionAddresses = {}; - this.loadedOptionFromNames = {}; - - dataList.forEach(item => { - this.loadedOptionList.push(item.key); - - this.loadedOptionTranslations[item.key] = item.emailAddress; - this.loadedOptionAddresses[item.key] = item.emailAddress; - this.loadedOptionFromNames[item.key] = item.fromName || ''; - }); - - this.setupOptions(); - this.reRender(); - }); - } - }, - - fetch: function () { - var data = {}; - var value = this.$element.val(); - - data[this.name] = value; - - if (!value || value === 'system') { - data.inboundEmailId = null; - data.inboundEmailName = null; - } - else { - var arr = value.split(':'); - - if (arr.length > 1) { - data.inboundEmailId = arr[1]; - data.inboundEmailName = this.translatedOptions[data.inboundEmailId] || data.inboundEmailId; - } - } - - return data; - }, - }); }); diff --git a/client/src/app.js b/client/src/app.js index c9aa55579b..18e03e41f1 100644 --- a/client/src/app.js +++ b/client/src/app.js @@ -451,7 +451,6 @@ function ( ]) .then(() => { this.loader.setIsDeveloperMode(this.settings.get('isDeveloperMode')); - this.loader.addLibsConfig(this.settings.get('jsLibs') || {}); this.user = new User(); this.preferences = new Preferences(); diff --git a/client/src/loader.js b/client/src/loader.js index 2336460479..38f9dd75d3 100644 --- a/client/src/loader.js +++ b/client/src/loader.js @@ -924,4 +924,21 @@ loader.define(subject, dependency, callback); }; + (() => { + let loaderParamsTag = document.querySelector('script[data-name="loader-params"]'); + + if (loaderParamsTag) { + let params = JSON.parse(loaderParamsTag.textContent); + + Espo.loader.setCacheTimestamp(params.cacheTimestamp); + Espo.loader.setBasePath(params.basePath); + Espo.loader.setInternalModuleList(params.internalModuleList); + } + + let jsLibsTag = document.querySelector('script[data-name="js-libs"]'); + if (jsLibsTag) { + Espo.loader.addLibsConfig(JSON.parse(jsLibsTag.textContent)); + } + })(); + }).call(window, _, $); diff --git a/client/src/views/admin/layouts/grid.js b/client/src/views/admin/layouts/grid.js index e9b4368c0e..7701b0840c 100644 --- a/client/src/views/admin/layouts/grid.js +++ b/client/src/views/admin/layouts/grid.js @@ -26,9 +26,7 @@ * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ -define('views/admin/layouts/grid', -['views/admin/layouts/base', 'res!client/css/misc/layout-manager-grid.css'], -function (Dep, styleCss) { +define('views/admin/layouts/grid', ['views/admin/layouts/base'], function (Dep) { return Dep.extend({ @@ -247,7 +245,9 @@ function (Dep, styleCss) { this.panelsData = {}; - this.$style = $('