Skip to main content

Fix to the issue that when launchers configured in the jupyter config file with svg icons are in a different category than notebooks, icons are not displayed

Project description

jupyterlab_server_proxy_launcher_fix

GitHub Actions npm version PyPI version Total PyPI downloads JupyterLab 4 Brought To You By KOLOMOLO Donate PayPal

JupyterLab extension that fixes SVG icon display for jupyter-server-proxy launchers when placed in custom categories other than "Notebook" or "Console".

[!WARNING] This extension is a temporary fix for jupyterhub/jupyter-server-proxy. Once the upstream project implements proper icon support for custom launcher categories, this extension will be deprecated. We look forward to our own obsolescence.

The Problem

When configuring jupyter-server-proxy launchers with custom categories (e.g., "Services", "Tools"), SVG icons fail to display. This happens because JupyterLab's launcher widget handles icons differently based on category:

  • Notebook/Console categories: Uses kernelIconUrl property - works correctly
  • Other categories: Calls commands.icon(command, args) to get the icon - server-proxy's server-proxy:open command doesn't define an icon property, so icons are missing

The Fix

This extension wraps JupyterLab's commands.icon() method to intercept calls for the server-proxy:open command and return pre-cached LabIcon instances.

How it works:

  • Fetches server-proxy configuration from /server-proxy/servers-info endpoint
  • Pre-fetches SVG icons and creates LabIcon instances for non-kernel categories
  • Wraps app.commands.icon() to return cached icons when command is server-proxy:open
  • Matches icons by args.title (handles both plain titles and titles with [↗] suffix for new_browser_tab: true)

Implementation details:

  • No command override: Preserves server-proxy's original execute function completely
  • No timing issues: Wrapper intercepts all calls regardless of extension load order
  • No private API access: Uses public method wrapping instead of accessing internal _commands Map
  • Non-destructive: Original behavior preserved for all other commands

Fix Implementation Details

The extension consists of frontend TypeScript code that wraps the commands registry icon method.

Frontend Implementation (src/index.ts):

  • Icon Caching: Fetches server info, creates LabIcon from icon_url for each non-kernel category launcher, caches by title
  • Title Matching: Caches icons under both plain title and ${title} [↗] suffix (server-proxy appends this when new_browser_tab: true)
  • Method Wrapping: const originalIcon = app.commands.icon.bind(app.commands) preserves original, then (app.commands as any).icon = ... installs wrapper
  • Conditional Return: If id === 'server-proxy:open' and args.title matches cache key, returns cached LabIcon; otherwise delegates to original

Icon Utilities (src/iconUtils.ts):

  • SVG Fetching: fetchSvgIcon(url, name) fetches SVG content and creates LabIcon instance
  • Fallback Icons: createTextIcon(name, title) generates simple SVG with first letter when icon_url unavailable

Requirements

Install

To install the extension, execute:

pip install jupyterlab_server_proxy_launcher_fix

Uninstall

To remove the extension, execute:

pip uninstall jupyterlab_server_proxy_launcher_fix

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jupyterlab_server_proxy_launcher_fix-1.0.4.tar.gz (279.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

File details

Details for the file jupyterlab_server_proxy_launcher_fix-1.0.4.tar.gz.

File metadata

File hashes

Hashes for jupyterlab_server_proxy_launcher_fix-1.0.4.tar.gz
Algorithm Hash digest
SHA256 fe9d62391827a71a558234d4840da094abd551755db2baaf39e5f1ca9e0dada1
MD5 717c30aca02eeb4b83bd864cd005dfed
BLAKE2b-256 ca502bcac27c3b0f4ea2198d359b18cd207e7a922638e318025e551365da6a51

See more details on using hashes here.

File details

Details for the file jupyterlab_server_proxy_launcher_fix-1.0.4-py3-none-any.whl.

File metadata

File hashes

Hashes for jupyterlab_server_proxy_launcher_fix-1.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 2ceb5a6a396df227fdc8e718c67bbd0948c8b5221f9ba232acffa71977f744a8
MD5 65db8ab615a5e8b5c90fe57e3077b644
BLAKE2b-256 1a17ffa0b9de6a639db8ee85b154c75df0930cde6884bab7c910eb50050875ea

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page