From a26d26a695cad869a84b492dc69c37ed98735a8a Mon Sep 17 00:00:00 2001 From: Martin Artnik Date: Thu, 2 Feb 2023 09:35:10 +0100 Subject: [PATCH 1/2] Support compiling webpacker content from addons [SCI-7187] --- config/webpack/environment.js | 32 +++++++++++++++++++++++++++++++- engines_yarn_install.js | 11 +++++++++++ package.json | 1 + 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 engines_yarn_install.js diff --git a/config/webpack/environment.js b/config/webpack/environment.js index 2409460e2..d3a91f5fc 100644 --- a/config/webpack/environment.js +++ b/config/webpack/environment.js @@ -1,9 +1,39 @@ const { environment } = require('@rails/webpacker') const { VueLoaderPlugin } = require('vue-loader') const vue = require('./loaders/vue') +const { execSync } = require('child_process'); +const { basename, resolve } = require('path'); +const { readdirSync } = require('fs'); environment.loaders.delete('nodeModules') environment.plugins.prepend('VueLoaderPlugin', new VueLoaderPlugin()) environment.loaders.prepend('vue', vue) -module.exports = environment +// Engine pack loading based on https://github.com/rails/webpacker/issues/348#issuecomment-635480949 +// Get paths to all engines' folders +const enginePaths = execSync('ls -d $PWD/addons/*').toString().split('\n').filter((p) => !!p); +enginePaths.forEach((path) => { + const packsFolderPath = `${path}/app/javascript/packs`; + + let entryFiles; + try { + entryFiles = readdirSync(packsFolderPath); + console.log(`Found packs in ${path}`); + } catch { + console.log(`No packs in ${path}`); + return; + } + + entryFiles.forEach((file) => { + // File name without .js + const name = basename(file, '.js'); + const entryPath = `${packsFolderPath}/${file}`; + + environment.entry.set(name, entryPath); + }); + + // Otherwise babel won't transpile the file + environment.loaders.get('babel').include.push(`${path}/app/javascript`); +}); + +module.exports = environment; diff --git a/engines_yarn_install.js b/engines_yarn_install.js new file mode 100644 index 000000000..649321b56 --- /dev/null +++ b/engines_yarn_install.js @@ -0,0 +1,11 @@ +#!/usr/bin/env node + +const { spawn, execSync } = require('child_process'); +const enginePaths = execSync('ls -d $PWD/addons/*').toString().split('\n').filter((p) => !!p); +enginePaths.forEach(enginePath => { + spawn('yarn', ['install'], { + env: process.env, + cwd: enginePath, + stdio: 'inherit' + }); +}); diff --git a/package.json b/package.json index bce6e8615..313c595dc 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "flow": "flow", "lint": "eslint ." }, + "postinstall": "./engines_yarn_install.js", "devDependencies": { "@babel/core": "^7.0.0", "@babel/plugin-transform-react-jsx-source": "^7.0.0", From ebd98bfb8516e54496ecca37eae25fbbcb6d9e2a Mon Sep 17 00:00:00 2001 From: Martin Artnik Date: Mon, 6 Feb 2023 16:05:13 +0100 Subject: [PATCH 2/2] Make TinyMce init more extensible [SCI-7187] --- app/javascript/packs/tiny_mce.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/javascript/packs/tiny_mce.js b/app/javascript/packs/tiny_mce.js index a8b884a9a..a1c41c922 100644 --- a/app/javascript/packs/tiny_mce.js +++ b/app/javascript/packs/tiny_mce.js @@ -40,6 +40,11 @@ import contentUiCss from '!!raw-loader!tinymce/skins/ui/tinymce-5/content.min.cs const contentPStyle = 'p { margin: 0; padding: 0 }'; const contentStyle = [contentCss, contentUiCss, contentPStyle].map((s) => s.toString()).join('\n'); +// Optional pre-initialization method +if (typeof(window.preTinyMceInit) === 'function') { + window.preTinyMceInit(); +} + window.TinyMCE = (() => { function initHighlightjs() { $('[class*=language]').each((i, block) => { @@ -185,7 +190,7 @@ window.TinyMCE = (() => { table autosave autoresize link advlist codesample autolink lists charmap anchor searchreplace wordcount visualblocks visualchars insertdatetime nonbreaking save directionality customimageuploader - marvinjs custom_image_toolbar help quickbars + marvinjs custom_image_toolbar help quickbars ${window.extraTinyMcePlugins ? window.extraTinyMcePlugins : ''} `; // if (typeof (MarvinJsEditor) !== 'undefined') plugins += ' marvinjsplugin'; @@ -212,7 +217,7 @@ window.TinyMCE = (() => { insert: { title: 'Insert', items: 'link codesample inserttable | charmap hr | nonbreaking anchor | insertdatetime customimageuploader marvinjs' }, }, menubar: 'file edit view insert format table', - toolbar: 'undo redo restoredraft | insert | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | table | link | forecolor backcolor | codesample | customimageuploader marvinjs | help', + toolbar: window.customTinyMceToolbar || 'undo redo restoredraft | insert | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | table | link | forecolor backcolor | codesample | customimageuploader marvinjs | help', plugins, autoresize_bottom_margin: 20, placeholder: options.placeholder,