toggle live edit

master
Niko PLP 5 months ago
parent 434201c657
commit c7eda5198b
  1. 21
      ng-app/src/apps/CodeMirrorEditor.svelte
  2. 2
      ng-app/src/lib/FullLayout.svelte
  3. 10
      ng-app/src/store.ts
  4. 49
      ng-app/src/tab.ts
  5. 4
      ng-net/src/actors/app/request.rs
  6. 2
      ng-sdk-js/src/lib.rs
  7. 20
      ng-verifier/src/verifier.rs

@ -12,13 +12,17 @@
<script lang="ts"> <script lang="ts">
import { onMount, tick, onDestroy } from "svelte"; import { onMount, tick, onDestroy } from "svelte";
import { import {
sparql_query,
toast_error, toast_error,
toast_success, toast_success,
reset_toasts, reset_toasts,
display_error, display_error,
live_discrete_update live_discrete_update,
discrete_update
} from "../store"; } from "../store";
import {
cur_tab_register_on_save,
cur_tab_deregister_on_save
} from "../tab";
import * as Y from 'yjs' import * as Y from 'yjs'
// @ts-ignore // @ts-ignore
@ -36,18 +40,27 @@
ydoc.on('update', async (update, origin) => { ydoc.on('update', async (update, origin) => {
if (!origin.local) { if (!origin.local) {
try { try {
await live_discrete_update(update, "YText", commits.heads); await discrete_update(update, "YText", commits.heads);
} catch (e){ } catch (e){
toast_error(display_error(e)); toast_error(display_error(e));
} }
} }
}) })
ydoc.on('destroy', () => { ydoc.on('destroy', async () => {
commits.discrete?.deregisterOnUpdate(); commits.discrete?.deregisterOnUpdate();
await cur_tab_deregister_on_save();
}) })
onMount(()=>{ onMount(()=>{
cur_tab_register_on_save(async (updates)=>{
let update = Y.mergeUpdates(updates);
await live_discrete_update(update, "YText", commits.heads);
});
let history = commits.discrete?.registerOnUpdate((update) => { let history = commits.discrete?.registerOnUpdate((update) => {
Y.applyUpdate(ydoc, update.YText, {local:true}) Y.applyUpdate(ydoc, update.YText, {local:true})
}); });

@ -37,7 +37,7 @@
import { onMount, onDestroy, tick } from "svelte"; import { onMount, onDestroy, tick } from "svelte";
import { cur_tab, cur_viewer, cur_editor, toggle_graph_discrete, cur_tab_update, get_class, get_app, all_tabs, live_editing, import { cur_tab, cur_viewer, cur_editor, toggle_graph_discrete, cur_tab_update, get_class, get_app, all_tabs, live_editing,
available_editors, available_viewers, set_editor, set_viewer, set_view_or_edit, toggle_live_edit, available_editors, available_viewers, set_editor, set_viewer, set_view_or_edit, toggle_live_edit,
has_editor_chat, all_files_count, all_comments_count, nav_bar, save, hideMenu, show_modal_menu, show_modal_create, has_editor_chat, all_files_count, all_comments_count, hideMenu, show_modal_menu, show_modal_create,
cur_tab_branch_nuri, cur_tab_doc_can_edit, cur_tab_doc_is_member, cur_tab_right_pane, cur_tab_folders_pane, cur_tab_branch_nuri, cur_tab_doc_can_edit, cur_tab_doc_is_member, cur_tab_right_pane, cur_tab_folders_pane,
cur_tab_toc_pane, cur_tab_show_menu, cur_tab_branch_has_discrete, cur_tab_graph_or_discrete, cur_tab_view_or_edit } from "../tab"; cur_tab_toc_pane, cur_tab_show_menu, cur_tab_branch_has_discrete, cur_tab_graph_or_discrete, cur_tab_view_or_edit } from "../tab";
import { import {

@ -17,7 +17,7 @@ import {
} from "svelte/store"; } from "svelte/store";
import { register, init, locale, format } from "svelte-i18n"; import { register, init, locale, format } from "svelte-i18n";
import ng from "./api"; import ng from "./api";
import { persistent_error, update_class, update_branch_display, open_branch, tab_update, change_nav_bar, cur_branch, cur_tab, show_modal_create } from "./tab"; import { persistent_error, update_class, update_branch_display, open_branch, tab_update, change_nav_bar, cur_branch, cur_tab, show_modal_create, cur_tab_update, nav_bar,in_memory_save } from "./tab";
import { encode } from "./base64url"; import { encode } from "./base64url";
let all_branches = {}; let all_branches = {};
@ -395,7 +395,13 @@ export const digest_to_string = function(digest) {
return encode(buffer.buffer); return encode(buffer.buffer);
}; };
export const discrete_update = async (update) => { export const discrete_update = async (update, crdt, heads) => {
if (get(cur_tab).doc.live_edit) {
await live_discrete_update(update, crdt, heads);
} else {
in_memory_save.push(update);
nav_bar.update((o) => { o.save = true; return o; });
}
// if cur_tab.doc.live_edit => send directly to verifier (with live_discrete_update) // if cur_tab.doc.live_edit => send directly to verifier (with live_discrete_update)
// else, save the update locally with the API. // else, save the update locally with the API.
// and nav_bar.update((o) => { o.save = true; return o; }); // and nav_bar.update((o) => { o.save = true; return o; });

@ -260,8 +260,6 @@ export const all_tabs = writable({
description: "", description: "",
app: "", // current app being used app: "", // current app being used
onSave: (updates) => {},
updates: [],
}, },
view_or_edit: true, // true=> view, false=> edit view_or_edit: true, // true=> view, false=> edit
graph_viewer: "", // selected viewer graph_viewer: "", // selected viewer
@ -306,11 +304,29 @@ export const all_tabs = writable({
} }
}); });
export const cur_tab_register_on_save = (f:(updates) => {}) => { export let in_memory_save = [];
cur_tab_update((old)=>{ let in_memory_save_callback = async (updates) => {};
old.branch.onSave = f;
return old; export const cur_tab_register_on_save = (f:(updates) => Promise<void>) => {
}); console.log("cur_tab_register_on_save")
in_memory_save_callback = f;
in_memory_save = [];
}
export const cur_tab_deregister_on_save = async () => {
await save();
in_memory_save_callback = async (updates) => {};
}
export const save = async () => {
// saving the doc
// TODO fetch updates from local storage
nav_bar.update((o) => { if (o.save === true) o.save = false; return o; });
if (in_memory_save.length > 0) {
await in_memory_save_callback(in_memory_save);
}
in_memory_save = [];
} }
export const set_header_in_view = function(val) { export const set_header_in_view = function(val) {
@ -465,11 +481,8 @@ export const nav_bar = writable({
live_editing.subscribe((val) => { live_editing.subscribe((val) => {
cur_tab_update((old)=> { cur_tab_update((old)=> {
old.doc.live_edit = val; old.doc.live_edit = val;
if (val) {
//TODO: send all the updates with live_discrete_update
}
nav_bar.update((o) => { nav_bar.update((o) => {
o.save = old.doc.live_edit ? undefined : ( old.branch.updates.length > 0 ? true : false ) o.save = old.doc.live_edit ? undefined : ( in_memory_save.length > 0 ? true : false )
return o; return o;
}); });
return old; return old;
@ -525,12 +538,6 @@ export const persistent_error = (nuri, pe) => {
}); });
} }
export const save = async () => {
// saving the doc
// fetch updates from local storage
get(cur_tab).branch.onSave([]);
}
export const all_files_count = derived(cur_tab, ($cur_tab) => { export const all_files_count = derived(cur_tab, ($cur_tab) => {
let total = $cur_tab.branch.files; let total = $cur_tab.branch.files;
return total ? `(${total})` : ""; return total ? `(${total})` : "";
@ -545,12 +552,18 @@ export const has_editor_chat = derived(cur_tab, ($cur_tab) => {
return $cur_tab.doc.can_edit && $cur_tab.store.store_type !== "private" && $cur_tab.store.store_type !== "dialog"; return $cur_tab.doc.can_edit && $cur_tab.store.store_type !== "private" && $cur_tab.store.store_type !== "dialog";
}); });
export const toggle_live_edit = () => { export const toggle_live_edit = async () => {
let is_live;
cur_tab_update(ct => { cur_tab_update(ct => {
ct.doc.live_edit = !ct.doc.live_edit; ct.doc.live_edit = !ct.doc.live_edit;
is_live = ct.doc.live_edit;
live_editing.set(ct.doc.live_edit); live_editing.set(ct.doc.live_edit);
return ct; return ct;
}); });
if (is_live) {
//send all the updates with live_discrete_update
await save();
}
} }
export const set_viewer = (app_name: string) => { export const set_viewer = (app_name: string) => {

@ -63,7 +63,7 @@ impl TryFrom<ProtocolMessage> for AppResponse {
if let AppMessageContentV0::Response(res) = msg.try_into()? { if let AppMessageContentV0::Response(res) = msg.try_into()? {
Ok(res) Ok(res)
} else { } else {
log_info!("INVALID AppMessageContentV0::Response"); log_err!("INVALID AppMessageContentV0::Response");
Err(ProtocolError::InvalidValue) Err(ProtocolError::InvalidValue)
} }
} }
@ -83,7 +83,7 @@ impl TryFrom<ProtocolMessage> for AppMessageContentV0 {
Err(ProtocolError::ServerError) Err(ProtocolError::ServerError)
} }
} else { } else {
log_info!("INVALID AppMessageContentV0 {:?}", msg); log_err!("INVALID AppMessageContentV0 {:?}", msg);
Err(ProtocolError::InvalidValue) Err(ProtocolError::InvalidValue)
} }
} }

@ -1022,7 +1022,7 @@ async fn app_request_stream_(
spawn_and_log_error(inner_task(reader, callback.clone(), canceller_tx.clone())); spawn_and_log_error(inner_task(reader, callback.clone(), canceller_tx.clone()));
let cb = Closure::once(move || { let cb = Closure::once(move || {
log_info!("trying to cancel"); log_debug!("trying to cancel");
//sender.close_channel() //sender.close_channel()
let _ = canceller_tx.unbounded_send(()); let _ = canceller_tx.unbounded_send(());
canceller_tx.close_channel(); canceller_tx.close_channel();

@ -227,7 +227,7 @@ impl Verifier {
// ); // );
if let Some(sender) = self.branch_subscriptions.get_mut(branch) { if let Some(sender) = self.branch_subscriptions.get_mut(branch) {
if sender.is_closed() { if sender.is_closed() {
log_info!("closed so removed {}", branch); log_debug!("closed so removed {}", branch);
self.branch_subscriptions.remove(branch); self.branch_subscriptions.remove(branch);
} else { } else {
let _ = sender.send(response).await; let _ = sender.send(response).await;
@ -381,7 +381,7 @@ impl Verifier {
.await; .await;
let fnonce = Box::new(move || { let fnonce = Box::new(move || {
log_info!("CLOSE_CHANNEL of subscription for branch {}", branch_id); log_debug!("CLOSE_CHANNEL of subscription for branch {}", branch_id);
if !tx.is_closed() { if !tx.is_closed() {
tx.close_channel(); tx.close_channel();
} }
@ -439,7 +439,7 @@ impl Verifier {
let stores = user_storage.get_all_store_and_repo_ids()?; let stores = user_storage.get_all_store_and_repo_ids()?;
for (store, repos) in stores.iter() { for (store, repos) in stores.iter() {
log_info!("LOADING STORE: {}", store); log_debug!("LOADING STORE: {}", store);
let repo = user_storage let repo = user_storage
.load_store(store, Arc::clone(self.block_storage.as_ref().unwrap()))?; .load_store(store, Arc::clone(self.block_storage.as_ref().unwrap()))?;
self.stores.insert( self.stores.insert(
@ -1073,9 +1073,9 @@ impl Verifier {
let user = self.user_id().clone(); let user = self.user_id().clone();
let broker = BROKER.read().await; let broker = BROKER.read().await;
log_info!("looping on branches {:?}", branches); log_debug!("looping on branches {:?}", branches);
for (repo, branch, publisher) in branches { for (repo, branch, publisher) in branches {
log_info!("open_branch_ repo {} branch {}", repo, branch); log_debug!("open_branch_ repo {} branch {}", repo, branch);
let _e = self let _e = self
.open_branch_( .open_branch_(
&repo, &repo,
@ -1087,7 +1087,7 @@ impl Verifier {
false, false,
) )
.await; .await;
log_info!( log_debug!(
"END OF open_branch_ repo {} branch {} with {:?}", "END OF open_branch_ repo {} branch {} with {:?}",
repo, repo,
branch, branch,
@ -1585,7 +1585,7 @@ impl Verifier {
let (store, msg, branch_secret) = { let (store, msg, branch_secret) = {
//log_info!("do_sync_req_if_needed for branch {}", branch_id); //log_info!("do_sync_req_if_needed for branch {}", branch_id);
if remote_commits_nbr == 0 || remote_heads.is_empty() { if remote_commits_nbr == 0 || remote_heads.is_empty() {
log_info!("branch is new on the broker. doing nothing"); log_debug!("branch is new on the broker. doing nothing");
return Ok(()); return Ok(());
} }
@ -1860,7 +1860,7 @@ impl Verifier {
} }
} }
log_info!("loaded from read_cap {}", repo_id); log_debug!("loaded from read_cap {}", repo_id);
// TODO: deal with AddSignerCap that are saved on rocksdb for now, but do not make it to the Verifier.repos // TODO: deal with AddSignerCap that are saved on rocksdb for now, but do not make it to the Verifier.repos
return Ok((repo_id.clone(), store_branch)); return Ok((repo_id.clone(), store_branch));
@ -2128,7 +2128,7 @@ impl Verifier {
pub async fn send_outbox(&mut self) -> Result<(), NgError> { pub async fn send_outbox(&mut self) -> Result<(), NgError> {
let ret = self.take_events_from_outbox(); let ret = self.take_events_from_outbox();
if ret.is_err() { if ret.is_err() {
log_info!( log_debug!(
"take_events_from_outbox returned {:}", "take_events_from_outbox returned {:}",
ret.as_ref().unwrap_err() ret.as_ref().unwrap_err()
); );
@ -2231,7 +2231,7 @@ impl Verifier {
.await?; .await?;
for file in commit.files() { for file in commit.files() {
log_info!("PUT FILE {:?}", file.id); log_debug!("PUT FILE {:?}", file.id);
self.put_all_blocks_of_file(&file, &repo_id, &store_repo) self.put_all_blocks_of_file(&file, &repo_id, &store_repo)
.await?; .await?;
} }

Loading…
Cancel
Save