JavaScript hooks for PgFlow Dashboard.
PgFlow Dashboard uses LiveView hooks for interactive features like dark mode toggling and keyboard shortcuts. These hooks must be registered with your LiveSocket for the dashboard to function properly.
Installation
Option 1: Import from the package (recommended)
Add to your assets/js/app.js:
import { DarkMode, KeyboardShortcuts, ShortcutsModal } from "../../deps/pgflow/priv/static/pgflow_dashboard/hooks"
let liveSocket = new LiveSocket("/live", Socket, {
hooks: { DarkMode, KeyboardShortcuts, ShortcutsModal, ...YourOtherHooks }
})Option 2: Copy the hooks
Copy the hook files from deps/pgflow/priv/static/pgflow_dashboard/hooks/ to your
assets/js/ directory and import them from there.
Available Hooks
DarkMode
Manages dark mode toggle with localStorage persistence. Attach to the dark mode toggle button:
<button id="dark-mode-toggle" phx-hook="DarkMode">...</button>KeyboardShortcuts
Handles global keyboard navigation shortcuts. Attach to the main dashboard
container with a data-base-path attribute:
<div id="keyboard-shortcuts" phx-hook="KeyboardShortcuts" data-base-path="/pgflow">
...
</div>Shortcuts:
g o- Go to Overviewg w- Go to Workersg f- Go to Flowsg r- Go to Runsd- Toggle dark mode?orK- Open shortcuts modalEsc- Close modal
ShortcutsModal
Manages the keyboard shortcuts help modal. Attach to the modal container:
<div id="shortcuts-modal" phx-hook="ShortcutsModal" class="hidden">
...
</div>Theme Initialization
For the best user experience, add this script to your root layout's <head>
to prevent flash of unstyled content:
<script>
(function() {
const saved = localStorage.getItem('pgflow-theme');
if (saved) {
document.documentElement.setAttribute('data-theme', saved);
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
document.documentElement.setAttribute('data-theme', 'dark');
}
})();
</script>
Summary
Functions
Returns the path to the hooks directory.
Functions
@spec hooks_path() :: String.t()
Returns the path to the hooks directory.
This can be used to copy hooks to your assets directory:
Mix.install([])
File.cp_r!(PgFlowDashboard.Hooks.hooks_path(), "assets/js/pgflow_hooks")