@oruga-ui/oruga-next
Version:
UI components for Vue.js and CSS framework agnostic
67 lines (57 loc) • 2.43 kB
text/typescript
import { type ComponentInternalInstance, type MaybeRefOrGetter } from "vue";
import {
InstanceRegistry,
ComponentProgrammatic,
type ProgrammaticComponentOptions,
type ProgrammaticExpose,
} from "../programmatic";
import Loading from "./Loading.vue";
import type { LoadingProps } from "./props";
declare module "../../index" {
interface OrugaProgrammatic {
loading: typeof LoadingProgrammatic;
}
}
/** loading component programmatic instance registry **/
const registry = new InstanceRegistry<ComponentInternalInstance>();
/** useLoadingProgrammatic composable options */
export type LoadingProgrammaticOptions = Readonly<LoadingProps> &
ProgrammaticComponentOptions<typeof Loading>;
const LoadingProgrammatic = {
/** Returns the number of registered active instances. */
count: registry.count,
/**
* Create a new programmatic loading component instance.
* @param options loading label string or loading component props object
* @param target specify a target the component get rendered into
* @returns ProgrammaticExpose
*/
open(
options: string | LoadingProgrammaticOptions,
target?: MaybeRefOrGetter<string | HTMLElement | null>,
): ProgrammaticExpose<typeof Loading> {
const _options: LoadingProgrammaticOptions =
typeof options === "string" ? { label: options } : options;
const componentProps: LoadingProps = {
active: true, // set the active default state to true
fullPage: false, // set the full page default state to false
...(_options as LoadingProps),
};
// create programmatic component
return ComponentProgrammatic.open(Loading, {
registry, // custom programmatic instance registry
target, // target the component get rendered into
props: componentProps, // component specific props
onClose: _options.onClose, // on close event handler
});
},
/** Close the last registred instance in the loading programmatic instance registry. */
close(...args: unknown[]): void {
registry.last()?.exposed?.close(...args);
},
/** Close all instances in the programmatic loading instance registry. */
closeAll(...args: unknown[]): void {
registry.walk((entry) => entry.exposed?.close(...args));
},
};
export default LoadingProgrammatic;