batch E: close tail checks and refresh smoke evidence
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
use crate::app::{AppConfig, AppState};
|
||||
use crate::context::RequestContext;
|
||||
use crate::document_buffer_store::{self};
|
||||
use crate::error::WebError;
|
||||
use crate::page_aggregate::PageAggregate;
|
||||
use crate::routes::documents::{
|
||||
@@ -69,6 +70,25 @@ pub async fn document_page_shell(
|
||||
primary_root_uri,
|
||||
)
|
||||
.await?;
|
||||
|
||||
// 初始化 BufferStore:local_folder 文档打开时记录 file_version
|
||||
if primary_source_kind == Some("local_folder") {
|
||||
if let Some(root_uri) = primary_root_uri {
|
||||
let relative_path = document_id
|
||||
.strip_prefix("local-md:")
|
||||
.unwrap_or("")
|
||||
.replace("~2F", "/");
|
||||
let file_version = aggregate.body.file_version.as_str().map(|s| s.to_string());
|
||||
let ws_path = document_buffer_store::build_local_folder_workspace_path(
|
||||
&aggregate.identity.workspace_id,
|
||||
root_uri,
|
||||
&relative_path,
|
||||
&document_id,
|
||||
);
|
||||
state.buffer_store.init_buffer(&ws_path, file_version, None);
|
||||
}
|
||||
}
|
||||
|
||||
let title = aggregate.head.title.as_str();
|
||||
let workspace_id = aggregate.identity.workspace_id.clone();
|
||||
let requested_secondary_document_id =
|
||||
@@ -1552,6 +1572,8 @@ pub(crate) fn render_editor_island_adapter_script() -> &'static str {
|
||||
workspaceId: session.workspaceId,
|
||||
viewCount: session.views.size,
|
||||
status: session.status,
|
||||
lastExternalConflictEnvelope: session.lastExternalConflictEnvelope || null,
|
||||
dirtyState: session.dirty ? 'Dirty' : (session.hasExternalConflict ? 'ExternalModified' : 'Clean'),
|
||||
})),
|
||||
localFolderChannelCount: localFolderEventRegistry.size,
|
||||
localFolderRoots: Array.from(localFolderEventRegistry.keys()),
|
||||
@@ -1782,6 +1804,25 @@ pub(crate) fn render_editor_island_adapter_script() -> &'static str {
|
||||
return sourceLabel ? `${baseMessage}(来源:${sourceLabel})` : baseMessage;
|
||||
};
|
||||
|
||||
const ensureSessionConflictEnvelope = (session, message) => {
|
||||
if (!session) return null;
|
||||
if (session.lastExternalConflictEnvelope) return session.lastExternalConflictEnvelope;
|
||||
const envelope = {
|
||||
code: 'local_markdown_external_change',
|
||||
documentId: session.documentId,
|
||||
rootUri: session.rootUri || null,
|
||||
currentDiskVersion: session.conflictDetectionKey || session.fileVersion || null,
|
||||
editorBaseVersion: session.lastExternalConflictDetectionKey || session.conflictDetectionKey || session.fileVersion || null,
|
||||
externalActor: session.lastExternalWriteSource || null,
|
||||
dirtyState: session.dirty ? 'Dirty' : (session.hasExternalConflict ? 'ExternalModified' : 'Clean'),
|
||||
bufferFileVersion: session.fileVersion || session.conflictDetectionKey || null,
|
||||
message: message || externalConflictMessage,
|
||||
suggestedActions: ['accept_disk', 'keep_editor', 'open_diff', 'merge'],
|
||||
};
|
||||
session.lastExternalConflictEnvelope = envelope;
|
||||
return envelope;
|
||||
};
|
||||
|
||||
const clearSessionConflictSurface = (session) => {
|
||||
sessionViews(session).forEach((view) => {
|
||||
const host = view.runtimeDescriptor.root.closest('.document-pane') || view.runtimeDescriptor.root;
|
||||
@@ -2047,6 +2088,7 @@ pub(crate) fn render_editor_island_adapter_script() -> &'static str {
|
||||
|
||||
const markSessionExternalConflict = (session, message) => {
|
||||
session.externalChangePending = false;
|
||||
ensureSessionConflictEnvelope(session, message);
|
||||
session.hasExternalConflict = true;
|
||||
if (session.saveTimer) {
|
||||
window.clearTimeout(session.saveTimer);
|
||||
|
||||
Reference in New Issue
Block a user