UNPKG

astro-integration-pocketbase

Version:

An Astro integration to support developers working with astro-loader-pocketbase.

1 lines 12.3 kB
{"version":3,"file":"toolbar.mjs","names":["packageJson.version"],"sources":["../src/toolbar/dom/create-entity.ts","../package.json","../src/toolbar/dom/create-header.ts","../src/toolbar/dom/create-placeholder.ts","../src/toolbar/init-toolbar.ts","../src/toolbar/index.ts"],"sourcesContent":["import type { Entity } from \"../types/entity\";\n\n/**\n * Creates cards for the entities.\n */\nexport function createEntities(data: Array<Entity>, baseUrl: string): string {\n const groupedData = Object.groupBy(data, (data) => data.collectionName);\n const collections = Object.keys(groupedData);\n\n return /* HTML */ `\n <style>\n .collectionName {\n text-transform: capitalize;\n }\n\n .entity {\n position: relative;\n\n pre {\n margin: 0;\n overflow: auto;\n }\n\n astro-dev-toolbar-button {\n position: absolute;\n top: 0;\n right: 0;\n }\n }\n </style>\n\n ${collections\n .map(\n (collection) => /* HTML */ `\n <b class=\".collectionName\">${collection}</b>\n ${groupedData[collection]\n ?.map((entity) => createEntity(entity, baseUrl))\n .join(\"\")}\n `\n )\n .join(\"\")}\n `;\n}\n\n/**\n * Creates a card for a single entity\n */\nfunction createEntity(data: Entity, baseUrl: string): string {\n return /* HTML */ `\n <astro-dev-toolbar-card>\n <div class=\"entity\">\n <pre>${JSON.stringify(data, undefined, 2).replaceAll(\"<\", \"&lt;\")}</pre>\n\n ${baseUrl\n ? /* HTML */ `\n <astro-dev-toolbar-button\n size=\"small\"\n button-style=\"purple\"\n title=\"View in PocketBase\"\n onclick=\"window.open('${baseUrl}/_/#/collections?collection=${data.collectionId}&record=${data.id}', '_blank')\"\n >\n View in PocketBase\n </astro-dev-toolbar-button>\n `\n : \"\"}\n </div>\n </astro-dev-toolbar-card>\n `;\n}\n","","import type { ToolbarServerHelpers } from \"astro\";\nimport type { DevToolbarButton } from \"astro/runtime/client/dev-toolbar/ui-library/button.js\";\nimport type { DevToolbarWindow } from \"astro/runtime/client/dev-toolbar/ui-library/window.js\";\nimport { default as packageJson } from \"../../../package.json\";\nimport type { ToolbarOptions } from \"../types/options\";\n\n/**\n * Creates the header for the PocketBase toolbar.\n */\n// oxlint-disable-next-line max-lines-per-function\nexport function createHeader(\n windowElement: DevToolbarWindow,\n server: ToolbarServerHelpers,\n { hasContentLoader, realtime }: ToolbarOptions\n): void {\n const header = windowElement.querySelector(\"header\");\n if (!header) {\n throw new Error(\"The header element is missing\");\n }\n\n header.innerHTML = /* HTML */ `\n <style>\n header {\n display: grid;\n grid-template-columns: auto auto 1fr;\n gap: 0.5rem;\n }\n\n h1 {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #fff;\n margin: 0;\n font-size: 22px;\n }\n\n .actions {\n display: flex;\n align-items: start;\n justify-content: flex-end;\n gap: 0.25rem;\n\n .toggle-container {\n display: flex;\n align-items: center;\n\n label {\n font-size: 0.8rem;\n }\n }\n }\n </style>\n\n <h1>PocketBase</h1>\n <astro-dev-toolbar-badge badge-style=\"yellow\">\n ${packageJson.version}\n </astro-dev-toolbar-badge>\n\n <div class=\"actions\">\n ${realtime\n ? /* HTML */ `\n <div class=\"toggle-container\">\n <label\n for=\"real-time\"\n title=\"Enable or disable real-time updates temporarily\"\n >\n Real-time updates\n </label>\n <!-- real-time-toggle -->\n </div>\n `\n : \"\"}\n ${hasContentLoader\n ? /* HTML */ `\n <astro-dev-toolbar-button\n id=\"refresh-content\"\n size=\"small\"\n button-style=\"green\"\n title=\"Right click to force refresh every collection\"\n >\n Refresh content\n </astro-dev-toolbar-button>\n `\n : \"\"}\n </div>\n `;\n\n if (realtime) {\n // Create the toggle for real-time updates\n const realTimeToggle = document.createElement(\"astro-dev-toolbar-toggle\");\n realTimeToggle.input.id = \"real-time-toggle\";\n realTimeToggle.input.title =\n \"Enable or disable real-time updates temporarily\";\n // Set the toggle state based on the local storage, default to true\n realTimeToggle.input.checked = !(\n localStorage.getItem(\"astro-integration-pocketbase:real-time\") === \"false\"\n );\n realTimeToggle.input.addEventListener(\"change\", () => {\n // Store the toggle state in the local storage\n localStorage.setItem(\n \"astro-integration-pocketbase:real-time\",\n realTimeToggle.input.checked.toString()\n );\n\n // Send the toggle state to the server\n server.send(\n \"astro-integration-pocketbase:real-time\",\n realTimeToggle.input.checked\n );\n });\n // Send the initial toggle state to the server\n server.send(\n \"astro-integration-pocketbase:real-time\",\n realTimeToggle.input.checked\n );\n windowElement.querySelector(\".toggle-container\")?.append(realTimeToggle);\n }\n\n if (hasContentLoader) {\n // Add click listeners to the refresh button\n const refresh =\n windowElement.querySelector<DevToolbarButton>(\"#refresh-content\");\n if (!refresh) {\n throw new Error(\"The refresh button is missing\");\n }\n\n refresh.addEventListener(\"click\", () => {\n server.send(\"astro-integration-pocketbase:refresh\", { force: false });\n });\n refresh.addEventListener(\"contextmenu\", (event) => {\n event.preventDefault();\n server.send(\"astro-integration-pocketbase:refresh\", { force: true });\n });\n\n server.on(\n \"astro-integration-pocketbase:refresh\",\n ({ loading }: { loading?: boolean }) => {\n // Show loading state while refreshing content\n if (loading) {\n refresh.textContent = \"Refreshing content...\";\n refresh.buttonStyle = \"gray\";\n refresh.style.pointerEvents = \"none\";\n } else {\n refresh.textContent = \"Refresh content\";\n refresh.buttonStyle = \"green\";\n refresh.style.pointerEvents = \"unset\";\n }\n }\n );\n }\n}\n","/**\n * Creates a placeholder card.\n */\nexport function createPlaceholder(): string {\n return /* HTML */ `\n <style>\n #placeholder div {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n </style>\n\n <astro-dev-toolbar-card id=\"placeholder\">\n <div>\n <span> Here you will see the raw content of an entity </span>\n </div>\n </astro-dev-toolbar-card>\n `;\n}\n","import {\n closeOnOutsideClick,\n createWindowElement,\n synchronizePlacementOnUpdate\n} from \"astro/runtime/client/dev-toolbar/apps/utils/window.js\";\nimport type {\n ToolbarAppEventTarget,\n ToolbarServerHelpers\n} from \"astro/runtime/client/dev-toolbar/helpers.js\";\nimport { createEntities, createHeader, createPlaceholder } from \"./dom\";\nimport type { Entity } from \"./types/entity\";\nimport type { ToolbarOptions } from \"./types/options\";\n\ndeclare global {\n interface Window {\n __astro_entities__?: Array<Entity>;\n }\n}\n\n/**\n * Initializes the PocketBase toolbar.\n */\nexport function initToolbar(\n canvas: ShadowRoot,\n app: ToolbarAppEventTarget,\n server: ToolbarServerHelpers\n): void {\n // Options for the toolbar\n let options: ToolbarOptions = {\n realtime: false,\n hasContentLoader: false,\n baseUrl: \"\"\n };\n\n // Update the options and refresh the toolbar\n server.on(\n \"astro-integration-pocketbase:settings\",\n (updatedOptions: ToolbarOptions) => {\n options = updatedOptions;\n createPocketBaseWindow();\n }\n );\n\n // Create the window (for every page navigation)\n createPocketBaseWindow();\n document.addEventListener(\"astro:after-swap\", createPocketBaseWindow);\n\n // Setup the window\n closeOnOutsideClick(app);\n synchronizePlacementOnUpdate(app, canvas);\n\n function createPocketBaseWindow(): void {\n // Clear any existing content\n canvas.innerHTML = \"\";\n\n const entities = window.__astro_entities__ || [];\n\n // Create the main window element\n const windowElement = createWindowElement(/* HTML */ `\n <style>\n :host astro-dev-toolbar-window {\n max-height: 480px;\n }\n\n main {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n overflow-y: auto;\n }\n </style>\n\n <header></header>\n\n <hr />\n\n <main>\n ${entities.length > 0\n ? createEntities(entities, options.baseUrl)\n : createPlaceholder()}\n </main>\n `);\n\n // Create and insert the header\n createHeader(windowElement, server, options);\n\n // Add the window to the canvas\n canvas.append(windowElement);\n\n // Update the toolbar depending on the current state\n if (entities.length > 0) {\n app.toggleNotification({ state: true, level: \"info\" });\n } else {\n app.toggleNotification({ state: false });\n app.toggleState({ state: false });\n }\n }\n}\n","import { defineToolbarApp } from \"astro/toolbar\";\nimport { initToolbar } from \"./init-toolbar\";\n\nexport default defineToolbarApp({\n init: initToolbar\n});\n"],"mappings":"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"}