From 4cac279b18eb4eb2e97209e9c174601a0a7871b8 Mon Sep 17 00:00:00 2001 From: Tom Searle Date: Tue, 16 Jun 2026 17:29:16 +0100 Subject: [PATCH 1/2] feat(medcat-trainer): plugin-slot for mct-ee licence badge. --- medcat-trainer/webapp/frontend/src/App.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/medcat-trainer/webapp/frontend/src/App.vue b/medcat-trainer/webapp/frontend/src/App.vue index 93b30899f..e91c0b6ad 100644 --- a/medcat-trainer/webapp/frontend/src/App.vue +++ b/medcat-trainer/webapp/frontend/src/App.vue @@ -31,6 +31,7 @@
+ From 1ad088837919c0e7b9152c93e582de393bea1e37 Mon Sep 17 00:00:00 2001 From: Tom Searle Date: Thu, 2 Jul 2026 17:02:55 +0100 Subject: [PATCH 2/2] feat(medcat-trainer): wire MCT EE plugin loading and MedCAT Service form handler --- medcat-trainer/webapp/frontend/env.d.ts | 5 + medcat-trainer/webapp/frontend/src/main.ts | 2 + .../webapp/frontend/src/plugins/enterprise.ts | 17 +++ .../frontend/src/views/ProjectAdmin.vue | 31 ++++- medcat-trainer/webapp/frontend/vite.config.ts | 107 ++++++++++-------- 5 files changed, 113 insertions(+), 49 deletions(-) create mode 100644 medcat-trainer/webapp/frontend/src/plugins/enterprise.ts diff --git a/medcat-trainer/webapp/frontend/env.d.ts b/medcat-trainer/webapp/frontend/env.d.ts index 2b96ad0bb..9471a9c6b 100644 --- a/medcat-trainer/webapp/frontend/env.d.ts +++ b/medcat-trainer/webapp/frontend/env.d.ts @@ -15,3 +15,8 @@ declare module 'tiny-emitter/instance' { const emitter: TinyEmitterInstance export default emitter } + +declare module '@mctee/enterprise' { + const plugin: unknown + export default plugin +} diff --git a/medcat-trainer/webapp/frontend/src/main.ts b/medcat-trainer/webapp/frontend/src/main.ts index f7bc82648..74d61ed8a 100644 --- a/medcat-trainer/webapp/frontend/src/main.ts +++ b/medcat-trainer/webapp/frontend/src/main.ts @@ -26,6 +26,7 @@ import {authPlugin} from "./auth"; import { loadRuntimeConfig, isOidcEnabled } from './runtimeConfig'; import { registerUnauthorizedInterceptor } from './httpAuth' import { initPluginBootstrap } from './plugins/bootstrap' +import { loadEnterprisePlugin } from './plugins/enterprise' import PluginSlot from '@/components/plugins/PluginSlot.vue' const theme ={ @@ -52,6 +53,7 @@ const vuetify = createVuetify({ async function bootstrap() { await loadRuntimeConfig(); + await loadEnterprisePlugin() const app = createApp(App) app.config.globalProperties.$http = axios diff --git a/medcat-trainer/webapp/frontend/src/plugins/enterprise.ts b/medcat-trainer/webapp/frontend/src/plugins/enterprise.ts new file mode 100644 index 000000000..ce2feb814 --- /dev/null +++ b/medcat-trainer/webapp/frontend/src/plugins/enterprise.ts @@ -0,0 +1,17 @@ +/** + * Load the MedCAT Trainer Enterprise frontend plugin when VITE_MCT_EE=1. + * + * Local dev: set MCT_EE_ROOT to the ``medcat-trainer-ee/frontend/src`` folder and + * run the OSS frontend with ``VITE_MCT_EE=1 npm run dev``. + */ +export async function loadEnterprisePlugin(): Promise { + if (import.meta.env.VITE_MCT_EE !== '1') { + return + } + try { + await import('@mctee/enterprise') + console.info('[Bootstrap] Enterprise plugin loaded') + } catch (error) { + console.warn('[Bootstrap] Enterprise plugin not loaded:', error) + } +} diff --git a/medcat-trainer/webapp/frontend/src/views/ProjectAdmin.vue b/medcat-trainer/webapp/frontend/src/views/ProjectAdmin.vue index ed7028beb..318bbd42a 100644 --- a/medcat-trainer/webapp/frontend/src/views/ProjectAdmin.vue +++ b/medcat-trainer/webapp/frontend/src/views/ProjectAdmin.vue @@ -463,7 +463,10 @@
- + { + const env = loadEnv(mode, process.cwd(), '') + const mctEeRoot = env.MCT_EE_ROOT || path.resolve( + fileURLToPath(new URL('../../../../cogstack-private/medcat-trainer-ee/frontend/src', import.meta.url)) + ) + + return { + plugins: [ + vue(), + ], + resolve: { + alias: { + vue: 'vue/dist/vue.esm-bundler.js', + '@': fileURLToPath(new URL('./src', import.meta.url)), + ...(env.VITE_MCT_EE === '1' + ? { '@mctee/enterprise': path.join(mctEeRoot, 'index.ts') } + : {}), + } + }, + build: { + sourcemap: true, + assetsDir: 'static', + chunkSizeWarningLimit: 1000, + rollupOptions: { + output: { + manualChunks: { + 'vue-vendor': ['vue', 'vue-router'], + 'vuetify-vendor': ['vuetify'], + 'plotly-vendor': ['plotly.js-dist'] + } } } - } - }, - server: { - host: '127.0.0.1', - proxy: { - '^/api/concepts/*': { - target: 'http://127.0.0.1:8983/solr', - changeOrigin: true, - secure: false, - rewrite: (path: string) => path.replace(/\/api\/concepts/, '/') - }, - '^/api/*': { - target: 'http://127.0.0.1:8001' + }, + server: { + host: '127.0.0.1', + proxy: { + '^/api/concepts/*': { + target: 'http://127.0.0.1:8983/solr', + changeOrigin: true, + secure: false, + rewrite: (path: string) => path.replace(/\/api\/concepts/, '/') + }, + '^/api/*': { + target: 'http://127.0.0.1:8001' + } } - } - }, - css: { - preprocessorOptions: { - scss: { - // Bootstrap 5.x still uses deprecated Sass color/import builtins; harmless until v6. - // https://getbootstrap.com/docs/5.3/customize/sass/#sass-deprecation-warnings - silenceDeprecations: [ - 'color-functions', - 'global-builtin', - 'import', - 'if-function' - ], - additionalData: ` + }, + css: { + preprocessorOptions: { + scss: { + // Bootstrap 5.x still uses deprecated Sass color/import builtins; harmless until v6. + // https://getbootstrap.com/docs/5.3/customize/sass/#sass-deprecation-warnings + silenceDeprecations: [ + 'color-functions', + 'global-builtin', + 'import', + 'if-function' + ], + additionalData: ` @import "@/styles/_variables.scss"; @import "@/styles/_common.scss"; @import "@/styles/_tabs.scss"; ` + } } } }