Draft: Convert detached, teardown-managed, and factory bootstraps to initVueApp

What does this MR do and why?

Stacked on !247299 (merged) (the boring initVueApp wave) — retarget to master when it merges. Second review round of the wave identified these ten bootstraps as going beyond the mechanical { el, component, props, events } shape; they carry their own explained patterns:

  • Detached mounts (confirm_modal, environments/init_confirm_rollback_modal, admin/users, vue_shared/plugins/global_toast): the Vue 2 detached-$mount() idiom becomes a mount on a created element; global_toast becomes a lazily created root exposing $toast with the GlToast plugin installed per-app.
  • Teardown choreography (captcha/wait_for_captcha_to_be_solved, rapid_diffs/adapters/file_discussions, rapid_diffs/adapters/line_discussions): unmountVueApp pairs the Vue 3 app teardown (which also removes rendered DOM) with the manual removals that cover Vue 2.
  • Options factories (ci/pipeline_details/pipeline_tabs CE + EE): createAppOptions returns the component/props shape and the EE merge overrides props instead of wrapping the render function; the module-scope GlToast install folds into per-app plugins here, deliberately and reviewably.
  • environments_dashboard captures the mount element dataset at init time, replacing the legacy $el.dataset read during first render.

Content is the exact CI-proven state from the pre-split !247299 (merged) (full run-all-rspec + run-rspec-vue3 matrix lineage).

MR acceptance checklist

Merge request reports

Loading
Loading