Skip to content

ui/script registered with type=files is never loaded on the Files page #1193

Open

Description

@max-win-at

What happens

POST /api/v1/ui/script accepts type=files and stores the entry (oc_ex_ui_scripts gets the row), but the script is never loaded on the Files page.

ScriptsService::applyExAppScripts() — the only thing that turns a registered script into a <script> tag — has exactly one caller:

lib/Controller/TopMenuController.php:72
    $this->jsProxyMap = $this->scriptsService->applyExAppScripts($appId, 'top_menu', $menuEntry->getName());

So only ExApp top-menu pages get their scripts injected. LoadFilesPluginListener (the Files-page listener) only publishes ex_files_actions_menu and loads AppAPI's own app_api-filesplugin.js; it never calls applyExAppScripts.

Why it matters

An ExApp that registers a Files action via ui/files-actions-menu has no supported way to show progress or a result for it. The action is executed by AppAPI's plugin, which returns true/false and (optionally) honours redirect_handler, so a long-running action can only report success/failure — no progress, no link to its output. The natural approach (ui/script with type=files) silently does nothing.

Concretely: an OCR ExApp enqueues a job and returns 202. The user sees nothing until they refresh the folder, and there is no way to tell a queued job from a failed one.

Reproduction

  1. ExApp registers a script: POST /api/v1/ui/script {"type": "files", "name": "files_action", "path": "js/foo"}
  2. oc_ex_ui_scripts contains appid | files | files_action | js/foo
  3. Load /apps/files/ → no <script> for proxy_js/* and no request to /apps/app_api/proxy/<appid>/js/foo.js

The same registration with type: top_menu works, because TopMenuController applies it.

Expected

ui/script (and ui/style) registered for type=files should be injected into the Files page, the same way top_menu entries are injected into their pages — e.g. a LoadAdditionalScriptsEvent listener that calls applyExAppScripts($appId, 'files', '').

Environment

  • Nextcloud 34.0.5.1
  • app_api 34.0.0 (checked against main — lib/Listener/ is unchanged there)
  • Deploy daemon: HaRP on a rootless podman socket (the script itself is served fine through the proxy: GET /index.php/apps/app_api/proxy/<appid>/js/files_action.js → 200 text/javascript; it is simply never referenced)

Activity

  1. oleksandr-nc commented on Nov 13, 2026

    @oleksandr-nc
    Contributor

    Hi @max-win-at , thank you for the detailed report and the clear use case!

    This isn’t a bug: so far ui/script, ui/style and ui/initial-state are only implemented for type=top_menu, which is also the only type the documentation describes. We will try to see how properly this feature request can be implemented

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions