UNPKG

@jupyterlab/apputils

Version:
643 lines (573 loc) 18.1 kB
// Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import type { IChangedArgs } from '@jupyterlab/coreutils'; import type { IRenderMime } from '@jupyterlab/rendermime-interfaces'; import type { ISettingRegistry } from '@jupyterlab/settingregistry'; import { Token } from '@lumino/coreutils'; import type { IDisposable } from '@lumino/disposable'; import type { ISignal } from '@lumino/signaling'; import type { AccordionPanel, CommandPalette, Widget } from '@lumino/widgets'; import type { ISessionContext } from './sessioncontext'; import type { Licenses } from './licenses'; /** * The command palette token. */ export const ICommandPalette = new Token<ICommandPalette>( '@jupyterlab/apputils:ICommandPalette', `A service for the application command palette in the left panel. Use this to add commands to the palette.` ); /** * The options for creating a command palette item. */ export interface IPaletteItem extends CommandPalette.IItemOptions {} /** * The interface for a Jupyter Lab command palette. */ export interface ICommandPalette { /** * The placeholder text of the command palette's search input. */ placeholder: string; /** * Activate the command palette for user input. */ activate(): void; /** * Add a command item to the command palette. * * @param options - The options for creating the command item. * * @returns A disposable that will remove the item from the palette. */ addItem(options: IPaletteItem): IDisposable; } /** * The kernel status indicator model. */ export const IKernelStatusModel = new Token<IKernelStatusModel>( '@jupyterlab/apputils:IKernelStatusModel', 'A service to register kernel session provider to the kernel status indicator.' ); /** * Kernel status indicator model. */ export interface IKernelStatusModel { /** * Add a session context provider. * * A provider will receive the currently active widget and must return the * associated session context if it can or null otherwise. */ addSessionProvider: ( provider: (widget: Widget | null) => ISessionContext | null ) => void; } /** * The license client for fetching licenses. */ export const ILicensesClient = new Token<ILicensesClient>( '@jupyterlab/apputils:ILicensesClient', 'A service for fetching licenses.' ); /** * An interface for the license client. */ export interface ILicensesClient { /** * Fetch the license bundles from the server. */ getBundles(): Promise<Licenses.ILicenseResponse>; /** * Download the licenses in the requested format. */ download(options: Licenses.IDownloadOptions): Promise<void>; } /** * An interface for the session context dialogs. */ export interface ISessionContextDialogs extends ISessionContext.IDialogs {} /** * The session context dialogs token. */ export const ISessionContextDialogs = new Token<ISessionContext.IDialogs>( '@jupyterlab/apputils:ISessionContextDialogs', 'A service for handling the session dialogs.' ); /** * The theme manager token. */ export const IThemeManager = new Token<IThemeManager>( '@jupyterlab/apputils:IThemeManager', 'A service for the theme manager for the application. This is used primarily in theme extensions to register new themes.' ); /** * An interface for a theme manager. */ export interface IThemeManager { /** * Get the name of the current theme. */ readonly theme: string | null; /** * Get the name of the preferred light theme. */ readonly preferredLightTheme?: string | undefined; /** * Get the name of the preferred dark theme. */ readonly preferredDarkTheme?: string | undefined; /** * Get the name of the preferred theme. */ readonly preferredTheme?: string | null | undefined; /** * The names of the registered themes. */ readonly themes: ReadonlyArray<string>; /** * Get the names of the registered light themes. */ readonly lightThemes?: ReadonlyArray<string> | undefined; /** * Get the names of the registered dark themes. */ readonly darkThemes?: ReadonlyArray<string> | undefined; /** * A signal fired when the application theme changes. */ readonly themeChanged: ISignal<this, IChangedArgs<string, string | null>>; /** * Load a theme CSS file by path. * * @param path - The path of the file to load. */ loadCSS(path: string): Promise<void>; /** * Register a theme with the theme manager. * * @param theme - The theme to register. * * @returns A disposable that can be used to unregister the theme. */ register(theme: IThemeManager.ITheme): IDisposable; /** * Set the current theme. */ setTheme(name: string): Promise<void>; /** * Test whether a given theme is light. */ isLight(name: string): boolean; /** * Test whether a given theme styles scrollbars, * and if the user has scrollbar styling enabled. */ themeScrollbars(name: string): boolean; /** * Get display name for theme. */ getDisplayName(name: string): string; } /** * A namespace for the `IThemeManager` sub-types. */ export namespace IThemeManager { /** * An interface for a theme. */ export interface ITheme { /** * The unique identifier name of the theme. */ name: string; /** * The display name of the theme. */ displayName?: string; /** * Whether the theme is light or dark. Downstream authors * of extensions can use this information to customize their * UI depending upon the current theme. */ isLight: boolean; /** * Whether the theme includes styling for the scrollbar. * If set to false, this theme will leave the native scrollbar untouched. */ themeScrollbars?: boolean; /** * Load the theme. * * @returns A promise that resolves when the theme has loaded. */ load(): Promise<void>; /** * Unload the theme. * * @returns A promise that resolves when the theme has unloaded. */ unload(): Promise<void>; } } /** * The sanitizer token. */ export const ISanitizer = new Token<IRenderMime.ISanitizer>( '@jupyterlab/apputils:ISanitizer', 'A service for sanitizing HTML strings.' ); /** * @deprecated since v4 use {@link IRenderMime.ISanitizer} */ export type ISanitizer = IRenderMime.ISanitizer; /** * The namespace for `ISanitizer` related interfaces. */ export namespace ISanitizer { /** * The options used to sanitize. * * @deprecated in v4 use {@link IRenderMime.ISanitizerOptions} */ export type IOptions = IRenderMime.ISanitizerOptions; } /** * The main menu token. */ export const ISplashScreen = new Token<ISplashScreen>( '@jupyterlab/apputils:ISplashScreen', `A service for the splash screen for the application. Use this if you want to show the splash screen for your own purposes.` ); /** * The interface for an application splash screen. */ export interface ISplashScreen { /** * Show the application splash screen. * * @param light - Whether to show the light splash screen or the dark one. * * @returns A disposable used to clear the splash screen. */ show(light?: boolean): IDisposable; } /** * The default window resolver token. */ export const IWindowResolver = new Token<IWindowResolver>( '@jupyterlab/apputils:IWindowResolver', `A service for a window resolver for the application. JupyterLab workspaces are given a name, which are determined using the window resolver. Require this if you want to use the name of the current workspace.` ); /** * The description of a window name resolver. */ export interface IWindowResolver { /** * A window name to use as a handle among shared resources. */ readonly name: string; } /** * The namespace for `IToolbarWidgetRegistry` related interfaces */ export namespace ToolbarRegistry { /** * Interface of item to be inserted in a toolbar */ export interface IToolbarItem extends IRenderMime.IToolbarItem {} /** * Interface describing a toolbar item widget */ export interface IWidget extends ISettingRegistry.IToolbarItem {} /** * Options to set up the toolbar widget registry */ export interface IOptions { /** * Default toolbar widget factory * * The factory is receiving 3 arguments: * @param widgetFactory The widget factory name that creates the toolbar * @param widget The newly widget containing the toolbar * @param toolbarItem The toolbar item definition * @returns The widget to be inserted in the toolbar. */ defaultFactory: ( widgetFactory: string, widget: Widget, toolbarItem: IWidget ) => Widget; } } /** * Toolbar widget registry interface */ export interface IToolbarWidgetRegistry { /** * Add a new toolbar item factory * * @param widgetFactory The widget factory name that creates the toolbar * @param toolbarItemName The unique toolbar item * @param factory The factory function that receives the widget containing the toolbar and returns the toolbar widget. * @returns The previously defined factory */ addFactory<T extends Widget = Widget>( widgetFactory: string, toolbarItemName: string, factory: (main: T) => Widget ): ((main: T) => Widget) | undefined; /** * Default toolbar item factory */ defaultFactory: ( widgetFactory: string, widget: Widget, toolbarItem: ToolbarRegistry.IWidget ) => Widget; /** * Create a toolbar item widget * * @param widgetFactory The widget factory name that creates the toolbar * @param widget The newly widget containing the toolbar * @param toolbarItem The toolbar item definition * @returns The widget to be inserted in the toolbar. */ createWidget( widgetFactory: string, widget: Widget, toolbarItem: ToolbarRegistry.IWidget ): Widget; /** * Register a new toolbar item factory * * @param widgetFactory The widget factory name that creates the toolbar * @param toolbarItemName The unique toolbar item * @param factory The factory function that receives the widget containing the toolbar and returns the toolbar widget. * @returns The previously defined factory * * @deprecated since v4 use `addFactory` instead */ registerFactory<T extends Widget = Widget>( widgetFactory: string, toolbarItemName: string, factory: (main: T) => Widget ): ((main: T) => Widget) | undefined; /** * A signal emitted when a factory widget has been added. */ readonly factoryAdded: ISignal<this, string>; } /** * The toolbar registry token. */ export const IToolbarWidgetRegistry = new Token<IToolbarWidgetRegistry>( '@jupyterlab/apputils:IToolbarWidgetRegistry', `A registry for toolbar widgets. Require this if you want to build the toolbar dynamically from a data definition (stored in settings for example).` ); /** * A section entry returned by {@link IMovableSectionSource.getSections}. * * Bundles the three pieces of information the move plugin needs to identify, * display, and transfer a sidebar section. */ export interface ISectionEntry { /** * Stable identifier for this section, equal to the widget's Lumino `id`. * * The move plugin uses this to persist which sections have been moved and * to restore them to the correct panel on reload. */ readonly id: string; /** * The `.jp-AccordionPanel-title` DOM element rendered by Lumino as the * visual header of this section. * * The move plugin attaches the `jp-movable-section` CSS class to this node * so that Lumino's context-menu selector fires when the user right-clicks * the header. */ readonly titleNode: HTMLElement; /** * The content widget for this section. */ readonly widget: Widget; } /** * Implemented by sidebar panels whose accordion sections can be moved to * another panel by the user. * * Register an implementation with * {@link IMovableSectionRegistry.registerSource}. */ export interface IMovableSectionSource { /** * Return the currently-available sections with their title DOM nodes. */ getSections(): ReadonlyArray<ISectionEntry>; /** * Detach the section identified by `sectionId` and return its widget so * the move plugin can hand it to a target panel. * * A typical implementation sets `widget.parent = null`, which detaches the * widget from the `AccordionPanel` without destroying it. Returns `null` if * no section with the given id currently exists in this panel. * * @param sectionId - The {@link ISectionEntry.id} of the section to remove. */ removeSectionById(sectionId: string): Widget | null; /** * Re-attach a widget that was previously removed by * {@link removeSectionById}. * * Called when the user chooses "Move back to …" on a section that was * originally owned by this panel. A typical implementation calls * `this.addWidget(widget)`. * * @param widget - The widget returned by an earlier {@link removeSectionById} * call. */ reinsertSection(widget: Widget): void; /** * The `AccordionPanel` that renders this sidebar's sections. * * The move plugin reads this to set up drag-to-reorder handles after a * section is moved. */ readonly accordionPanel: AccordionPanel | null; /** * Emitted each time a new section widget is added to this panel. * * Implementations should emit this signal from `addWidget` (or equivalent) * with a fully-populated {@link ISectionEntry} for the newly added widget. */ readonly sectionAdded: ISignal<this, ISectionEntry>; } /** * Implemented by panels that can host sections moved in from another sidebar. * * Register an implementation with * {@link IMovableSectionRegistry.registerTarget}. */ export interface IMovableSectionDestination { /** * Insert a section widget into this panel. * * Called by the move plugin when the user selects "Move to …" from the * context menu. A typical implementation calls `this.addWidget(widget)`. * * @param widget - The widget detached from its source panel. */ addSection(widget: Widget): void; /** * Remove a section widget that was previously added via {@link addSection}. * * Called by the move plugin when the user moves the section back to its * original panel. A typical implementation sets `widget.parent = null`. * * @param widget - The widget to detach. */ removeSectionWidget(widget: Widget): void; /** * All section widgets currently hosted by this panel. * * Queried by the move plugin during state restoration to find sections that * were persisted as belonging to this panel. Must stay in sync with * {@link addSection} and {@link removeSectionWidget} calls. */ readonly sections: ReadonlyArray<Widget>; /** * The `AccordionPanel` that wraps the hosted sections, or `null` if none * has been created yet. * * The move plugin reads this to set up drag-to-reorder handles and to access * the title elements of hosted sections. */ readonly accordionPanel: AccordionPanel | null; } /** * Registry that pairs source and target panels so the move plugin can wire up * context-menu "Move to …" actions between them. */ export interface IMovableSectionRegistry { /** * Register a sidebar as a source of moveable sections. * * After registration the move plugin adds a "Move to <target>" context-menu * item to each section header in `sidebar`. The `label` appears in the menu * as "Move back to <label>" on the destination side. * * @param id - Stable plugin-scoped identifier, e.g. * `'@my-org/my-ext:panel'`. Must be unique across all registered sources. * @param label - Human-readable panel name shown in the context menu. * @param sidebar - The panel implementing {@link IMovableSectionSource}. */ registerSource( id: string, label: string, sidebar: IMovableSectionSource ): void; /** * Register a panel as a destination that can receive sections. * * After registration the move plugin adds a "Move to <label>" context-menu * item to eligible section headers in all registered source panels. * * @param id - Stable plugin-scoped identifier. Must be unique across all * registered targets. * @param label - Human-readable panel name shown in the context menu. * @param panel - The panel implementing {@link IMovableSectionDestination}. */ registerTarget( id: string, label: string, panel: IMovableSectionDestination ): void; /** * Return all registered source sidebars keyed by their `id`. */ getSources(): ReadonlyMap< string, { label: string; sidebar: IMovableSectionSource } >; /** * Return all registered target panels keyed by their `id`. */ getTargets(): ReadonlyMap< string, { label: string; panel: IMovableSectionDestination } >; /** * Fired each time a new source sidebar is registered via * {@link registerSource}. * * The move plugin listens to this signal to retroactively wire up context * menus for sources that register after the plugin has already activated. */ readonly sourcePanelRegistered: ISignal< IMovableSectionRegistry, { id: string; label: string; sidebar: IMovableSectionSource } >; /** * Fired each time a new target panel is registered via * {@link registerTarget}. * * The move plugin listens to this signal to add the new target as an option * in the context menus of all currently-registered source panels. */ readonly targetPanelRegistered: ISignal< IMovableSectionRegistry, { id: string; label: string; panel: IMovableSectionDestination } >; } /** * The movable section registry token. */ export const IMovableSectionRegistry = new Token<IMovableSectionRegistry>( '@jupyterlab/apputils:IMovableSectionRegistry', 'A registry for panels that can exchange moveable sections.' );