fvtt-types
Version:
TypeScript type definitions for Foundry VTT
609 lines (512 loc) • 18.9 kB
text/typescript
import type { MaybePromise, Identity, ValueOf } from "#utils";
import type { DragDrop, SearchFilter, Tabs } from "#client/applications/ux/_module.d.mts";
declare global {
const MIN_WINDOW_WIDTH: 200;
const MIN_WINDOW_HEIGHT: 50;
}
declare module "#configuration" {
namespace Hooks {
interface ApplicationConfig {
Application: Application.Any;
}
}
}
/**
* The standard application window that is rendered for a large variety of UI elements in Foundry VTT.
* @template Options - the type of the options object
*/
declare abstract class Application<Options extends Application.Options = Application.Options> {
/**
* @param options - Configuration options which control how the application is rendered.
* Application subclasses may add additional supported options, but the
* following configurations are supported for all Applications. The values
* passed to the constructor are combined with the defaultOptions defined
* at the class level.
*/
constructor(options?: Partial<Options>);
/**
* The options provided to this application upon initialization
*/
options: Options;
/**
* The application ID is a unique incrementing integer which is used to identify every application window
* drawn by the VTT
*/
appId: number;
/**
* An internal reference to the HTML element this application renders
* @defaultValue `null`
*/
protected _element: JQuery | null;
/**
* Track the current position and dimensions of the Application UI
*/
position: Application.Position;
/**
* DragDrop workflow handlers which are active for this Application
*/
protected _dragDrop: DragDrop[];
/**
* Tab navigation handlers which are active for this Application
*/
protected _tabs: Tabs[];
/**
* SearchFilter handlers which are active for this Application
*/
protected _searchFilters: SearchFilter[];
/**
* Track whether the Application is currently minimized
* @defaultValue `false`
*/
protected _minimized: boolean;
/**
* Track the render state of the Application
* @defaultValue {@linkcode Application.RENDER_STATES.NONE}
* @see {@linkcode Application.RENDER_STATES}
*/
protected _state: Application.RenderState;
/**
* The prior render state of this Application.
* This allows for rendering logic to understand if the application is being rendered for the first time.
* @defaultValue {@linkcode Application.RENDER_STATES.NONE}
* @see {@linkcode Application.RENDER_STATES}
*/
protected _priorState: Application.RenderState;
/**
* Track the most recent scroll positions for any vertically scrolling containers
* @defaultValue `null`
*/
protected _scrollPositions: Record<string, number> | null;
/**
* The sequence of rendering states that track the Application life-cycle.
* @see {@linkcode Application.RenderState}
*/
static RENDER_STATES: Readonly<{
CLOSING: -2;
CLOSED: -1;
NONE: 0;
RENDERING: 1;
RENDERED: 2;
ERROR: 3;
}>;
/**
* Create drag-and-drop workflow handlers for this Application
* @returns An array of DragDrop handlers
* @internal
*/
protected _createDragDropHandlers(): DragDrop[];
/**
* Create tabbed navigation handlers for this Application
* @returns An array of Tabs handlers
* @internal
*/
protected _createTabHandlers(): Tabs[];
/**
* Create search filter handlers for this Application
* @returns An array of SearchFilter handlers
* @internal
*/
protected _createSearchFilters(): SearchFilter[];
/**
* Assign the default options configuration which is used by this Application class. The options and values defined
* in this object are merged with any provided option values which are passed to the constructor upon initialization.
* Application subclasses may include additional options which are specific to their usage.
*/
static get defaultOptions(): Application.Options;
/**
* Return the CSS application ID which uniquely references this UI element
*/
get id(): string;
/**
* Return the active application element, if it currently exists in the DOM
*/
get element(): JQuery;
/**
* The path to the HTML template file which should be used to render the inner content of the app
*/
get template(): string;
/**
* Control the rendering style of the application. If popOut is true, the application is rendered in its own
* wrapper window, otherwise only the inner app content is rendered
*/
get popOut(): boolean;
/**
* Return a flag for whether the Application instance is currently rendered
*/
get rendered(): boolean;
/**
* Whether the Application is currently closing.
*/
get closing(): boolean;
/**
* An Application window should define its own title definition logic which may be dynamic depending on its data
*/
get title(): string;
/**
* An application should define the data object used to render its template.
* This function may either return an Object directly, or a Promise which resolves to an Object
* If undefined, the default implementation will return an empty object allowing only for rendering of static HTML
* @param options - (unused, default: `{}`)
*/
getData(options?: Partial<Options>): MaybePromise<object>;
/**
* Render the Application by evaluating it's HTML template against the object of data provided by the getData method
* If the Application is rendered as a pop-out window, wrap the contained HTML in an outer frame with window controls
*
* @param force - Add the rendered application to the DOM if it is not already present. If false, the
* Application will only be re-rendered if it is already present.
* (default: `false`)
* @param options - Additional rendering options which are applied to customize the way that the Application
* is rendered in the DOM.
* (default: `{}`)
* @returns The rendered Application instance
* @remarks Some subclasses return other results.
*/
render(force?: boolean, options?: Application.RenderOptions<Options>): this;
/**
* An asynchronous inner function which handles the rendering of the Application
* @param force - Render and display the application even if it is not currently displayed.
* (default: `false`)
* @param options - Additional options which update the current values of the Application#options object
* (default: `{}`)
* @returns A Promise that resolves to the Application once rendering is complete
*/
protected _render(force?: boolean, options?: Application.RenderOptions<Options>): Promise<void>;
/**
* Return the inheritance chain for this Application class up to (and including) it's base Application class.
* @internal
*/
protected static _getInheritanceChain(): Application.AnyConstructor[];
/**
* Call all hooks for all applications in the inheritance chain.
* @param hookName - The hook being triggered, which formatted with the Application class name
* @param hookArgs - The arguments passed to the hook calls
*/
protected _callHooks(hookName: string | ((className: string) => string), hookArgs?: unknown[]): void;
/**
* Persist the scroll positions of containers within the app before re-rendering the content
* @param html - The HTML object being traversed
*/
protected _saveScrollPositions(html: JQuery): void;
/**
* Restore the scroll positions of containers within the app after re-rendering the content
* @param html - The HTML object being traversed
*/
protected _restoreScrollPositions(html: JQuery): void;
/**
* Render the outer application wrapper
* @returns A promise resolving to the constructed jQuery object
*/
protected _renderOuter(): Promise<JQuery>;
/**
* Render the inner application content
* @param data - The data used to render the inner template
* @returns A promise resolving to the constructed jQuery object
* @remarks Some subclasses do not return a promise but the jQuery object directly.
* @internal
*/
protected _renderInner(data: ReturnType<this["getData"]>): Promise<JQuery>;
/**
* Customize how inner HTML is replaced when the application is refreshed
* @param element - The original HTML processed as a jQuery object
* @param html - New updated HTML as a jQuery object
* @internal
*/
protected _replaceHTML(element: JQuery, html: JQuery): void;
/**
* Customize how a new HTML Application is added and first appears in the DOC
* @param html - The HTML element which is ready to be added to the DOM
* @internal
*/
protected _injectHTML(html: JQuery): void;
/**
* Specify the set of config buttons which should appear in the Application header.
* Buttons should be returned as an Array of objects.
* The header buttons which are added to the application can be modified by the getApplicationHeaderButtons hook.
* @internal
*/
protected _getHeaderButtons(): Application.HeaderButton[];
/**
* Create a {@linkcode ContextMenu} for this Application.
* @param html - The Application's HTML.
* @internal
*/
protected _contextMenu(html: JQuery): void;
/**
* Activate required listeners which must be enabled on every Application.
* These are internal interactions which should not be overridden by downstream subclasses.
*/
protected _activateCoreListeners(html: JQuery): void;
/**
* After rendering, activate event listeners which provide interactivity for the Application.
* This is where user-defined Application subclasses should attach their event-handling logic.
*/
activateListeners(html: JQuery): void;
/**
* Change the currently active tab
* @param tabName - The target tab name to switch to
* @param options - Options which configure changing the tab
* (default: `{}`)
*/
activateTab(
tabName: string,
options?: {
/** A specific named tab group, useful if multiple sets of tabs are present */
group?: string;
/**
* Whether to trigger tab-change callback functions
* (default: `true`)
*/
triggerCallback?: boolean;
},
): void;
/**
* Handle changes to the active tab in a configured Tabs controller
* @param event - A left click event
* @param tabs - The Tabs controller
* @param active - The new active tab name
*/
protected _onChangeTab(event: MouseEvent | null, tabs: Tabs, active: string): void;
/**
* Handle changes to search filtering controllers which are bound to the Application
* @param event - The key-up event from keyboard input
* @param query - The regular expression to test against
* @param rgx - The regular expression to test against
* @param html - The HTML element which should be filtered
*/
protected _onSearchFilter(event: KeyboardEvent, query: string, rgx: RegExp, html: HTMLElement): void;
/**
* Define whether a user is able to begin a dragstart workflow for a given drag selector
* @param selector - The candidate HTML selector for dragging
* @returns Can the current user drag this selector?
*/
protected _canDragStart(selector: string): boolean;
/**
* Define whether a user is able to conclude a drag-and-drop workflow for a given drop selector
* @param selector - The candidate HTML selector for the drop target
* @returns Can the current user drop on this selector?
*/
protected _canDragDrop(selector: string): boolean;
/**
* Callback actions which occur at the beginning of a drag start workflow.
* @param event - The originating DragEvent
*/
protected _onDragStart(event: DragEvent): void;
/**
* Callback actions which occur when a dragged element is over a drop target.
* @param event - originating DragEvent
*/
protected _onDragOver(event: DragEvent): void;
/**
* Callback actions which occur when a dragged element is dropped on a target.
* @param event - The originating DragEvent
*/
protected _onDrop(event: DragEvent): void;
/**
* Bring the application to the top of the rendering stack
*/
bringToTop(): void;
/**
* Close the application and un-register references to it within UI mappings
* This function returns a Promise which resolves once the window closing animation concludes
* @param options - Options which affect how the Application is closed
* (default: `{}`)
* @returns A Promise which resolves once the application is closed
*/
close(options?: Application.CloseOptions): Promise<void>;
/**
* Minimize the pop-out window, collapsing it to a small tab
* Take no action for applications which are not of the pop-out variety or apps which are already minimized
* @returns A Promise which resolves once the minimization action has completed
*/
minimize(): Promise<void>;
/**
* Maximize the pop-out window, expanding it to its original size
* Take no action for applications which are not of the pop-out variety or are already maximized
* @returns A Promise which resolves once the maximization action has completed
*/
maximize(): Promise<void>;
/**
* Set the application position and store it's new location.
* Returns the updated position object for the application containing the new values.
* @param position - Positional data
*/
setPosition(
position?: Partial<Omit<Application.Position, "zIndex">>,
): (Application.Position & { height: number }) | void;
/**
* Handle application minimization behavior - collapsing content and reducing the size of the header
*/
protected _onToggleMinimize(ev: Event): void;
/**
* Additional actions to take when the application window is resized
*/
protected _onResize(event: Event): void;
/**
* Wait for any images present in the Application to load.
* @returns A Promise that resolves when all images have loaded.
*/
_waitForImages(): Promise<void>;
}
declare namespace Application {
interface Any extends AnyApplication {}
interface AnyConstructor extends Identity<typeof AnyApplication> {}
interface Options {
/**
* A named "base application" which generates an additional hook
* @defaultValue `null`
*/
baseApplication: string | null;
/**
* The default pixel width for the rendered HTML
* @defaultValue `null`
*/
width: number | null;
/**
* The default pixel height for the rendered HTML
* @defaultValue `null`
*/
height: number | "auto" | null;
/**
* The default offset-top position for the rendered HTML
* @defaultValue `null`
*/
top: number | null;
/**
* The default offset-left position for the rendered HTML
* @defaultValue `null`
*/
left: number | null;
/**
* A transformation scale for the rendered HTML
* @defaultValue `null`
*/
scale: number | null;
/**
* Whether to display the application as a pop-out container
* @defaultValue `true`
*/
popOut: boolean;
/**
* Whether the rendered application can be minimized (popOut only)
* @defaultValue `true`
*/
minimizable: boolean;
/**
* Whether the rendered application can be drag-resized (popOut only)
* @defaultValue `false`
*/
resizable: boolean;
/**
* The default CSS id to assign to the rendered HTML
* @defaultValue `""`
*/
id: string;
/**
* An array of CSS string classes to apply to the rendered HTML
* @defaultValue `[]`
*/
classes: string[];
/**
* A default window title string (popOut only)
* @defaultValue `""`
*/
title: string;
/**
* The default HTML template path to render for this Application
* @defaultValue `null`
*/
template: string | null;
/**
* A list of unique CSS selectors which target containers that should
* have their vertical scroll positions preserved during a re-render.
* @defaultValue `[]`
*/
scrollY: string[];
/**
* An array of tabbed container configurations which should be enabled
* for the application.
* @defaultValue `[]`
*/
tabs: Omit<Tabs.Configuration, "callback">[];
/**
* @defaultValue `[]`
*/
dragDrop: Omit<DragDrop.Configuration, "permissions" | "callbacks">[];
/**
* @defaultValue `[]`
*/
filters: Omit<SearchFilter.Configuration, "callback">[];
}
interface CloseOptions {
force?: boolean | undefined;
}
interface HeaderButton {
label: string;
class: string;
icon: string;
onclick: ((ev: JQuery.ClickEvent) => void) | null;
}
interface Position {
/** The left offset position in pixels */
left: number | null;
/** The top offset position in pixels */
top: number | null;
/** The application width in pixels */
width: number | null;
/** The application height in pixels */
height: number | null | "auto";
/** The application scale as a numeric factor where 1.0 is default */
scale: number | null;
/** @defaultValue `0` */
zIndex: number;
}
// TODO(LukeAbby): This should accept already partial options but all callers have to be changed.
// `_RenderOptions` should probably become the default and applications will extend that plus their optional options.
type RenderOptions<Options extends Application.Options = Application.Options> = Partial<Options> & _RenderOptions;
/** @internal */
interface _RenderOptions {
/**
* The left positioning attribute
*/
left?: number | null | undefined;
/**
* The top positioning attribute
*/
top?: number | null | undefined;
/**
* The rendered width
*/
width?: number | null | undefined;
/**
* The rendered height
*/
height?: number | "auto" | null | undefined;
/**
* The rendered transformation scale
*/
scale?: number | null | undefined;
/**
* Apply focus to the application, maximizing it and bringing it to the top
* of the vertical stack.
* @defaultValue `false`
*/
focus?: boolean | undefined;
/**
* A context-providing string which suggests what event triggered the render
*/
renderContext?: string | undefined;
/**
* The data change which motivated the render request
*/
renderData?: object | undefined;
}
/**
* @see {@linkcode Application.RENDER_STATES}
*/
type RenderState = ValueOf<typeof Application.RENDER_STATES>;
}
declare abstract class AnyApplication extends Application<Application.Options> {
constructor(...args: never);
}
export default Application;