WIP: Plug API document change event (#488)

* add support for basic on doc change event

* move change API core into plug-api/lib; add docs

* add overlap utility

* Maintain modal focus

* Federated URL backend handling

* Fix small typo in Query.md (#483)

* Federation progress

* Cleanup and federation prep

* Robustness and federation sync

* Federation: rewrite page references in federated content

* Don't sync service worker and index.json to client on silverbullet.md

* Federation listing timeouts

* Switching onboarding over to federation links

* Reduce amount of sync related log messages a bit

* Attribute indexing and code completion

* Shift-Enter in the page navigator now takes the input literally

* Updated changelog

* Completion for handlebar template variables

* Make 'pos' a number in tasks

* Updated install instructions to include edge builds

* WIP: CLI running of plugs

* Upgrade deno in Docker to 1.36.0

* Implement CLI store using Deno store

* Rerun directives

* Fixes #485

* 0.3.8

* 0.3.9

* Changelog

* Instantly sync updated pages when ticking off a task in a directive

* Sync current open page every 5s

* Optimize requests

* Make attribute extensible

* Debugging sync getting stuck

* Misaligning sync cycles (to avoid no-op cycles)

* Fixes #500: New apply page template command

* Changelog

* More sync debugging statements

* More sync debugging

* Even more debug

* Dial down excessive debug logging

* Fixes #115: By introducing MQ workers

* Use MQ for updating directives in entire space

* Work on plug:run

* touch up docs

* Fix htmlLanguage dependency

---------

Co-authored-by: Zef Hemel <zef@zef.me>
Co-authored-by: johnl <johnlunney@users.noreply.github.com>
This commit is contained in:
Ian Shehadeh
2023-08-16 15:15:19 +02:00
committed by GitHub
co-authored by Zef Hemel johnl
parent f22b9c4a1f
commit 7d3303251d
7 changed files with 97 additions and 4 deletions
-1
View File
@@ -34,7 +34,6 @@ import { createEditorState } from "./editor_state.ts";
import { OpenPages } from "./open_pages.ts";
import { MainUI } from "./editor_ui.tsx";
import { DexieMQ } from "../plugos/lib/mq.dexie.ts";
import { async } from "https://cdn.skypack.dev/-/regenerator-runtime@v0.13.9-4Dxus9nU31cBsHxnWq2H/dist=es2020,mode=imports/optimized/regenerator-runtime.js";
const frontMatterRegex = /^---\n(([^\n]|\n)*?)---\n/;
const autoSaveInterval = 1000;
+11 -1
View File
@@ -18,6 +18,7 @@ import {
highlightSpecialChars,
history,
historyKeymap,
htmlLanguage,
indentOnInput,
indentWithTab,
javaLanguage,
@@ -61,7 +62,7 @@ import {
attachmentExtension,
pasteLinkExtension,
} from "./cm_plugins/editor_paste.ts";
import { htmlLanguage } from "https://esm.sh/v130/@codemirror/lang-html@6.4.3/X-ZS9AY29kZW1pcnJvci9hdXRvY29tcGxldGUsQGNvZGVtaXJyb3IvbGFuZy1jc3MsQGNvZGVtaXJyb3IvbGFuZ3VhZ2UsQGNvZGVtaXJyb3Ivc3RhdGUsQGxlemVyL2h0bWwsQGxlemVyL2xy/dist/index.js";
import { TextChange } from "$sb/lib/change.ts";
export function createEditorState(
editor: Client,
@@ -424,6 +425,15 @@ export function createEditorState(
class {
update(update: ViewUpdate): void {
if (update.docChanged) {
const changes: TextChange[] = [];
update.changes.iterChanges((fromA, toA, fromB, toB, inserted) =>
changes.push({
inserted: inserted.toString(),
oldRange: { from: fromA, to: toA },
newRange: { from: fromB, to: toB },
})
);
editor.dispatchAppEvent("editor:pageModified", { changes });
editor.ui.viewDispatch({ type: "page-changed" });
editor.debouncedUpdateEvent();
editor.save().catch((e) => console.error("Error saving", e));
+7
View File
@@ -250,6 +250,8 @@ export class SyncService {
}
try {
remoteHash = (await this.remoteSpace!.getFileMeta(name)).lastModified;
// HEAD
//
if (!remoteHash) {
console.info(
"Not syncing file, because remote didn't send X-Last-Modified header",
@@ -260,6 +262,7 @@ export class SyncService {
// Jumping out, not saving snapshot nor triggering a sync event, because we did nothing
return;
}
//main
} catch (e: any) {
if (e.message === "Not found") {
// File doesn't exist remotely, that's ok
@@ -279,6 +282,10 @@ export class SyncService {
}
await this.saveSnapshot(snapshot);
await this.registerSyncStop(false);
// HEAD
// console.log("And done with file sync for", name);
//
//main
}
async saveSnapshot(snapshot: Map<string, SyncStatusItem>) {