From 6752c54ed4bcc053cde83b64d509eee266b92356 Mon Sep 17 00:00:00 2001 From: Henry Jonas Date: Tue, 28 Jul 2026 17:08:58 -0400 Subject: [PATCH 01/18] FOUR-32412: VITE /process-browser and /cases migrations --- .../components/Breadcrumbs.vue | 1 - .../components/CardProcess.vue | 4 +- .../components/menuCatologue.vue | 3 +- .../loaderProcessesCatalogue.js | 24 +++ .../{index.js => processesCatalogue.js} | 22 ++- resources/js/vite/AGENTS.md | 168 +++++++++++------- .../cases/casesMain/{main.js => casesMain.js} | 2 + .../jscomposition/cases/casesMain/loader.js | 3 - .../cases/casesMain/loaderCasesMain.js | 12 ++ .../cases/casesMain/variables/index.js | 2 +- resources/views/cases/casesMain.blade.php | 26 ++- .../views/processes-catalogue/index.blade.php | 26 +-- vite.config.js | 4 + webpack.mix.js | 4 - 14 files changed, 189 insertions(+), 112 deletions(-) create mode 100644 resources/js/processes-catalogue/loaderProcessesCatalogue.js rename resources/js/processes-catalogue/{index.js => processesCatalogue.js} (65%) rename resources/jscomposition/cases/casesMain/{main.js => casesMain.js} (92%) delete mode 100644 resources/jscomposition/cases/casesMain/loader.js create mode 100644 resources/jscomposition/cases/casesMain/loaderCasesMain.js diff --git a/resources/js/processes-catalogue/components/Breadcrumbs.vue b/resources/js/processes-catalogue/components/Breadcrumbs.vue index 6b403d017d..08cc5c4091 100644 --- a/resources/js/processes-catalogue/components/Breadcrumbs.vue +++ b/resources/js/processes-catalogue/components/Breadcrumbs.vue @@ -61,7 +61,6 @@ export default { @endsection - diff --git a/vite.config.js b/vite.config.js index 7273424ce8..97ef39296c 100644 --- a/vite.config.js +++ b/vite.config.js @@ -102,6 +102,8 @@ export default defineConfig(({ mode }) => { 'resources/js/admin/settings/loaderSettings.js', 'resources/js/admin/settings/index.js', 'resources/js/admin/settings/ldaplogs.js', + 'resources/js/admin/cssOverride/loaderCssOverride.js', + 'resources/js/admin/cssOverride/edit.js', 'resources/js/processes-catalogue/loaderProcessesCatalogue.js', diff --git a/webpack.mix.js b/webpack.mix.js index 064f36555f..ec45d52aa7 100644 --- a/webpack.mix.js +++ b/webpack.mix.js @@ -102,7 +102,6 @@ mix .js("resources/js/admin/auth/passwords/change.js", "public/js/admin/auth/passwords/change.js") // .js("resources/js/admin/queues/index.js", "public/js/admin/queues") .js("resources/js/admin/profile/edit.js", "public/js/admin/profile/edit.js") - .js("resources/js/admin/cssOverride/edit.js", "public/js/admin/cssOverride/edit.js") .js("resources/js/admin/script-executors/index.js", "public/js/admin/script-executors/index.js") .js("resources/js/admin/tenant-queues/index.js", "public/js/admin/tenant-queues/index.js") .js("resources/js/admin/logs/index.js", "public/js/admin/logs/index.js") From 0a66d0f9fb798e6411adb7fca711ef956ae3ae08 Mon Sep 17 00:00:00 2001 From: Henry Jonas Date: Tue, 4 Aug 2026 11:39:09 -0400 Subject: [PATCH 12/18] FOUR-32412: Vite /admin/script-executors --- resources/js/admin/loaderAdmin.js | 6 ++++++ resources/views/admin/script-executors/index.blade.php | 5 +++-- vite.config.js | 3 ++- webpack.mix.js | 1 - 4 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 resources/js/admin/loaderAdmin.js diff --git a/resources/js/admin/loaderAdmin.js b/resources/js/admin/loaderAdmin.js new file mode 100644 index 0000000000..f5a9c76e69 --- /dev/null +++ b/resources/js/admin/loaderAdmin.js @@ -0,0 +1,6 @@ +import { setupMain } from "../next/setupMain"; + +setupMain(); + +window.ProcessMaker.packages = window.temporal?.packages || []; +window.packages = window.ProcessMaker.packages; diff --git a/resources/views/admin/script-executors/index.blade.php b/resources/views/admin/script-executors/index.blade.php index cb3146fabe..82f774fa9f 100644 --- a/resources/views/admin/script-executors/index.blade.php +++ b/resources/views/admin/script-executors/index.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.layout') +@extends('layouts.layoutnextvite') @section('title') {{ __('Script Executors') }} @@ -15,6 +15,7 @@ ]]) @endsection @section('content') + @vite(['resources/js/admin/loaderAdmin.js'])
+ @vite(['resources/js/admin/script-executors/index.js']) @endsection diff --git a/vite.config.js b/vite.config.js index 97ef39296c..76b4bec6d0 100644 --- a/vite.config.js +++ b/vite.config.js @@ -91,6 +91,7 @@ export default defineConfig(({ mode }) => { 'resources/js/templates/index.js', 'resources/js/processes/categories/index.js', 'resources/js/processes/archived.js', + 'resources/js/admin/loaderAdmin.js', 'resources/js/admin/users/loaderUsers.js', 'resources/js/admin/users/index.js', 'resources/js/admin/users/edit.js', @@ -104,7 +105,7 @@ export default defineConfig(({ mode }) => { 'resources/js/admin/settings/ldaplogs.js', 'resources/js/admin/cssOverride/loaderCssOverride.js', 'resources/js/admin/cssOverride/edit.js', - + 'resources/js/admin/script-executors/index.js', 'resources/js/processes-catalogue/loaderProcessesCatalogue.js', 'resources/js/processes-catalogue/processesCatalogue.js', diff --git a/webpack.mix.js b/webpack.mix.js index ec45d52aa7..4e14cc72f3 100644 --- a/webpack.mix.js +++ b/webpack.mix.js @@ -102,7 +102,6 @@ mix .js("resources/js/admin/auth/passwords/change.js", "public/js/admin/auth/passwords/change.js") // .js("resources/js/admin/queues/index.js", "public/js/admin/queues") .js("resources/js/admin/profile/edit.js", "public/js/admin/profile/edit.js") - .js("resources/js/admin/script-executors/index.js", "public/js/admin/script-executors/index.js") .js("resources/js/admin/tenant-queues/index.js", "public/js/admin/tenant-queues/index.js") .js("resources/js/admin/logs/index.js", "public/js/admin/logs/index.js") .js("resources/js/admin/cases-retention/index.js", "public/js/admin/cases-retention/index.js") From b2c1a882edb48d2f5d08066700af7a7808c4a961 Mon Sep 17 00:00:00 2001 From: Henry Jonas Date: Tue, 4 Aug 2026 13:55:33 -0400 Subject: [PATCH 13/18] FOUR-32412: Vite /admin/tenant-queues --- resources/js/vite/AGENTS.md | 90 ++++++++++++++++--- .../views/admin/tenant-queues/index.blade.php | 5 +- vite.config.js | 1 + webpack.mix.js | 1 - 4 files changed, 82 insertions(+), 15 deletions(-) diff --git a/resources/js/vite/AGENTS.md b/resources/js/vite/AGENTS.md index d09a01541d..4f0df594b9 100644 --- a/resources/js/vite/AGENTS.md +++ b/resources/js/vite/AGENTS.md @@ -20,11 +20,13 @@ Vite runs **alongside** Laravel Mix. Do not replace Mix globally. Migrate routes | Layout | CSS / JS | Use when | |--------|----------|----------| | `layouts.layout` / `layouts.layoutnext` | Mix CSS/JS chrome | Legacy Mix pages (e.g. catalogue mobile) | -| `layouts.layoutnextvite` | `@vite` of `app.scss`, `sidebar`, `collapseDetails`, `tailwind.css` | Authenticated Vite pages (Tasks, Processes Designer, Processes Catalogue desktop, Cases) | +| `layouts.layoutnextvite` | `@vite` of `app.scss`, `sidebar`, `collapseDetails`, `tailwind.css` | Authenticated Vite pages (Tasks, Processes Designer, Processes Catalogue desktop, Cases, Admin…) | | Standalone / `auth.layouts.auth` | Page-level `@vite` | Login and password-reset style pages | File: `resources/views/layouts/layoutnextvite.blade.php` (must be `.blade.php`). +**Script order in `layoutnextvite`:** `@yield('js')` runs **before** package addon scripts (`$addons` / `GlobalScripts`). Package code that mutates `window.ProcessMaker.*` after yield may not be ready in a page module’s first tick. Prefer `window.addEventListener('load', …)` when merging package tabs/addons (see Customize UI). Classic `layout` loads addons **before** `@yield('js')`. + ## How routes switch to Vite (current pattern) There is **no** `VITE_VIEW` env map. Migration is done **in place** on the existing Blade: @@ -36,12 +38,14 @@ There is **no** `VITE_VIEW` env map. Migration is done **in place** on the exist Entries may live under: -- `resources/js/vite//` (Tasks, auth, Processes Designer) -- Feature folder next to the UI (e.g. `resources/js/processes-catalogue/`) +- `resources/js/vite//` (Tasks, auth) +- Feature folder next to the UI (e.g. `resources/js/admin/`, `resources/js/processes-catalogue/`) - Composition tree (e.g. `resources/jscomposition/cases/casesMain/`) Prefer co-locating the Vite entry with the feature source when that tree already owns the page. +Shared admin chrome: `resources/js/admin/loaderAdmin.js` (`setupMain` + packages) is used by Script Executors and Tenant Queues. + ## Folder layout ``` @@ -55,15 +59,15 @@ resources/views/cases/casesMain.blade.php ← Vite resources/views/cases/edit.blade.php ← Vite (case detail) resources/views/auth/newLogin.blade.php ← Vite resources/views/auth/layouts/auth.blade.php ← Vite scripts (reset/email) +resources/views/admin/script-executors/index.blade.php ← Vite +resources/views/admin/tenant-queues/index.blade.php ← Vite +resources/views/admin/queues/index.blade.php ← Vite layout (Horizon iframe; no page app) +resources/views/admin/settings/ldap-logs.blade.php ← Vite resources/js/vite/tasks/ ← Tasks entries -resources/js/vite/processes/ ← Processes Designer entries resources/js/vite/auth/login.js ← Login / auth layout entry +resources/js/admin/loaderAdmin.js ← shared admin setupMain loader resources/js/processes-catalogue/loaderProcessesCatalogue.js -resources/js/processes-catalogue/processesCatalogue.js resources/jscomposition/cases/casesMain/loaderCasesMain.js -resources/jscomposition/cases/casesMain/casesMain.js -resources/jscomposition/cases/casesDetail/loaderCasesDetail.js -resources/jscomposition/cases/casesDetail/casesDetail.js resources/js/translations/index.js ← shared i18n Vite entry resources/sass/*.scss|css ← also compiled by Vite for layoutnextvite vite.config.js @@ -79,6 +83,12 @@ vite.config.js | Admin Users | **Vite** | `admin.users.index` + `edit` + `layoutnextvite` | `admin/users/loaderUsers.js` → `index.js` / `edit.js` + inline Vue boot | | Admin Groups | **Vite** | `admin.groups.index` + `edit` + `layoutnextvite` | `admin/groups/loaderGroups.js` → `index.js` / `edit.js` + inline Vue boot | | Admin Auth Clients | **Vite** | `auth-clients.index` + `layoutnextvite` | `admin/auth-clients/loaderAuthClients.js` → `index.js` | +| Admin Settings | **Vite** | `settings.index` + `layoutnextvite` | `admin/settings/loaderSettings.js` → `index.js` (+ optional package email-listener Mix) | +| Admin LDAP Logs | **Vite** | `admin.settings.ldap-logs` + `layoutnextvite` | `admin/users/loaderUsers.js` → `admin/settings/ldaplogs.js` | +| Admin Customize UI | **Vite** | `customize-ui.edit` + `layoutnextvite` | `admin/cssOverride/loaderCssOverride.js` → `edit.js` (Tinymce) + inline Vue on `load` | +| Admin Script Executors | **Vite** | `script-executors.index` + `layoutnextvite` | `admin/loaderAdmin.js` → `admin/script-executors/index.js` | +| Admin Tenant Queues | **Vite** | `tenant-queue.index` + `layoutnextvite` | `admin/loaderAdmin.js` → `admin/tenant-queues/index.js` (Vue Router) | +| Admin Queues (Horizon) | **Vite layout** | `admin.queues.index` + `layoutnextvite` | `admin/users/loaderUsers.js` only; page is an iframe to `/admin/horizon` | | Processes Catalogue (desktop) | **Vite** | `process.browser.index` (`/process-browser`) + `layoutnextvite` | `processes-catalogue/loaderProcessesCatalogue.js` → ScreenBuilder scripts → `processesCatalogue.js` | | Cases | **Vite** | `cases.casesMain` (`/cases`) + `layoutnextvite` | `jscomposition/.../loaderCasesMain.js` → GlobalScripts / ScreenBuilder → `casesMain.js` | | Case Detail | **Vite** | `cases.edit` + `layoutnextvite` | `jscomposition/.../loaderCasesDetail.js` → `initialLoad` (Vite) + GlobalScripts / modeler scripts → `casesDetail.js` | @@ -99,6 +109,7 @@ resources/js/processes/edit.js resources/js/templates/index.js resources/js/processes/categories/index.js resources/js/processes/archived.js +resources/js/admin/loaderAdmin.js resources/js/admin/users/loaderUsers.js resources/js/admin/users/index.js resources/js/admin/users/edit.js @@ -107,6 +118,13 @@ resources/js/admin/groups/index.js resources/js/admin/groups/edit.js resources/js/admin/auth-clients/loaderAuthClients.js resources/js/admin/auth-clients/index.js +resources/js/admin/settings/loaderSettings.js +resources/js/admin/settings/index.js +resources/js/admin/settings/ldaplogs.js +resources/js/admin/cssOverride/loaderCssOverride.js +resources/js/admin/cssOverride/edit.js +resources/js/admin/script-executors/index.js +resources/js/admin/tenant-queues/index.js resources/js/processes-catalogue/loaderProcessesCatalogue.js resources/js/processes-catalogue/processesCatalogue.js resources/jscomposition/cases/casesMain/loaderCasesMain.js @@ -155,7 +173,7 @@ Dev tips: - **Script order:** 1. Inline boot (`window.temporal = {...}`; set `window.packages` if `setupMain` needs it) 2. `@vite` loader (`setupMain` + ScreenBuilder as needed) - 3. Package scripts (`defer`) + 3. Package scripts (`defer` — after yield in `layoutnextvite`) 4. `@vite` page app (often via `@section('js')` / `@append` from a child Blade) 2. **Blade ↔ Vue bindings (common failure mode)** @@ -166,6 +184,7 @@ Dev tips: - Good: `:is-ab-testing-installed="@json(...)"` → Vue gets `true`/`false` - Bad: `is-ab-testing-installed="{{ ... }}"` → PHP `true` becomes string `"1"` → Vue prop type warning - Do **not** use `@{{ __('...') }}` for server translations (`@{{` is for Vue interpolations in the template). + - Root Vue on a Blade `el` (e.g. `#editCss`): directives in that Blade (`v-if="showTabs"`) bind to the Vue instance mounted on that `el`. Blade does not “pass” the variable; Vue owns the DOM after mount. 3. **JS entry** - Vue 2 Options API; `import Vue from 'vue'` / `import VueRouter from 'vue-router'` in ESM. @@ -176,9 +195,10 @@ Dev tips: - Avoid circular ESM: do not import feature `EventBus` from a Mix page entry that also imports the feature graph. - Multi-tab pages (e.g. Designer Processes): one Vite page entry may mount **all** tab roots (`#processIndex`, `#templatesIndex`, `#categories-listing`, `#archivedProcess`) instead of one Mix file per tab. - Register globals the child Blades expect (`Required`, listing components) in that same entry when Mix chrome no longer does it. + - Do **not** double-mount the same `el` from two entries (first mount strips Vue directives; second remount leaves dead UI). 4. **Mix cleanup** - - Remove the migrated Mix input from `webpack.mix.js` when no Blade still calls `mix('js/...')` for it (e.g. drop `resources/js/processes/index.js`). + - Remove the migrated Mix input from `webpack.mix.js` when no Blade still calls `mix('js/...')` for it. - Leave Mix entries that other routes / shared child Blades still load (screens, scripts, categories on non-Vite pages, etc.). 5. **Controller** @@ -197,6 +217,7 @@ Dev tips: - Point Vite `hotFile` at `public/hot`. - Include `auth.partials.auth-language-scripts` on Vite auth pages (still references dead Mix `builds/login/js/...` → `MixFileNotFoundException`). - Leave debug `console.log` in boot Blades (e.g. `cases/edit` `temporal` dumps). + - Put `resources/js/**/*.{js,vue}` in Laravel Vite `refresh` if you want component HMR (that forces full page reload). ## Known Vite config notes (`vite.config.js`) @@ -204,9 +225,11 @@ Dev tips: - **Styles alias**: `styles` / `~styles` → `resources/sass`; Sass importer mirrors Webpack `~styles/...`. - **Tailwind**: entry `resources/sass/tailwind.css` + root `postcss.config.js`. - **Fonts**: Sass `$FontPathOpenSans` / `$fa-font-path` are root-relative (`/css/precompiled/...`). During `vite:dev`, `server.proxy['/css']` forwards to `APP_URL` (avoids CORS). -- **Vue2 plugin**: `includeAbsolute: false` so `/img/...` stays Laravel public URLs. -- **`refresh`**: `resources/views/vite/**` (optional), `resources/js/**/*.{js,vue}`, `resources/sass/**`. +- **Vue2 plugin**: `includeAbsolute: false` so `/img/...` stays Laravel public URLs. Enables **component HMR** for `.vue` SFCs. +- **`refresh`**: `resources/views/**`, `resources/sass/**` → **full page reload** when those change. Do not list page JS/Vue here if you want HMR. +- **`server.hmr`**: WebSocket host/protocol only; does not choose full vs component reload. - **YAML plugin**: `@rollup/plugin-yaml`. +- **Modeler**: `modelerPublicPathPlugin` rewrites `@processmaker/modeler` Webpack-style `img/` URLs to `/js/img/`; `optimizeDeps.exclude: ['@processmaker/modeler']` so that transform runs. ## Quick reference @@ -249,6 +272,48 @@ Dev tips: - Entries: `loaderAuthClients.js` → `index.js` (registers `AuthClientsListing` + mounts `#authClients`) - Mix: no longer builds `admin/auth-clients/index.js` +**Admin Settings** — `/admin/settings` + +- View: `resources/views/admin/settings/index.blade.php` → `layoutnextvite` +- Boot: `window.temporal.packages` / `window.packages` before loader +- Entries: `loaderSettings.js` → optional Mix `email-listener.js` (package-email-start-event) → `index.js` (mounts `#settings` / `SettingsMain`) +- Plugin addon HTML still rendered in content; addon scripts via `layoutnextvite` +- Mix: no longer builds `admin/settings/index.js` + +**Admin LDAP Logs** — settings LDAP logs + +- View: `resources/views/admin/settings/ldap-logs.blade.php` → `layoutnextvite` +- Entries: `admin/users/loaderUsers.js` → `admin/settings/ldaplogs.js` +- Mix: no longer builds `admin/settings/ldaplogs.js` + +**Admin Customize UI** — `/admin/customize-ui/{tab?}` + +- View: `resources/views/admin/cssOverride/edit.blade.php` → `layoutnextvite` +- Boot: packages + `window.config` / `loginFooterSetting` / `altTextSetting` before loader (ESM-safe for `SiteDesign.vue`) +- Entries: `loaderCssOverride.js` → `edit.js` (registers Tinymce + `SiteDesign` / `ColorPicker`) + **inline Vue on `load`** (`#editCss`, `showTabs` / package `cssOverrideTabs`) +- TinyMCE under Vite: import core + theme + `icons/default` + plugins; with `skin: false` also import `tinymce/skins/ui/oxide/skin.min.css`. Content iframe CSS: inject oxide/default content CSS via `content_style` (`?raw`) plus `content_css: '/css/app.css'` — parent-page CSS imports do not apply inside the editor iframe. +- Package tabs: `showTabs` is `tabs.length > 1`. `cssOverrideTabs` may arrive after page modules because addon scripts load after `@yield('js')`; merge on `window` `load` when needed. +- Mix: no longer builds `admin/cssOverride/edit.js` + +**Admin Script Executors** — `/admin/script-executors` + +- View: `resources/views/admin/script-executors/index.blade.php` → `layoutnextvite` +- Entries: `admin/loaderAdmin.js` (in content) → `admin/script-executors/index.js` (mounts `#script-executors`) +- Mix: no longer builds this page entry + +**Admin Tenant Queues** — `/admin/tenant-queues` + +- View: `resources/views/admin/tenant-queues/index.blade.php` → `layoutnextvite` +- Entries: `admin/loaderAdmin.js` → `admin/tenant-queues/index.js` (Vue Router + `#tenant-queues-dashboard`) +- Access: not a `can:*` ability — `TenantQueueController::checkPermissions()` requires `is_administrator`, `config('app.multitenancy')`, and `!config('queue.disable_tenant_tracking')` +- Mix: no longer builds this page entry + +**Admin Queues (Horizon)** — queue management iframe + +- View: `resources/views/admin/queues/index.blade.php` → `layoutnextvite` +- Only loads `admin/users/loaderUsers.js` for chrome; body is `