UNPKG

lisn.js

Version:

Simply handle user gestures and actions. Includes widgets.

1 lines 10.8 kB
{"version":3,"file":"page-loader.cjs","names":["MH","_interopRequireWildcard","require","_cssAlter","_domAlter","_domEvents","_validation","_widget","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","PageLoader","Widget","element","mainWidget","instance","DUMMY_ID","isInstanceOf","register","registerWidget","WIDGET_NAME","config","configValidator","enableMain","loader","createElement","widget","onDestroy","moveElement","waitForElement","getBody","then","body","isDestroyed","to","constructor","_PageLoader$get","destroyPromise","destroy","id","promiseResolve","_config$autoRemove","addClasses","PREFIX_ROOT","spinner","PREFIX_SPINNER","setHasModal","autoRemove","waitForPageReady","hideAndRemoveElement","onDisable","undisplayElement","docQuerySelector","delHasModal","onEnable","displayElement","removeClasses","exports","PREFIXED_NAME","prefixName","validateBoolean"],"sources":["../../../src/ts/widgets/page-loader.ts"],"sourcesContent":["/**\n * @module Widgets\n */\n\nimport * as MH from \"@lisn/globals/minification-helpers\";\n\nimport {\n displayElement,\n undisplayElement,\n addClasses,\n removeClasses,\n setHasModal,\n delHasModal,\n} from \"@lisn/utils/css-alter\";\nimport { moveElement, hideAndRemoveElement } from \"@lisn/utils/dom-alter\";\nimport { waitForElement, waitForPageReady } from \"@lisn/utils/dom-events\";\nimport { validateBoolean } from \"@lisn/utils/validation\";\n\nimport {\n Widget,\n WidgetConfigValidatorObject,\n registerWidget,\n} from \"@lisn/widgets/widget\";\n\n/**\n * Configures the given element as a {@link PageLoader} widget.\n *\n * The page loader is a full-page spinner. You would almost certainly use this\n * only once, to hide the page before it's loaded.\n *\n * **IMPORTANT:** You should not instantiate more than one {@link PageLoader}\n * widget on a given element. Use {@link PageLoader.get} to get an existing\n * instance if any. If there is already a widget instance, it will be destroyed!\n *\n * -----\n *\n * To use with auto-widgets (HTML API) (see\n * {@link Settings.settings.autoWidgets | settings.autoWidgets}), the following\n * CSS classes or data attributes are recognized:\n * - `lisn-page-loader` class or `data-lisn-page-loader` attribute set on\n * the element that constitutes the widget. The element should be empty.\n *\n * See below examples for what values you can use set for the data attributes\n * in order to modify the configuration of the automatically created widget.\n *\n * @example\n * This will create a page loader using the JavaScript API.\n *\n * This will work even if\n * {@link Settings.settings.autoWidgets | settings.autoWidgets}) is false\n *\n * ```html\n * <!-- LISN should be loaded beforehand -->\n * <script>\n * LISN.widgets.PageLoader.enableMain();\n * </script>\n * ```\n *\n * @example\n * This will create a page loader using an existing element with default\n * {@link PageLoaderConfig}.\n *\n * ```html\n * <div class=\"lisn-page-loader\"></div>\n * ```\n *\n * @example\n * As above but with custom settings.\n *\n * ```html\n * <div data-lisn-page-loader=\"auto-remove=false\"></div>\n * ```\n */\nexport class PageLoader extends Widget {\n /**\n * If element is omitted, returns the instance created by {@link enableMain}\n * if any.\n */\n static get(element?: Element): PageLoader | null {\n if (!element) {\n return mainWidget;\n }\n\n const instance = super.get(element, DUMMY_ID);\n if (MH.isInstanceOf(instance, PageLoader)) {\n return instance;\n }\n return null;\n }\n\n static register() {\n registerWidget(\n WIDGET_NAME,\n (element, config) => {\n if (!PageLoader.get(element)) {\n return new PageLoader(element, config);\n }\n return null;\n },\n configValidator,\n );\n }\n\n /**\n * Creates a new element, inserts it into the document body and configures it\n * as a {@link PageLoader}.\n */\n static enableMain(config?: PageLoaderConfig) {\n const loader = MH.createElement(\"div\");\n const widget = new PageLoader(loader, config);\n widget.onDestroy(() => {\n if (mainWidget === widget) {\n mainWidget = null;\n }\n return moveElement(loader);\n });\n\n waitForElement(MH.getBody).then((body) => {\n if (!widget.isDestroyed()) {\n moveElement(loader, { to: body });\n }\n });\n\n mainWidget = widget;\n return widget;\n }\n\n constructor(element: Element, config?: PageLoaderConfig) {\n const destroyPromise = PageLoader.get(element)?.destroy();\n super(element, { id: DUMMY_ID });\n\n (destroyPromise || MH.promiseResolve()).then(() => {\n if (this.isDestroyed()) {\n return;\n }\n\n addClasses(element, PREFIX_ROOT);\n\n const spinner = MH.createElement(\"div\");\n addClasses(spinner, PREFIX_SPINNER);\n\n moveElement(spinner, { to: element });\n waitForElement(MH.getBody).then(setHasModal); // we could be init before body\n\n if (config?.autoRemove ?? true) {\n waitForPageReady()\n .then(() => hideAndRemoveElement(element))\n .then(this.destroy);\n }\n\n this.onDisable(() => {\n undisplayElement(element);\n if (!MH.docQuerySelector(`.${PREFIX_ROOT}`)) {\n delHasModal();\n }\n });\n\n this.onEnable(async () => {\n await displayElement(element);\n });\n\n this.onDestroy(async () => {\n moveElement(spinner); // remove\n await removeClasses(element, PREFIX_ROOT);\n await displayElement(element); // revert undisplay by onDisable\n });\n });\n }\n}\n\n/**\n * @interface\n */\nexport type PageLoaderConfig = {\n /**\n * Whether to automatically hide and remove the loader when the page is\n * ready (see {@link waitForPageReady}.\n *\n * @defaultValue true\n */\n autoRemove?: boolean;\n};\n\n// --------------------\n\nconst WIDGET_NAME = \"page-loader\";\nconst PREFIXED_NAME = MH.prefixName(WIDGET_NAME);\nconst PREFIX_ROOT = `${PREFIXED_NAME}__root`;\nconst PREFIX_SPINNER = MH.prefixName(\"spinner\");\n// Only one PageLoader widget per element is allowed, but Widget requires a\n// non-blank ID.\n// In fact, it doesn't make much sense to have more than 1 page loader on the\n// whole page, but we support it, hence use a class rather than a DOM ID.\nconst DUMMY_ID = PREFIXED_NAME;\nlet mainWidget: PageLoader | null = null;\n\nconst configValidator: WidgetConfigValidatorObject<PageLoaderConfig> = {\n autoRemove: validateBoolean,\n};\n"],"mappings":"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","ignoreList":[]}