kopia lustrzana https://github.com/simonw/datasette
feat: first cut at datasette JS api
rodzic
3feed1f66e
commit
305a4de982
|
@ -0,0 +1,64 @@
|
|||
// Local dev
|
||||
// datasette/static/datasette-manager.js
|
||||
// use quokka run on current file for JS debugging
|
||||
|
||||
const DATASETTE_EVENTS = {
|
||||
INIT: "InitDatasette"
|
||||
}
|
||||
|
||||
/**
|
||||
* Monolith class for interacting with Datasette JS API
|
||||
* Imported with DEFER, runs after main document was parsed
|
||||
*/
|
||||
const datasetteManager = {
|
||||
VERSION: 'INSERT_HARDCODED_VERSION_OR_ENDPOINT',
|
||||
|
||||
// Let plugins register. TODO... what should unique identifiers be?
|
||||
// Name, etc. Should this be a MAP instead of a list?
|
||||
// Does order of registration matter?
|
||||
|
||||
// Should plugins be allowed to clobber others or is it last-in takes priority?
|
||||
// Does pluginMetadata need to be serializable, or can we let it be stateful / have functions?
|
||||
// Should we notify plugins that have dependencies
|
||||
// when all dependencies were fulfilled? (leaflet, codemirror, etc)
|
||||
plugins: new Map(),
|
||||
registerPlugin: (name, pluginMetadata) => {
|
||||
if (datasetteManager.plugins.get(name)) {
|
||||
console.warn(`Warning -> plugin ${name} is redefined`);
|
||||
}
|
||||
datasetteManager.plugins.set(name, pluginMetadata);
|
||||
},
|
||||
|
||||
|
||||
// Datasette "core" -> Methods/APIs that are so core, we don't store them as a plugin
|
||||
/** Selectors for significant DOM elements. Store identifier rather than addresses rather than immediate references in case they haven't loaded yet */
|
||||
domSelectors: {
|
||||
// aboveTableBar: 'div#plugin-bar',
|
||||
jsonUrlLink: '.export-links a[href*=json]',
|
||||
dataTable: 'table.rows-and-columns"',
|
||||
},
|
||||
|
||||
// Fetch page's data in array format and store
|
||||
// Have knowledge of what datasette APIs are available
|
||||
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Fire AFTER the document has been parsed
|
||||
* Initialization... TODO how to make sure this exists BEFORE datasette manager is loaded? */
|
||||
const initializeDatasette = () => {
|
||||
// Make Manager available to other plugins
|
||||
window.__DATASETTE__ = datasetteManager;
|
||||
console.log("Datasette Manager Created!");
|
||||
|
||||
const initDatasetteEvent = new CustomEvent(DATASETTE_EVENTS.INIT, {
|
||||
detail: datasetteManager
|
||||
});
|
||||
document.dispatchEvent(initDatasetteEvent)
|
||||
}
|
||||
|
||||
// Main function
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
initializeDatasette();
|
||||
});
|
|
@ -7,6 +7,7 @@
|
|||
{% for url in extra_css_urls %}
|
||||
<link rel="stylesheet" href="{{ url.url }}"{% if url.get("sri") %} integrity="{{ url.sri }}" crossorigin="anonymous"{% endif %}>
|
||||
{% endfor %}
|
||||
<script src="{{ urls.static('datasette-manager.js') }}" defer></script>
|
||||
{% for url in extra_js_urls %}
|
||||
<script {% if url.module %}type="module" {% endif %}src="{{ url.url }}"{% if url.get("sri") %} integrity="{{ url.sri }}" crossorigin="anonymous"{% endif %}></script>
|
||||
{% endfor %}
|
||||
|
|
Ładowanie…
Reference in New Issue