UNPKG

@openmrs/esm-globals

Version:
427 lines (397 loc) • 14.6 kB
import type { i18n } from 'i18next'; declare global { const __webpack_share_scopes__: Record< string, Record<string, { loaded?: 1; get: () => Promise<unknown>; from: string; eager: boolean }> >; // eslint-disable-next-line no-var var __webpack_init_sharing__: (scope: string) => Promise<void>; interface Window { /** * Easily copies a text from an element. * @param source The source element carrying the text. */ copyText(source: HTMLElement): void; /** * Gets the OpenMRS SPA base path with a trailing slash. */ getOpenmrsSpaBase(): string; /** * Starts the OpenMRS SPA application. * @param config The configuration to use for running. */ initializeSpa(config: SpaConfig): void; /** * Indicates whether offline mode is enabled in this install or not. * This is used to determine whether offline functionality is present or not. */ offlineEnabled: boolean; /** * Gets the API base path, e.g. /openmrs */ openmrsBase: string; /** * Gets the SPA base path, e.g. /openmrs/spa */ spaBase: string; /** * Set by the app shell. Indicates whether the app shell is running in production, development, or test mode. */ spaEnv: SpaEnvironment; /** * The build number of the app shell. Set when the app shell is built by webpack. */ spaVersion: string; /** * Gets a set of options from the import-map-overrides package. */ importMapOverrides: { addOverride(moduleName: string, url: string): void; enableOverride(moduleName: string): void; getCurrentPageMap(): Promise<ImportMap>; getDefaultMap(): Promise<ImportMap>; getNextPageMap(): Promise<ImportMap>; addOverride(moduleName: string, url: string): void; getOverrideMap(includeDisabled?: boolean): ImportMap; getDisabledOverrides(): Array<string>; isDisabled(moduleName: string): boolean; removeOverride(moduleName: string): void; resetOverrides(): void; }; /** * Gets the installed modules, which are tuples consisting of the module's name and exports. */ installedModules: Array<[string, OpenmrsAppRoutes]>; /** * The i18next instance for the app. */ i18next: i18n; } } export type SpaEnvironment = 'production' | 'development' | 'test'; export interface ImportMap { imports: Record<string, string>; } /** * The configuration passed to the app shell initialization function */ export interface SpaConfig { /** * The base path or URL for the OpenMRS API / endpoints. */ apiUrl: string; /** * The base path for the SPA root path. */ spaPath: string; /** * The environment to use. * @default production */ env?: SpaEnvironment; /** * URLs of configurations to load in the system. */ configUrls?: Array<string>; /** * Defines if offline should be supported by installing a service worker. * @default true */ offline?: boolean; } /** @internal */ export type RouteDefinition = RegExp | string | boolean; /** @internal */ type AppComponent = { appName: string; }; /** * A definition of a page extracted from an app's routes.json */ export type PageDefinition = { /** * The name of the component exported by this frontend module. */ component: string; /** * If supplied, the page will only be rendered when this feature flag is enabled. */ featureFlag?: string; /** * Determines whether the component renders while the browser is connected to the internet. If false, this page will never render while online. */ online?: boolean; /** * Determines whether the component renders while the browser is not connected to the internet. If false, this page will never render while offline. */ offline?: boolean; /** * If supplied, the page will be rendered within the DOM element with the specified ID. Defaults to "omrs-apps-container" if not supplied. */ containerDomId?: string; } & ( | { /** * Either a string or a boolean. * * If a string value, this is used to indicate that this page should be rendered. For example, \"name\" will match when the current page is ${window.spaBase}/name. * * If a boolean, this either indicates that the component should always be rendered or should never be rendered. */ route: string | boolean; /** * A regular expression used to match against the current route to determine whether this page should be rendered. Note that ${window.spaBase} will be removed before attempting to match, so setting this to \"^name.+\" will match any route that starts with ${window.spaBase}/name. */ routeRegex?: never; } | { /** * Either a string or a boolean. * * If a string value, this is used to indicate that this page should be rendered. For example, \"name\" will match when the current page is ${window.spaBase}/name. * * If a boolean, this either indicates that the component should always be rendered or should never be rendered. */ route?: never; /** * A regular expression used to match against the current route to determine whether this page should be rendered. Note that ${window.spaBase} will be removed before attempting to match, so setting this to \"^name.+\" will match any route that starts with ${window.spaBase}/name. */ routeRegex: string; } ); /** * @internal * A definition of a page after the app has been registered. */ export type RegisteredPageDefinition = PageDefinition & AppComponent; /** * A definition of an extension as extracted from an app's routes.json */ export type ExtensionDefinition = { /** * The name of this extension. This is used to refer to the extension in configuration. */ name: string; /** * If supplied, the slot that this extension is rendered into by default. */ slot?: string; /** * If supplied, the slots that this extension is rendered into by default. */ slots?: Array<string>; /** * Determines whether the component renders while the browser is connected to the internet. If false, this page will never render while online. */ online?: boolean; /** * Determines whether the component renders while the browser is not connected to the internet. If false, this page will never render while offline. */ offline?: boolean; /** * Determines the order in which this component renders in its default extension slot. Note that this can be overridden by configuration. */ order?: number; /** * The user must have ANY of these privileges to see this extension. */ privileges?: string | Array<string>; /** * The expression that determines whether the extension is displayed. */ displayExpression?: string; /** * If supplied, the extension will only be rendered when this feature flag is enabled. */ featureFlag?: string; /** * Meta describes any properties that are passed down to the extension when it is loaded */ meta?: { [k: string]: unknown; }; /** * The name of the component exported by this frontend module. */ component: string; }; /** * A definition of a modal as extracted from an app's routes.json */ export type ModalDefinition = { /** * The name of this modal. This is used to launch the modal. */ name: string; /** * The name of the component exported by this frontend module. */ component: string; }; /* The possible states a workspace window can be opened in. */ export type WorkspaceWindowState = 'maximized' | 'hidden' | 'normal'; /** * A definition of a workspace as extracted from an app's routes.json */ export type WorkspaceDefinition = { /** * The name of this workspace. This is used to launch the workspace. */ name: string; /** * The title of the workspace. This will be looked up as a key in the translations of the module * defining the workspace. */ title: string; /** * The type of the workspace. Only one of each "type" of workspace is allowed to be open at a * time. The default is "form". If the right sidebar is in use, then the type determines which * right sidebar icon corresponds to the workspace. */ type: string; canHide?: boolean; canMaximize?: boolean; /** * Controls the width of the workspace. The default is "narrow" and this should only be * changed to "wider" if the workspace itself has internal navigation, like the form editor. * The width "extra-wide" is for workspaces that contain their own sidebar. */ width?: 'narrow' | 'wider' | 'extra-wide'; /** * Launches the workspace in the preferred size, it defaults to the 'narrow' width */ preferredWindowSize?: WorkspaceWindowState; /** * Workspaces can open either independently or as part of a "workspace group". A * "workspace group" groups related workspaces together, so that only one is visible * at a time. For example, * * @example * * { * name: 'order-basket', * type: 'order', * groups: ['ward-patient'] * } * * This means that the 'order-basket' workspace can be opened independently, or only * in the 'ward-patient'. * If a workspace group is already open and a new workspace is launched, and the * groups in the newly launched workspace do not include the currently open group’s * name, the entire workspace group will close, and the new workspace will launch independently. * */ groups: Array<string>; /** * The name of the component exported by this frontend module. */ component: string; }; export interface WorkspaceGroupDefinition { /** * Name of the workspace group. This is used to launch the workspace group */ name: string; /** * List of workspace names which are part of the workspace group. */ members?: Array<string>; } export interface WorkspaceGroupDefinition2 { name: string; closeable?: boolean; overlay?: boolean; /** * In app-wide persistence mode, a workspace group renders its * action menu without a close button. This is for * workspace groups that are meant to be opened for the entire duration of the app * * In closable persistence mode, a workspace group renders its * action menu with a close button. User may explicitly close the group, along * with any opened windows / workspaces. */ persistence?: 'app-wide' | 'closable'; /** * URL pattern that defines the scope where workspaces in this group should persist. * - If not defined: workspaces close only when navigating to a different app * - If defined without capture groups: workspaces close when URL doesn't match pattern * - If defined with capture groups: workspaces close when captured values change * * @example "^/home/appointments" - static scope for appointments dashboard * @example "^/patient/([^/]+)/chart" - dynamic scope by patient UUID */ scopePattern?: string; } export interface WorkspaceWindowDefinition2 { name: string; icon?: string; canMaximize?: boolean; group: string; order?: number; width?: 'narrow' | 'wider' | 'extra-wide'; } export interface WorkspaceDefinition2 { name: string; component: string; window: string; } /** * A definition of a feature flag extracted from the routes.json */ export interface FeatureFlagDefinition { /** A code-friendly name for the flag, which will be used to reference it in code */ flagName: string; /** A human-friendly name which will be displayed in the Implementer Tools */ label: string; /** An explanation of what the flag does, which will be displayed in the Implementer Tools */ description: string; } /** This interface describes the format of the routes provided by an app */ export interface OpenmrsAppRoutes { /** The version of this frontend module. */ version?: string; /** A list of backend modules necessary for this frontend module and the corresponding required versions. */ backendDependencies?: Record<string, string>; /** A list of backend modules that may enable optional functionality in this frontend module if available and the corresponding required versions. */ optionalBackendDependencies?: { /** The name of the backend dependency and either the required version or an object describing the required version */ [key: string]: | string | { /** The minimum version of this optional dependency that must be present. */ version: string; /** The feature flag to enable if this backend dependency is present */ feature?: FeatureFlagDefinition; }; }; /** An array of all pages supported by this frontend module. Pages are automatically mounted based on a route. */ pages?: Array<PageDefinition>; /** An array of all extensions supported by this frontend module. Extensions can be mounted in extension slots, either via declarations in this file or configuration. */ extensions?: Array<ExtensionDefinition>; /** An array of all feature flags for any beta-stage features this module provides. */ featureFlags?: Array<FeatureFlagDefinition>; /** An array of all modals supported by this frontend module. Modals can be launched by name. */ modals?: Array<ModalDefinition>; /** An array of all workspaces supported by this frontend module. Workspaces can be launched by name. */ workspaces?: Array<WorkspaceDefinition>; /** An array of all workspace groups supported by this frontend module. */ workspaceGroups?: Array<WorkspaceGroupDefinition>; /** An array of all workspace groups (v2) supported by this frontend module. */ workspaceGroups2?: Array<WorkspaceGroupDefinition2>; /** An array of all workspace windows (v2) supported by this frontend module. */ workspaceWindows2?: Array<WorkspaceWindowDefinition2>; /** An array of all workspaces (v2) supported by this frontend module. */ workspaces2?: Array<WorkspaceDefinition2>; } /** * This interfaces describes the format of the overall routes.json loaded by the app shell. * Basically, this is the same as the app routes, with each routes definition keyed by the app's name */ export type OpenmrsRoutes = Record<string, OpenmrsAppRoutes>; export interface ResourceLoader<T = any> { (): Promise<T>; } /* * Supported values for FHIR HumanName.use as defined by https://hl7.org/fhir/R4/valueset-name-use.html */ export type NameUse = 'usual' | 'official' | 'temp' | 'nickname' | 'anonymous' | 'old' | 'maiden';