feat: initial shared library extraction
Contains shared infrastructure for all coop services: - shared/ (factory, urls, user_loader, context, internal_api, jinja_setup) - models/ (User, Order, Calendar, Ticket, Product, Ghost CMS) - db/ (SQLAlchemy async session, base) - suma_browser/app/ (csrf, middleware, errors, authz, redis_cacher, payments, filters, utils) - suma_browser/templates/ (shared base layouts, macros, error pages) - static/ (CSS, JS, fonts, images) - alembic/ (database migrations) - config/ (app-config.yaml) - editor/ (Lexical editor Node.js build) - requirements.txt Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
49
editor/src/index.jsx
Normal file
49
editor/src/index.jsx
Normal file
@@ -0,0 +1,49 @@
|
||||
import React from "react";
|
||||
import { createRoot } from "react-dom/client";
|
||||
import Editor from "./Editor";
|
||||
|
||||
/**
|
||||
* Mount the Koenig editor into the given DOM element.
|
||||
*
|
||||
* @param {string} elementId - ID of the container element
|
||||
* @param {object} opts
|
||||
* @param {string} [opts.initialJson] - Serialised Lexical JSON (from Ghost)
|
||||
* @param {string} [opts.csrfToken] - CSRF token for API calls
|
||||
* @param {object} [opts.uploadUrls] - { image, media, file } upload endpoint URLs
|
||||
* @param {string} [opts.oembedUrl] - oEmbed proxy endpoint URL
|
||||
* @param {string} [opts.unsplashApiKey] - Unsplash API key for image search
|
||||
*/
|
||||
window.mountEditor = function mountEditor(elementId, opts = {}) {
|
||||
const container = document.getElementById(elementId);
|
||||
if (!container) {
|
||||
console.error(`[editor] Element #${elementId} not found`);
|
||||
return;
|
||||
}
|
||||
|
||||
let currentJson = opts.initialJson || null;
|
||||
|
||||
function handleChange(json) {
|
||||
currentJson = json;
|
||||
// Stash the latest JSON in a hidden input for form submission
|
||||
const hidden = document.getElementById("lexical-json-input");
|
||||
if (hidden) hidden.value = json;
|
||||
}
|
||||
|
||||
const root = createRoot(container);
|
||||
root.render(
|
||||
<Editor
|
||||
initialState={opts.initialJson || null}
|
||||
onChange={handleChange}
|
||||
csrfToken={opts.csrfToken || ""}
|
||||
uploadUrls={opts.uploadUrls || ""}
|
||||
oembedUrl={opts.oembedUrl || "/editor-api/oembed/"}
|
||||
unsplashApiKey={opts.unsplashApiKey || ""}
|
||||
snippetsUrl={opts.snippetsUrl || ""}
|
||||
/>
|
||||
);
|
||||
|
||||
// Return handle for programmatic access
|
||||
return {
|
||||
getJson: () => currentJson,
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user