From b7dddd2a662668408f075fa3f502e6285397e2e3 Mon Sep 17 00:00:00 2001 From: lix-2026 Date: Mon, 11 May 2026 08:27:52 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20Rust=20OnlyOffice?= =?UTF-8?q?=20=E9=99=84=E4=BB=B6=E6=89=93=E5=BC=80=E9=93=BE=E8=B7=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rust/Cargo.lock | 34 + rust/crates/mnote-web/Cargo.toml | 3 +- rust/crates/mnote-web/src/routes/media.rs | 488 ++++++++ rust/crates/mnote-web/src/routes/mod.rs | 17 +- .../crates/mnote-web/src/routes/onlyoffice.rs | 1006 +++++++++++++++++ rust/crates/mnote-web/src/ssr/pages/layout.rs | 889 ++++++++++++++- rust/crates/mnote-web/src/ssr/styles.rs | 76 ++ rust/crates/mnote-web/src/transport/convex.rs | 23 + .../mnote-leptos-tiptap-spike-island.d.ts | 27 +- .../mnote-leptos-tiptap-spike-island.js | 103 +- .../mnote-leptos-tiptap-spike-island_bg.wasm | Bin 1849482 -> 9656737 bytes ...te-leptos-tiptap-spike-island_bg.wasm.d.ts | 27 +- rust/spikes/leptos-tiptap-spike/src/lib.rs | 122 +- scripts/desktop-hot.js | 56 +- scripts/desktop-hot.test.js | 25 +- ...4-rust-onlyoffice-attachment-open-smoke.js | 267 +++++ scripts/task175-rust-upload-entry-smoke.js | 367 ++++++ wolai-frontend/src/app/onlyoffice/page.tsx | 4 +- .../src/lib/onlyoffice/client-session.test.ts | 25 + .../src/lib/onlyoffice/client-session.ts | 34 + 20 files changed, 3484 insertions(+), 109 deletions(-) create mode 100644 rust/crates/mnote-web/src/routes/media.rs create mode 100644 rust/crates/mnote-web/src/routes/onlyoffice.rs create mode 100644 scripts/task174-rust-onlyoffice-attachment-open-smoke.js create mode 100644 scripts/task175-rust-upload-entry-smoke.js diff --git a/rust/Cargo.lock b/rust/Cargo.lock index cfccded4..63d669e3 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -174,6 +174,7 @@ dependencies = [ "matchit", "memchr", "mime", + "multer", "percent-encoding", "pin-project-lite", "serde_core", @@ -581,6 +582,15 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + [[package]] name = "entities" version = "1.0.1" @@ -1518,6 +1528,7 @@ dependencies = [ name = "mnote-web" version = "0.1.0" dependencies = [ + "adapter-onlyoffice", "axum", "base64", "bridge-runtime", @@ -1539,6 +1550,23 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "multer" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b" +dependencies = [ + "bytes", + "encoding_rs", + "futures-util", + "http", + "httparse", + "memchr", + "mime", + "spin", + "version_check", +] + [[package]] name = "next_tuple" version = "0.1.0" @@ -2400,6 +2428,12 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "stable_deref_trait" version = "1.2.1" diff --git a/rust/crates/mnote-web/Cargo.toml b/rust/crates/mnote-web/Cargo.toml index 169d6fbd..257451f9 100644 --- a/rust/crates/mnote-web/Cargo.toml +++ b/rust/crates/mnote-web/Cargo.toml @@ -6,7 +6,8 @@ license.workspace = true authors.workspace = true [dependencies] -axum = { version = "0.8", features = ["ws"] } +adapter-onlyoffice = { path = "../adapter-onlyoffice" } +axum = { version = "0.8", features = ["multipart", "ws"] } bridge-runtime = { path = "../bridge-runtime" } core-protocol = { path = "../core-protocol" } futures-util = "0.3" diff --git a/rust/crates/mnote-web/src/routes/media.rs b/rust/crates/mnote-web/src/routes/media.rs new file mode 100644 index 00000000..d4d0a75e --- /dev/null +++ b/rust/crates/mnote-web/src/routes/media.rs @@ -0,0 +1,488 @@ +use crate::app::AppState; +use crate::context::RequestContext; +use crate::error::WebError; +use crate::transport::convex::{execute_convex_mutation_by_name, execute_convex_query_by_name}; +use axum::extract::{Multipart, Query, State}; +use axum::http::{header, HeaderMap}; +use axum::response::{IntoResponse, Response}; +use axum::{Extension, Json}; +use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine as _}; +use serde::{Deserialize, Serialize}; +use serde_json::{json, Value}; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::time::{SystemTime, UNIX_EPOCH}; + +static UPLOAD_COUNTER: AtomicU64 = AtomicU64::new(1); + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct MediaSignQuery { + asset_id: Option, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct FileTreeUploadTargetPreflightPayload { + workspace_id: Option, + target_document_id: Option, + target_row_id: Option, + focused_row_id: Option, + active_document_id: Option, + rows: Option>, + document_workspaces: Option>, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +#[allow(dead_code)] +pub struct FileTreeUploadTargetRow { + row_id: Option, + row_kind: Option, + document_id: Option, + asset_id: Option, + asset_document_id: Option, +} + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct FileTreeDocumentWorkspace { + document_id: Option, + workspace_id: Option, +} + +#[derive(Debug, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct FileTreeUploadTargetPlan { + workspace_id: String, + target_document_id: String, + target_mindmap_id: Option, + target_sub_path: Option, +} + +#[derive(Debug)] +struct UploadFile { + name: String, + content_type: String, + bytes: Vec, +} + +async fn current_user_id(state: &AppState, context: &RequestContext) -> String { + let actor_id = context.auth.actor_id.trim(); + if !actor_id.is_empty() && actor_id != "anonymous" { + return actor_id.to_string(); + } + if let Ok(user) = execute_convex_query_by_name( + state.config(), + context, + "users:currentUser", + json!({}), + context.workspace.workspace_id.as_deref(), + "media_current_user", + ) + .await + { + for key in ["_id", "id"] { + if let Some(user_id) = user + .get(key) + .and_then(Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + { + return user_id.to_string(); + } + } + } + state.config().dev_user_id.clone() +} + +fn now_millis() -> u128 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_millis() +} + +fn new_asset_id() -> String { + format!( + "asset_{}_{}", + now_millis(), + UPLOAD_COUNTER.fetch_add(1, Ordering::Relaxed) + ) +} + +fn asset_type(mime: &str) -> &'static str { + if mime.starts_with("image/") { + "image" + } else if mime.starts_with("video/") { + "video" + } else if mime.starts_with("audio/") { + "audio" + } else { + "file" + } +} + +async fn read_upload_multipart( + mut multipart: Multipart, +) -> Result<(UploadFile, String, String, Option), WebError> { + let mut file: Option = None; + let mut workspace_id = String::new(); + let mut document_id = String::new(); + let mut mindmap_id: Option = None; + + while let Some(field) = multipart.next_field().await.map_err(|error| { + WebError::bad_request_code( + "media_upload_bad_multipart", + format!("上传表单解析失败: {error}"), + ) + })? { + let name = field.name().unwrap_or_default().to_string(); + if name == "file" { + let file_name = field + .file_name() + .map(str::trim) + .filter(|value| !value.is_empty()) + .unwrap_or("附件") + .to_string(); + let content_type = field + .content_type() + .map(str::trim) + .filter(|value| !value.is_empty()) + .unwrap_or("application/octet-stream") + .to_string(); + let bytes = field + .bytes() + .await + .map_err(|error| { + WebError::bad_request_code( + "media_upload_file_read_failed", + format!("读取上传文件失败: {error}"), + ) + })? + .to_vec(); + file = Some(UploadFile { + name: file_name, + content_type, + bytes, + }); + continue; + } + + let value = field.text().await.map_err(|error| { + WebError::bad_request_code( + "media_upload_field_read_failed", + format!("读取上传字段失败: {error}"), + ) + })?; + match name.as_str() { + "workspaceId" => workspace_id = value.trim().to_string(), + "documentId" => document_id = value.trim().to_string(), + "mindmapId" => { + let trimmed = value.trim(); + if !trimmed.is_empty() { + mindmap_id = Some(trimmed.to_string()); + } + } + _ => {} + } + } + + let file = + file.ok_or_else(|| WebError::bad_request_code("media_upload_file_missing", "缺少 file"))?; + if file.bytes.is_empty() || workspace_id.is_empty() || document_id.is_empty() { + return Err(WebError::bad_request_code( + "media_upload_required_missing", + "缺少必要参数", + )); + } + Ok((file, workspace_id, document_id, mindmap_id)) +} + +fn absolute_origin(headers: &HeaderMap) -> String { + let proto = headers + .get("x-forwarded-proto") + .and_then(|value| value.to_str().ok()) + .map(str::trim) + .filter(|value| !value.is_empty()) + .unwrap_or("http"); + let host = headers + .get(header::HOST) + .and_then(|value| value.to_str().ok()) + .map(str::trim) + .filter(|value| !value.is_empty()) + .unwrap_or("127.0.0.1:3000"); + format!("{proto}://{host}") +} + +fn proxied_file_url(headers: &HeaderMap, raw: &str) -> String { + let encoded = URL_SAFE_NO_PAD.encode(raw.as_bytes()); + format!( + "{}/api/onlyoffice/proxy?u={encoded}", + absolute_origin(headers) + ) +} + +fn trim_string(value: Option<&String>) -> Option { + value + .map(String::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(ToOwned::to_owned) +} + +fn workspace_for_document( + document_id: &str, + fallback_workspace_id: Option<&str>, + document_workspaces: &[FileTreeDocumentWorkspace], +) -> Option { + for item in document_workspaces { + if trim_string(item.document_id.as_ref()).as_deref() == Some(document_id) { + if let Some(workspace_id) = trim_string(item.workspace_id.as_ref()) { + return Some(workspace_id); + } + } + } + fallback_workspace_id + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(ToOwned::to_owned) +} + +fn document_for_target_row( + target_row_id: Option<&str>, + rows: &[FileTreeUploadTargetRow], +) -> Option { + let row_id = target_row_id?.trim(); + if row_id.is_empty() { + return None; + } + for row in rows { + if trim_string(row.row_id.as_ref()).as_deref() != Some(row_id) { + continue; + } + if let Some(document_id) = trim_string(row.document_id.as_ref()) { + return Some(document_id); + } + if let Some(document_id) = trim_string(row.asset_document_id.as_ref()) { + return Some(document_id); + } + } + None +} + +pub async fn upload( + State(state): State, + Extension(context): Extension, + multipart: Multipart, +) -> Result { + let (file, workspace_id, document_id, mindmap_id) = read_upload_multipart(multipart).await?; + let user_id = current_user_id(&state, &context).await; + let upload_url = execute_convex_mutation_by_name( + state.config(), + &context, + "mediaAssets:generateUploadUrl", + json!({ "userId": user_id }), + Some(&workspace_id), + None, + "media_upload_generate_url", + ) + .await?; + let upload_url = upload_url.as_str().ok_or_else(|| { + WebError::bad_gateway_code("media_upload_bad_upload_url", "Convex 未返回上传 URL") + })?; + + let client = reqwest::Client::new(); + let upload_response = client + .post(upload_url) + .header(header::CONTENT_TYPE, file.content_type.as_str()) + .body(file.bytes.clone()) + .send() + .await + .map_err(|error| { + WebError::bad_gateway_code( + "media_upload_storage_failed", + format!("上传到 Convex Files 失败: {error}"), + ) + })?; + let upload_status = upload_response.status(); + let upload_json: Value = upload_response.json().await.map_err(|error| { + WebError::bad_gateway_code( + "media_upload_storage_bad_response", + format!("Convex Files 响应解析失败: {error}"), + ) + .with_header("x-upstream-status", upload_status.as_u16().to_string()) + })?; + if !upload_status.is_success() { + return Err(WebError::bad_gateway_code( + "media_upload_storage_status", + format!("上传到 Convex Files 失败: {upload_json}"), + ) + .with_header("x-upstream-status", upload_status.as_u16().to_string())); + } + let storage_id = upload_json + .get("storageId") + .and_then(Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .ok_or_else(|| { + WebError::bad_gateway_code( + "media_upload_storage_id_missing", + "Convex Files 缺少 storageId", + ) + })?; + + let target_sub_path = mindmap_id + .as_deref() + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(|value| format!("mindmaps/{value}")); + let id = new_asset_id(); + let kind = asset_type(&file.content_type); + let created = execute_convex_mutation_by_name( + state.config(), + &context, + "mediaAssets:createWithStorage", + json!({ + "userId": user_id, + "storageId": storage_id, + "targetSubPath": target_sub_path, + "asset": { + "id": id, + "workspace_id": workspace_id, + "document_id": document_id, + "asset_type": kind, + "file_name": file.name, + "file_size": file.bytes.len(), + "mime_type": file.content_type, + } + }), + Some(&workspace_id), + None, + "media_upload_create_asset", + ) + .await?; + + let asset_id = created + .get("id") + .and_then(Value::as_str) + .unwrap_or_default() + .to_string(); + Ok(Json(json!({ + "asset": created, + "mindmapUrl": format!("asset:{asset_id}"), + })) + .into_response()) +} + +pub async fn filetree_upload_target_preflight( + Extension(context): Extension, + Json(payload): Json, +) -> Result { + let rows = payload.rows.unwrap_or_default(); + let document_workspaces = payload.document_workspaces.unwrap_or_default(); + let fallback_workspace_id = trim_string(payload.workspace_id.as_ref()); + let target_row_document_id = document_for_target_row( + trim_string(payload.target_row_id.as_ref()).as_deref(), + &rows, + ); + let document_id = trim_string(payload.target_document_id.as_ref()) + .or(target_row_document_id) + .or_else(|| { + trim_string(payload.focused_row_id.as_ref()) + .and_then(|row_id| document_for_target_row(Some(&row_id), &rows)) + }) + .or_else(|| trim_string(payload.active_document_id.as_ref())) + .ok_or_else(|| { + WebError::bad_request_code( + "filetree_upload_target_document_missing", + "请选择一个目标页面后再上传文件", + ) + })?; + let workspace_id = workspace_for_document( + &document_id, + fallback_workspace_id + .as_deref() + .or(context.workspace.workspace_id.as_deref()), + &document_workspaces, + ) + .ok_or_else(|| { + WebError::bad_request_code( + "filetree_upload_target_workspace_missing", + "缺少 workspaceId", + ) + })?; + let plan = FileTreeUploadTargetPlan { + workspace_id, + target_document_id: document_id, + target_mindmap_id: None, + target_sub_path: None, + }; + Ok(Json(json!({ + "requestId": context.trace.request_id, + "traceId": context.trace.trace_id, + "plan": plan, + })) + .into_response()) +} + +pub async fn sign( + State(state): State, + Extension(context): Extension, + Query(query): Query, + headers: HeaderMap, +) -> Result { + let asset_id = query + .asset_id + .as_deref() + .map(str::trim) + .filter(|value| !value.is_empty()) + .ok_or_else(|| WebError::bad_request_code("media_sign_asset_missing", "缺少 assetId"))?; + let user_id = current_user_id(&state, &context).await; + let asset = execute_convex_query_by_name( + state.config(), + &context, + "mediaAssets:getById", + json!({ "userId": user_id, "id": asset_id }), + None, + "media_sign_get_asset", + ) + .await?; + if asset.is_null() { + return Err(WebError::new( + axum::http::StatusCode::NOT_FOUND, + "media_asset_not_found", + "资源不存在", + )); + } + let refreshed = execute_convex_mutation_by_name( + state.config(), + &context, + "mediaAssets:refreshUrl", + json!({ "userId": user_id, "id": asset_id }), + None, + None, + "media_sign_refresh_url", + ) + .await?; + let signed_url = refreshed + .get("signedUrl") + .and_then(Value::as_str) + .map(str::trim) + .filter(|value| !value.is_empty()) + .ok_or_else(|| WebError::bad_gateway_code("media_sign_url_missing", "生成签名链接失败"))?; + + Ok(Json(json!({ + "signedUrl": proxied_file_url(&headers, signed_url), + "asset": { + "id": asset.get("id").cloned().unwrap_or(Value::Null), + "document_id": asset.get("document_id").cloned().unwrap_or(Value::Null), + "workspace_id": asset.get("workspace_id").cloned().unwrap_or(Value::Null), + "file_name": asset.get("file_name").cloned().unwrap_or(Value::Null), + "mime_type": asset.get("mime_type").cloned().unwrap_or(Value::Null), + "file_size": asset.get("file_size").cloned().unwrap_or(Value::Null), + "storage_id": asset.get("storage_id").cloned().unwrap_or(Value::Null), + "updated_at": asset.get("updated_at").cloned().unwrap_or(Value::Null), + } + })) + .into_response()) +} diff --git a/rust/crates/mnote-web/src/routes/mod.rs b/rust/crates/mnote-web/src/routes/mod.rs index 067e91b5..07b37215 100644 --- a/rust/crates/mnote-web/src/routes/mod.rs +++ b/rust/crates/mnote-web/src/routes/mod.rs @@ -10,7 +10,9 @@ mod kernel; mod local_folder_source; mod local_folder_events; mod local_markdown_parser; +mod media; mod mindmap_shell; +mod onlyoffice; mod query_support; mod search; mod session; @@ -22,7 +24,7 @@ mod web_shell; mod ws; use crate::app::AppState; -use axum::routing::{get, post}; +use axum::routing::{any, get, post}; use axum::Router; pub fn build_router(state: AppState) -> Router { @@ -69,6 +71,19 @@ pub fn build_router(state: AppState) -> Router { .route("/api/auth/mnote-web-token", get(session::session)) .route("/api/auth/session/refresh", post(session::refresh_session)) .route("/api/ai-agent/run", post(compat::next_ai_agent_run)) + .route("/onlyoffice", get(onlyoffice::page)) + .route("/onlyoffice-server/{*path}", any(onlyoffice::server_proxy)) + .route("/cache/{*path}", any(onlyoffice::cache_proxy)) + .route("/api/onlyoffice/sign", post(onlyoffice::sign)) + .route("/api/onlyoffice/proxy", get(onlyoffice::proxy)) + .route("/api/onlyoffice/callback", post(onlyoffice::callback)) + .route("/api/onlyoffice/forcesave", post(onlyoffice::forcesave)) + .route("/api/media/upload", post(media::upload)) + .route("/api/media/sign", get(media::sign)) + .route( + "/api/tree/filetree/upload-target-preflight", + post(media::filetree_upload_target_preflight), + ) .route("/api/documents/meta", get(documents::meta)) .route("/api/documents/content", get(documents::content)) .route("/api/documents/page", get(web_shell::documents_page_compat)) diff --git a/rust/crates/mnote-web/src/routes/onlyoffice.rs b/rust/crates/mnote-web/src/routes/onlyoffice.rs new file mode 100644 index 00000000..d3673efc --- /dev/null +++ b/rust/crates/mnote-web/src/routes/onlyoffice.rs @@ -0,0 +1,1006 @@ +use crate::app::AppState; +use crate::error::WebError; +use adapter_onlyoffice::{prepare_proxy_request, sign_config, OnlyOfficeProxyPreparationInput}; +use axum::body::{Body, Bytes}; +use axum::extract::{Path, Query, State}; +use axum::http::{header, HeaderMap, Method, Request, Uri}; +use axum::response::{Html, IntoResponse, Response}; +use axum::Json; +use serde::Deserialize; +use serde_json::{json, Value}; +use std::env; +use std::fs; +use std::time::Duration; + +const ONLYOFFICE_PROBE_PATH: &str = "/web-apps/apps/api/documents/api.js"; +const DEFAULT_ONLYOFFICE_INTERNAL_URL: &str = "http://127.0.0.1:8082"; +const ONLYOFFICE_RUNTIME_REWRITE_SNIPPET: &str = r#""#; + +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct OnlyOfficePageQuery { + file_url: Option, + file_name: Option, + file_type: Option, + asset_id: Option, + document_id: Option, + user_id: Option, + mode: Option, +} + +#[derive(Debug, Deserialize)] +pub struct OnlyOfficeProxyQuery { + u: Option, +} + +#[derive(Debug, Deserialize)] +pub struct OnlyOfficeCallbackQuery { + #[serde(rename = "assetId")] + asset_id: Option, + #[serde(rename = "userId")] + user_id: Option, +} + +#[derive(Debug, Deserialize)] +pub struct OnlyOfficeForcesaveQuery { + #[serde(rename = "assetId")] + asset_id: Option, + key: Option, +} + +#[derive(Debug, Deserialize)] +pub struct OnlyOfficeSignPayload { + config: Option, +} + +fn env_or_dotenv(key: &str) -> Option { + if let Ok(value) = env::var(key) { + let trimmed = value.trim().trim_matches('"').to_string(); + if !trimmed.is_empty() { + return Some(trimmed); + } + } + + let root = std::path::Path::new(env!("CARGO_MANIFEST_DIR")) + .join("../../..") + .join(".env.all"); + let content = fs::read_to_string(root).ok()?; + for line in content.lines() { + let line = line.trim_end_matches('\r'); + if line.starts_with('#') || line.trim().is_empty() { + continue; + } + let Some((k, v)) = line.split_once('=') else { + continue; + }; + if k.trim() != key { + continue; + } + let trimmed = v.trim().trim_matches('"').to_string(); + if !trimmed.is_empty() { + return Some(trimmed); + } + } + None +} + +fn normalize_http_origin(raw: &str) -> Option { + let value = raw.trim().trim_end_matches('/'); + if value.is_empty() || value == "/onlyoffice-server" { + return None; + } + let url = reqwest::Url::parse(value).ok()?; + if url.scheme() != "http" && url.scheme() != "https" { + return None; + } + Some(url.to_string().trim_end_matches('/').to_string()) +} + +fn onlyoffice_internal_candidates() -> Vec { + let mut candidates = Vec::new(); + let mut push = |value: Option| { + let Some(value) = value else { + return; + }; + let Some(normalized) = normalize_http_origin(&value) else { + return; + }; + if !candidates.contains(&normalized) { + candidates.push(normalized); + } + }; + + push(env_or_dotenv("ONLYOFFICE_INTERNAL_URL")); + if let Some(raw) = env_or_dotenv("ONLYOFFICE_INTERNAL_URL_CANDIDATES") { + for value in raw.split(',') { + push(Some(value.to_string())); + } + } + push(Some(DEFAULT_ONLYOFFICE_INTERNAL_URL.into())); + push(Some("http://127.0.0.1:8081".into())); + push(Some("http://localhost:8082".into())); + push(Some("http://localhost:8081".into())); + if candidates.is_empty() { + candidates.push(DEFAULT_ONLYOFFICE_INTERNAL_URL.into()); + } + candidates +} + +async fn resolve_onlyoffice_internal_url() -> String { + let client = reqwest::Client::builder() + .timeout(Duration::from_millis(2_500)) + .build() + .unwrap_or_else(|_| reqwest::Client::new()); + let candidates = onlyoffice_internal_candidates(); + for candidate in &candidates { + let probe_url = format!("{candidate}{ONLYOFFICE_PROBE_PATH}"); + if client + .head(probe_url) + .send() + .await + .map(|response| response.status().is_success()) + .unwrap_or(false) + { + return candidate.clone(); + } + } + candidates + .first() + .cloned() + .unwrap_or_else(|| DEFAULT_ONLYOFFICE_INTERNAL_URL.into()) +} + +fn escape_html(value: &str) -> String { + value + .replace('&', "&") + .replace('<', "<") + .replace('>', ">") + .replace('"', """) +} + +fn json_string(value: &str) -> String { + serde_json::to_string(value).unwrap_or_else(|_| "\"\"".into()) +} + +fn header_value(headers: &HeaderMap, name: &str) -> Option { + headers + .get(name) + .and_then(|value| value.to_str().ok()) + .map(str::trim) + .filter(|value| !value.is_empty()) + .map(ToOwned::to_owned) +} + +fn forwarded_public_origin(headers: &HeaderMap) -> (String, String, String) { + let origin_like = header_value(headers, "origin") + .or_else(|| header_value(headers, "referer")) + .and_then(|value| reqwest::Url::parse(&value).ok()); + let forwarded_host_raw = header_value(headers, "x-forwarded-host") + .or_else(|| header_value(headers, header::HOST.as_str())) + .or_else(|| { + origin_like.as_ref().map(|url| match url.port() { + Some(port) => format!("{}:{port}", url.host_str().unwrap_or_default()), + None => url.host_str().unwrap_or_default().to_string(), + }) + }) + .unwrap_or_else(|| "127.0.0.1:3000".into()); + let forwarded_host = forwarded_host_raw + .split(',') + .next() + .map(str::trim) + .filter(|value| !value.is_empty()) + .unwrap_or("127.0.0.1:3000") + .to_string(); + let forwarded_proto = header_value(headers, "x-forwarded-proto") + .and_then(|value| { + value + .split(',') + .next() + .map(str::trim) + .map(ToOwned::to_owned) + }) + .filter(|value| !value.is_empty()) + .or_else(|| origin_like.as_ref().map(|url| url.scheme().to_string())) + .unwrap_or_else(|| "http".into()); + let forwarded_port = header_value(headers, "x-forwarded-port") + .and_then(|value| { + value + .split(',') + .next() + .map(str::trim) + .map(ToOwned::to_owned) + }) + .filter(|value| !value.is_empty()) + .or_else(|| { + forwarded_host + .rsplit(':') + .next() + .filter(|value| value.chars().all(|ch| ch.is_ascii_digit())) + .map(ToOwned::to_owned) + }) + .unwrap_or_else(|| { + if forwarded_proto == "https" { + "443".into() + } else { + "80".into() + } + }); + (forwarded_host, forwarded_proto, forwarded_port) +} + +pub async fn page(Query(query): Query) -> Result { + let file_url = query.file_url.unwrap_or_default(); + let file_name = query.file_name.unwrap_or_else(|| "附件".into()); + let file_type = query.file_type.unwrap_or_else(|| "docx".into()); + let asset_id = query.asset_id.unwrap_or_default(); + let document_id = query.document_id.unwrap_or_default(); + let user_id = query.user_id.unwrap_or_default(); + let mode = match query.mode.as_deref() { + Some("view") => "view", + _ => "edit", + }; + + let html = format!( + r#" + + + + + {title} + + + +
+

ONLYOFFICE 加载失败

+ + +"#, + title = escape_html(&file_name), + file_url = json_string(&file_url), + file_name = json_string(&file_name), + file_type = json_string(&file_type), + asset_id = json_string(&asset_id), + document_id = json_string(&document_id), + user_id = json_string(&user_id), + mode = json_string(mode), + ); + + Ok(Html(html).into_response()) +} + +pub async fn sign(Json(payload): Json) -> Result { + let config = payload.config.ok_or_else(|| { + WebError::bad_request_code("onlyoffice_sign_config_missing", "缺少 config") + })?; + let secret = env_or_dotenv("ONLYOFFICE_JWT_SECRET").unwrap_or_default(); + let tokens = sign_config(&config, &secret) + .map_err(|error| WebError::internal(format!("OnlyOffice 签名失败: {error}")))?; + Ok(Json(tokens).into_response()) +} + +fn proxy_origin_env(key: &str) -> Option { + env_or_dotenv(key).and_then(|value| normalize_http_origin(&value)) +} + +pub async fn proxy( + Query(query): Query, + headers: HeaderMap, + method: Method, +) -> Result { + let encoded_url = query + .u + .as_deref() + .map(str::trim) + .filter(|value| !value.is_empty()) + .ok_or_else(|| WebError::bad_request_code("onlyoffice_proxy_url_missing", "缺少 u"))?; + let prepared = prepare_proxy_request(OnlyOfficeProxyPreparationInput { + encoded_url: encoded_url.to_string(), + method: method.as_str().to_string(), + range: headers + .get(header::RANGE) + .and_then(|value| value.to_str().ok()) + .map(ToOwned::to_owned), + supabase_url: proxy_origin_env("NEXT_PUBLIC_SUPABASE_URL") + .or_else(|| proxy_origin_env("SUPABASE_URL")), + supabase_internal_url: proxy_origin_env("SUPABASE_INTERNAL_URL"), + onlyoffice_storage_host_override: env_or_dotenv( + "NEXT_PUBLIC_ONLYOFFICE_STORAGE_HOST_OVERRIDE", + ), + convex_origin: proxy_origin_env("CONVEX_SELF_HOSTED_URL") + .or_else(|| proxy_origin_env("NEXT_PUBLIC_CONVEX_URL")), + supabase_anon_key: env_or_dotenv("NEXT_PUBLIC_SUPABASE_ANON_KEY") + .or_else(|| env_or_dotenv("SUPABASE_ANON_KEY")), + }) + .map_err(|error| WebError::bad_request_code("onlyoffice_proxy_prepare_failed", error))?; + + let client = reqwest::Client::new(); + let mut request = client.request( + reqwest::Method::from_bytes(method.as_str().as_bytes()).unwrap_or(reqwest::Method::GET), + &prepared.target_url, + ); + for item in prepared.forward_headers { + request = request.header(item.name, item.value); + } + let upstream = request.send().await.map_err(|error| { + WebError::bad_gateway_code( + "onlyoffice_proxy_fetch_failed", + format!("回源下载失败: {error}"), + ) + })?; + let status = upstream.status(); + let mut response_headers = HeaderMap::new(); + for (name, value) in upstream.headers() { + if name == header::SET_COOKIE { + continue; + } + response_headers.insert(name, value.clone()); + } + if method == Method::HEAD { + let mut response = Response::new(Body::empty()); + *response.status_mut() = status; + *response.headers_mut() = response_headers; + return Ok(response); + } + let bytes = upstream.bytes().await.map_err(|error| { + WebError::bad_gateway_code( + "onlyoffice_proxy_body_failed", + format!("读取回源文件失败: {error}"), + ) + })?; + let mut response = Response::new(Body::from(bytes)); + *response.status_mut() = status; + *response.headers_mut() = response_headers; + Ok(response) +} + +pub async fn callback( + Query(query): Query, + Json(body): Json, +) -> Response { + let status = body + .get("status") + .and_then(Value::as_i64) + .unwrap_or_default(); + tracing::info!( + asset_id = query.asset_id.as_deref().unwrap_or(""), + user_id = query.user_id.as_deref().unwrap_or(""), + status, + "OnlyOffice callback received by mnote-web" + ); + Json(json!({ "error": 0 })).into_response() +} + +pub async fn forcesave( + Query(query): Query, +) -> Result { + let asset_id = query + .asset_id + .as_deref() + .map(str::trim) + .filter(|value| !value.is_empty()) + .ok_or_else(|| { + WebError::bad_request_code("onlyoffice_forcesave_asset_missing", "缺少 assetId") + })?; + let key = query + .key + .as_deref() + .map(str::trim) + .filter(|value| !value.is_empty()) + .ok_or_else(|| { + WebError::bad_request_code("onlyoffice_forcesave_key_missing", "缺少 key") + })?; + Ok(Json(json!({ + "ok": true, + "via": "mnote-web-rust-noop", + "assetId": asset_id, + "key": key, + })) + .into_response()) +} + +fn append_path_and_query(base: &str, path: &str, query: Option<&str>) -> String { + let mut target = format!( + "{}/{}", + base.trim_end_matches('/'), + path.trim_start_matches('/') + ); + if let Some(query) = query.filter(|value| !value.is_empty()) { + target.push('?'); + target.push_str(query); + } + target +} + +fn request_body_bytes( + request: Request, +) -> impl std::future::Future> { + async move { + axum::body::to_bytes(request.into_body(), 32 * 1024 * 1024) + .await + .map_err(|error| { + WebError::bad_request_code( + "onlyoffice_server_body_failed", + format!("读取请求体失败: {error}"), + ) + }) + } +} + +fn inject_onlyoffice_html_fixups(body: &str) -> String { + if body.contains("window.__MNOTE_ONLYOFFICE_XHR_REWRITE__") { + return body.to_string(); + } + body.replacen( + "", + &format!("\n{}\n", ONLYOFFICE_RUNTIME_REWRITE_SNIPPET), + 1, + ) +} + +fn strip_hop_by_hop_headers(headers: &mut HeaderMap) { + for name in [ + header::CONNECTION, + header::CONTENT_ENCODING, + header::CONTENT_LENGTH, + header::HeaderName::from_static("keep-alive"), + header::HeaderName::from_static("proxy-authenticate"), + header::HeaderName::from_static("proxy-authorization"), + header::TE, + header::TRAILER, + header::TRANSFER_ENCODING, + header::UPGRADE, + ] { + headers.remove(name); + } +} + +async fn proxy_onlyoffice_path( + upstream_prefix: &str, + upstream_path: &str, + uri: Uri, + method: Method, + headers: HeaderMap, + request: Request, +) -> Result { + let base = resolve_onlyoffice_internal_url().await; + let prefix = upstream_prefix.trim_matches('/'); + let normalized_path = upstream_path.trim_start_matches('/'); + let is_cache_path = prefix == "cache" || normalized_path.starts_with("cache/"); + let target_base = if prefix.is_empty() { + base.clone() + } else { + format!("{}/{}", base.trim_end_matches('/'), prefix) + }; + let target = append_path_and_query(&target_base, upstream_path, uri.query()); + let target_origin = reqwest::Url::parse(&base).ok(); + let body = request_body_bytes(request).await?; + let client = reqwest::Client::new(); + let mut builder = client.request( + reqwest::Method::from_bytes(method.as_str().as_bytes()).unwrap_or(reqwest::Method::GET), + target, + ); + for (name, value) in headers.iter() { + if matches!( + name.as_str(), + "host" + | "connection" + | "upgrade" + | "sec-websocket-key" + | "sec-websocket-version" + | "accept-encoding" + ) { + continue; + } + builder = builder.header(name, value); + } + // 说明:部分 ONLYOFFICE HTML 需要注入同源代理补丁。这里强制回源明文, + // 避免 gzip 字节被当成 text/html 注入后在 iframe 中显示乱码。 + builder = builder.header(header::ACCEPT_ENCODING, "identity"); + if let Some(base_url) = target_origin.as_ref() { + builder = builder.header(header::HOST, base_url.host_str().unwrap_or("127.0.0.1")); + } + let (forwarded_host, forwarded_proto, forwarded_port) = forwarded_public_origin(&headers); + builder = builder + .header("x-forwarded-host", forwarded_host) + .header("x-forwarded-proto", forwarded_proto) + .header("x-forwarded-port", forwarded_port) + .header("x-forwarded-prefix", "/onlyoffice-server"); + if method != Method::GET && method != Method::HEAD { + builder = builder.body(body); + } + let upstream = builder.send().await.map_err(|error| { + WebError::bad_gateway_code( + "onlyoffice_server_proxy_failed", + format!("OnlyOffice 代理失败: {error}"), + ) + })?; + let status = upstream.status(); + let upstream_headers = upstream.headers().clone(); + let mut response_headers = HeaderMap::new(); + for (name, value) in upstream_headers.iter() { + if name == header::SET_COOKIE { + continue; + } + response_headers.insert(name, value.clone()); + } + if method == Method::HEAD { + if is_cache_path { + let upstream_content_length = upstream_headers.get(header::CONTENT_LENGTH).cloned(); + strip_hop_by_hop_headers(&mut response_headers); + if let Some(content_length) = upstream_content_length { + response_headers.insert(header::CONTENT_LENGTH, content_length); + } + } + let mut response = Response::new(Body::empty()); + *response.status_mut() = status; + *response.headers_mut() = response_headers; + return Ok(response); + } + let bytes = upstream.bytes().await.map_err(|error| { + WebError::bad_gateway_code( + "onlyoffice_server_proxy_body_failed", + format!("读取 OnlyOffice 响应失败: {error}"), + ) + })?; + let maybe_html = upstream_headers + .get(header::CONTENT_TYPE) + .and_then(|value| value.to_str().ok()) + .map(str::to_ascii_lowercase) + .map(|value| value.contains("text/html")) + .unwrap_or(false); + let mut response = if maybe_html { + let html = String::from_utf8_lossy(&bytes); + let body = inject_onlyoffice_html_fixups(&html); + strip_hop_by_hop_headers(&mut response_headers); + response_headers.insert( + header::CACHE_CONTROL, + header::HeaderValue::from_static("no-store"), + ); + response_headers.insert( + header::CONTENT_LENGTH, + header::HeaderValue::from_str(&body.as_bytes().len().to_string()) + .unwrap_or_else(|_| header::HeaderValue::from_static("0")), + ); + Response::new(Body::from(body)) + } else { + if is_cache_path { + strip_hop_by_hop_headers(&mut response_headers); + response_headers.insert( + header::CONTENT_LENGTH, + header::HeaderValue::from_str(&bytes.len().to_string()) + .unwrap_or_else(|_| header::HeaderValue::from_static("0")), + ); + } + Response::new(Body::from(bytes)) + }; + *response.status_mut() = status; + *response.headers_mut() = response_headers; + Ok(response) +} + +pub async fn server_proxy( + State(_state): State, + Path(path): Path, + uri: Uri, + method: Method, + headers: HeaderMap, + request: Request, +) -> Result { + proxy_onlyoffice_path("", &path, uri, method, headers, request).await +} + +pub async fn cache_proxy( + State(_state): State, + Path(path): Path, + uri: Uri, + method: Method, + headers: HeaderMap, + request: Request, +) -> Result { + proxy_onlyoffice_path("cache", &path, uri, method, headers, request).await +} + +#[cfg(test)] +pub fn stable_doc_key(asset_id: &str, storage_id: &str, file_url: &str, file_name: &str) -> String { + if !asset_id.trim().is_empty() { + if storage_id.trim().is_empty() { + return asset_id.trim().to_string(); + } + return format!("{}_{}", asset_id.trim(), js_hash_abs(storage_id)); + } + js_hash_abs(&format!("{file_url}-{file_name}")) +} + +#[cfg(test)] +fn js_hash_abs(input: &str) -> String { + let mut hash: i32 = 0; + for unit in input.encode_utf16() { + hash = hash + .wrapping_shl(5) + .wrapping_sub(hash) + .wrapping_add(unit as i32); + } + hash.abs().to_string() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn stable_doc_key_uses_onlyoffice_safe_characters() { + let key = stable_doc_key("asset_1", "kg2abc:def", "", ""); + assert!(key.len() <= 128); + assert!(key + .chars() + .all(|ch| ch.is_ascii_alphanumeric() || matches!(ch, '_' | '.' | '=' | '-'))); + assert!(key.starts_with("asset_1_")); + } + + #[test] + fn onlyoffice_internal_candidates_keep_default_first_after_env() { + let candidates = onlyoffice_internal_candidates(); + assert!(candidates.contains(&DEFAULT_ONLYOFFICE_INTERNAL_URL.to_string())); + } +} diff --git a/rust/crates/mnote-web/src/ssr/pages/layout.rs b/rust/crates/mnote-web/src/ssr/pages/layout.rs index 9a6bf8c5..146bc321 100644 --- a/rust/crates/mnote-web/src/ssr/pages/layout.rs +++ b/rust/crates/mnote-web/src/ssr/pages/layout.rs @@ -25,6 +25,8 @@ const SIDEBAR_TREE_JS: &str = r##" }; var projectionRefreshTimer = 0; var activeTreeContextMenu = null; + var activeEditorAttachmentLink = null; + var attachmentActionsHideTimer = 0; var pageUiState = { pageOptions: null, historySnapshots: [], @@ -1024,6 +1026,608 @@ const SIDEBAR_TREE_JS: &str = r##" window.dispatchEvent(new CustomEvent(name, { detail: detail })); } + function inferOnlyOfficeFileType(fileName, mimeType) { + var name = String(fileName || '').trim().toLowerCase(); + var mt = String(mimeType || '').trim().toLowerCase(); + var ext = name.indexOf('.') >= 0 ? name.split('.').pop() : ''; + if (['doc', 'docx', 'odt', 'rtf'].indexOf(ext) >= 0) return ext; + if (['ppt', 'pptx', 'odp'].indexOf(ext) >= 0) return ext; + if (['xls', 'xlsx', 'ods', 'csv'].indexOf(ext) >= 0) return ext; + if (ext === 'pdf') return ext; + if (mt.indexOf('wordprocessingml') >= 0) return 'docx'; + if (mt.indexOf('presentationml') >= 0) return 'pptx'; + if (mt.indexOf('spreadsheetml') >= 0) return 'xlsx'; + if (mt.indexOf('pdf') >= 0) return 'pdf'; + return ''; + } + + function buildOnlyOfficeOpenUrl(input) { + var target = new URL('/onlyoffice', window.location.origin); + target.searchParams.set('fileUrl', input.fileUrl || ''); + target.searchParams.set('fileName', input.fileName || '未命名资源'); + target.searchParams.set('fileType', input.fileType || 'docx'); + if (input.assetId) target.searchParams.set('assetId', input.assetId); + if (input.documentId) target.searchParams.set('documentId', input.documentId); + if (input.userId) target.searchParams.set('userId', input.userId); + target.searchParams.set('mode', input.mode || 'edit'); + return target.toString(); + } + + function buildOnlyOfficeOpenPath(input) { + var params = new URLSearchParams(); + params.set('fileUrl', input.fileUrl || ''); + params.set('fileName', input.fileName || '未命名资源'); + params.set('fileType', input.fileType || 'docx'); + if (input.assetId) params.set('assetId', input.assetId); + if (input.documentId) params.set('documentId', input.documentId); + if (input.userId) params.set('userId', input.userId); + params.set('mode', input.mode || 'edit'); + return '/onlyoffice?' + params.toString(); + } + + async function fetchCurrentOnlyOfficeUserId() { + try { + var response = await fetch('/api/auth/whoami', { + method: 'GET', + credentials: 'include', + cache: 'no-store' + }); + var payload = await response.json().catch(function() { return null; }); + return String(payload && payload.userId || '').trim(); + } catch (_error) { + return ''; + } + } + + async function openConvexAssetFromFileTree(detail) { + var assetId = String(detail && detail.assetId || '').trim(); + if (!assetId) return; + try { + var response = await fetch('/api/media/sign?assetId=' + encodeURIComponent(assetId), { + method: 'GET', + credentials: 'include' + }); + var payload = await response.json().catch(function() { return null; }); + if (!response.ok) { + throw new Error(payload && payload.error ? payload.error : '生成签名链接失败'); + } + var asset = payload && payload.asset && typeof payload.asset === 'object' ? payload.asset : {}; + var fileUrl = String(payload && payload.signedUrl || asset.file_url || asset.signed_url || '').trim(); + if (!fileUrl) throw new Error('附件链接不可用'); + var fileName = String(asset.file_name || detail.fileName || '未命名资源').trim() || '未命名资源'; + var fileType = inferOnlyOfficeFileType(fileName, asset.mime_type); + if (fileType) { + var userId = await fetchCurrentOnlyOfficeUserId(); + window.open(buildOnlyOfficeOpenUrl({ + fileUrl: fileUrl, + fileName: fileName, + fileType: fileType, + assetId: assetId, + documentId: String(asset.document_id || detail.documentId || '').trim(), + userId: userId, + mode: 'edit' + }), '_blank', 'noopener,noreferrer'); + return; + } + window.open(fileUrl, '_blank', 'noopener,noreferrer'); + } catch (error) { + window.alert(error && error.message ? error.message : '打开附件失败'); + } + } + + window.addEventListener('tree.asset.open', function(event) { + void openConvexAssetFromFileTree(event.detail || {}); + }); + + function fileTreeRowsForUploadPreflight() { + return Array.from(document.querySelectorAll('.tree-row[data-shell-mode="filetree"]')).map(function(row) { + return { + rowId: row.getAttribute('data-row-id') || '', + rowKind: row.getAttribute('data-row-kind') || '', + documentId: row.getAttribute('data-document-id') || row.getAttribute('data-doc-id') || null, + assetId: row.getAttribute('data-asset-id') || null, + assetDocumentId: row.getAttribute('data-document-id') || row.getAttribute('data-doc-id') || null, + assetType: row.querySelector('.tree-kind-badge') ? row.querySelector('.tree-kind-badge').getAttribute('data-kind') : null, + storagePath: null + }; + }).filter(function(row) { + return row.rowId || row.documentId || row.assetId; + }); + } + + function fileTreeDocumentWorkspacesForUploadPreflight(workspaceId) { + var seen = new Set(); + return fileTreeRowsForUploadPreflight().filter(function(row) { + if (!row.documentId || seen.has(row.documentId)) return false; + seen.add(row.documentId); + return true; + }).map(function(row) { + return { documentId: row.documentId, workspaceId: workspaceId || null }; + }); + } + + async function preflightFileTreeUploadTarget(detail) { + var workspaceId = String(detail && detail.workspaceId || resolveWorkspaceId(document.body) || '').trim(); + var body = { + workspaceId: workspaceId || null, + targetDocumentId: detail && detail.documentId ? String(detail.documentId) : null, + targetRowId: detail && detail.targetRowId ? String(detail.targetRowId) : null, + focusedRowId: sidebarFileTreeSelection.focusedRowId || null, + activeDocumentId: currentDocumentId() || null, + rows: fileTreeRowsForUploadPreflight(), + documentWorkspaces: fileTreeDocumentWorkspacesForUploadPreflight(workspaceId) + }; + var response = await fetch('/api/tree/filetree/upload-target-preflight', { + method: 'POST', + credentials: 'include', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify(body) + }); + var payload = await response.json().catch(function() { return null; }); + if (!response.ok || !payload || !payload.plan) { + throw new Error(payload && payload.error ? payload.error : '文件树上传目标预检失败'); + } + return payload.plan; + } + + function fallbackFileTreeUploadTarget(detail) { + var workspaceId = String(detail && detail.workspaceId || resolveWorkspaceId(document.body) || '').trim(); + var documentId = String(detail && detail.documentId || currentDocumentId() || '').trim(); + if (!workspaceId || !documentId) { + throw new Error('请选择一个目标页面后再拖入文件'); + } + return { + workspaceId: workspaceId, + targetDocumentId: documentId, + targetMindmapId: null, + targetSubPath: null + }; + } + + async function resolveFileTreeUploadTarget(detail) { + try { + return await preflightFileTreeUploadTarget(detail || {}); + } catch (error) { + console.warn('[mnote upload] upload target preflight fallback', error); + return fallbackFileTreeUploadTarget(detail || {}); + } + } + + function uploadedAssetTitle(asset) { + return String(asset && (asset.file_name || asset.title || asset.name) || '未命名附件').trim() || '未命名附件'; + } + + function uploadedAssetUrl(asset) { + return String(asset && (asset.file_url || asset.signedUrl || asset.signed_url || asset.thumbnail_url) || '').trim(); + } + + function uploadedAssetType(asset) { + return String(asset && (asset.asset_type || asset.assetType || asset.mime_type || '') || '').trim(); + } + + function uploadedAssetExtension(asset) { + var match = uploadedAssetTitle(asset).toLowerCase().match(/\.([a-z0-9]+)$/); + return match ? match[1] : ''; + } + + function attachmentClassForFileName(fileName) { + var name = String(fileName || '').trim().toLowerCase(); + var ext = name.indexOf('.') >= 0 ? name.split('.').pop() : ''; + if (['doc', 'docx', 'odt', 'rtf'].indexOf(ext) >= 0) return 'mnote-uploaded-attachment-row mnote-uploaded-attachment-word'; + if (['ppt', 'pptx', 'odp'].indexOf(ext) >= 0) return 'mnote-uploaded-attachment-row mnote-uploaded-attachment-ppt'; + if (['xls', 'xlsx', 'ods', 'csv'].indexOf(ext) >= 0) return 'mnote-uploaded-attachment-row mnote-uploaded-attachment-sheet'; + if (ext === 'pdf') return 'mnote-uploaded-attachment-row mnote-uploaded-attachment-pdf'; + return 'mnote-uploaded-attachment-row mnote-uploaded-attachment-file'; + } + + function uploadedAttachmentClass(asset) { + return attachmentClassForFileName(uploadedAssetTitle(asset)); + } + + function buildOnlyOfficeAssetOpenUrl(asset, userId) { + var title = uploadedAssetTitle(asset); + var fileType = inferOnlyOfficeFileType(title, asset && asset.mime_type); + if (!fileType) return ''; + var assetId = String(asset && asset.id || '').trim(); + return buildOnlyOfficeOpenUrl({ + fileUrl: assetId ? '' : uploadedAssetUrl(asset), + fileName: title, + fileType: fileType, + assetId: assetId, + documentId: String(asset && (asset.document_id || asset.documentId) || currentDocumentId() || '').trim(), + userId: userId || '', + mode: 'edit' + }); + } + + function uploadedFileSize(asset) { + var size = Number(asset && (asset.file_size || asset.fileSize) || 0); + if (!Number.isFinite(size) || size <= 0) return ''; + if (size >= 1024 * 1024) return (size / 1024 / 1024).toFixed(size >= 10 * 1024 * 1024 ? 1 : 2) + ' MB'; + if (size >= 1024) return (size / 1024).toFixed(size >= 100 * 1024 ? 0 : 2) + ' KB'; + return String(Math.round(size)) + ' B'; + } + + var attachmentMetaCache = Object.create(null); + var attachmentMetaPending = Object.create(null); + var legacyOfficeAttachmentIndex = null; + var legacyOfficeAttachmentIndexPending = null; + + function parseCurrentWorkspaceId() { + return (new URLSearchParams(window.location.search).get('workspaceId') || '').trim(); + } + + async function fetchLegacyOfficeAttachmentIndex() { + if (legacyOfficeAttachmentIndex) return legacyOfficeAttachmentIndex; + if (legacyOfficeAttachmentIndexPending) return legacyOfficeAttachmentIndexPending; + var documentId = currentDocumentId(); + var workspaceId = parseCurrentWorkspaceId(); + if (!documentId || !workspaceId) { + legacyOfficeAttachmentIndex = Object.create(null); + return legacyOfficeAttachmentIndex; + } + legacyOfficeAttachmentIndexPending = fetch( + '/api/tree/projections/file?documentId=' + encodeURIComponent(documentId) + '&workspaceId=' + encodeURIComponent(workspaceId), + { + method: 'GET', + credentials: 'include', + cache: 'no-store' + } + ).then(function(response) { + return response.json().catch(function() { return null; }).then(function(payload) { + var items = payload && payload.ok && payload.result && Array.isArray(payload.result.items) + ? payload.result.items + : []; + var index = Object.create(null); + items.forEach(function(item) { + if (!item || item.rowKind !== 'asset') return; + var title = String(item.title || '').trim(); + if (!title || index[title]) return; + var fileType = inferOnlyOfficeFileType(title, ''); + if (!fileType) return; + var rowId = String(item.rowId || '').trim(); + var assetId = String(item.assetId || '').trim(); + if (!assetId && rowId.indexOf('asset:') === 0) assetId = rowId.slice('asset:'.length); + if (!assetId) return; + index[title] = { + assetId: assetId, + fileName: title, + fileType: fileType, + documentId: documentId + }; + }); + legacyOfficeAttachmentIndex = index; + return index; + }); + }).catch(function() { + var empty = Object.create(null); + legacyOfficeAttachmentIndex = empty; + return empty; + }).finally(function() { + legacyOfficeAttachmentIndexPending = null; + }); + return legacyOfficeAttachmentIndexPending; + } + + async function healLegacyOfficeAttachmentParagraphs() { + var editor = document.querySelector('.editor-surface .ProseMirror'); + if (!(editor instanceof HTMLElement)) return; + var index = await fetchLegacyOfficeAttachmentIndex(); + var paragraphs = Array.from(editor.querySelectorAll('p')); + paragraphs.forEach(function(paragraph) { + if (!(paragraph instanceof HTMLParagraphElement)) return; + if (paragraph.querySelector('a, img, video, audio, table, iframe, canvas')) return; + if (paragraph.childNodes.length !== 1 || paragraph.firstChild?.nodeType !== Node.TEXT_NODE) return; + var fileName = String(paragraph.textContent || '').trim(); + if (!fileName) return; + var detail = index[fileName]; + if (!detail) return; + var link = document.createElement('a'); + link.textContent = fileName; + link.setAttribute('href', buildOnlyOfficeOpenPath({ + fileUrl: '', + fileName: detail.fileName, + fileType: detail.fileType, + assetId: detail.assetId, + documentId: detail.documentId || currentDocumentId() || '', + userId: '', + mode: 'edit' + })); + link.setAttribute('data-mnote-attachment-link', 'true'); + link.setAttribute('data-asset-id', detail.assetId); + attachmentClassForFileName(fileName).split(/\s+/).forEach(function(name) { + if (name) link.classList.add(name); + }); + paragraph.replaceChildren(link); + enhanceEditorAttachmentLink(link); + }); + } + + function applyEditorAttachmentMeta(link, meta) { + if (!(link instanceof HTMLAnchorElement) || !meta) return; + if (meta.assetId) link.setAttribute('data-asset-id', meta.assetId); + if (meta.fileSize) link.setAttribute('data-file-size', meta.fileSize); + } + + async function hydrateEditorAttachmentMeta(link) { + if (!(link instanceof HTMLAnchorElement)) return; + var detail = detailFromEditorAttachmentLink(link); + var assetId = String(detail && detail.assetId || '').trim(); + if (!assetId) return; + if (attachmentMetaCache[assetId]) { + applyEditorAttachmentMeta(link, attachmentMetaCache[assetId]); + return; + } + if (attachmentMetaPending[assetId]) { + try { await attachmentMetaPending[assetId]; } catch (_) {} + applyEditorAttachmentMeta(link, attachmentMetaCache[assetId]); + return; + } + attachmentMetaPending[assetId] = fetch('/api/media/sign?assetId=' + encodeURIComponent(assetId), { + method: 'GET', + credentials: 'include', + cache: 'no-store' + }).then(function(response) { + return response.json().catch(function() { return null; }).then(function(payload) { + if (!response.ok || !payload) return null; + var asset = payload.asset && typeof payload.asset === 'object' ? payload.asset : {}; + var meta = { + assetId: assetId, + fileSize: uploadedFileSize(asset) + }; + attachmentMetaCache[assetId] = meta; + return meta; + }); + }).catch(function() { + return null; + }).finally(function() { + delete attachmentMetaPending[assetId]; + }); + try { + var meta = await attachmentMetaPending[assetId]; + applyEditorAttachmentMeta(link, meta); + } catch (_) {} + } + + function revealFileTreeRow(row) { + if (!(row instanceof HTMLElement)) return; + var node = row.closest('.tree-node'); + while (node && node.parentElement) { + if (node.parentElement.classList && node.parentElement.classList.contains('tree-children')) { + node.parentElement.classList.remove('tree-children--collapsed'); + var parentNode = node.parentElement.closest('.tree-node'); + var parentRow = parentNode ? parentNode.querySelector(':scope > .tree-row') : null; + if (parentRow instanceof HTMLElement) { + parentRow.setAttribute('aria-expanded', 'true'); + var toggle = parentRow.querySelector('[data-rust-action="toggle"]'); + if (toggle) toggle.setAttribute('aria-expanded', 'true'); + } + } + node = node.parentElement.closest('.tree-node'); + } + try { row.scrollIntoView({ block: 'nearest' }); } catch (_) {} + } + + function revealFileTreeAssetRow(assetId) { + if (!assetId) return false; + var row = document.querySelector('.tree-row[data-shell-mode="filetree"][data-asset-id="' + cssEscape(assetId) + '"]'); + if (!(row instanceof HTMLElement)) return false; + revealFileTreeRow(row); + return true; + } + + function appendUploadedAssetRow(asset, documentId) { + var assetId = String(asset && asset.id || '').trim(); + if (!assetId) return; + if (revealFileTreeAssetRow(assetId)) return; + var targetDocumentId = String(documentId || asset.document_id || asset.documentId || currentDocumentId() || '').trim(); + var parentRow = targetDocumentId + ? document.querySelector('.tree-row[data-shell-mode="filetree"][data-row-id="' + cssEscape('doc:' + targetDocumentId) + '"]') + : null; + if (!parentRow) parentRow = document.querySelector('.tree-row[data-shell-mode="filetree"][data-row-kind="document"]'); + var root = document.querySelector('#sidebar-file-tree-root .tree-root'); + if (!root && !parentRow) return; + var parentLi = parentRow ? parentRow.closest('.tree-node') : null; + var children = parentLi ? parentLi.querySelector(':scope > .tree-children') : null; + if (parentLi && !children) { + children = document.createElement('ul'); + children.className = 'tree-children'; + parentLi.appendChild(children); + } + if (children) { + children.classList.remove('tree-children--collapsed'); + if (parentRow) { + parentRow.setAttribute('aria-expanded', 'true'); + var toggle = parentRow.querySelector('[data-rust-action="toggle"]'); + if (toggle) toggle.setAttribute('aria-expanded', 'true'); + } + } + var container = children || root; + var li = document.createElement('li'); + li.className = 'tree-node'; + li.setAttribute('data-node-id', 'asset:' + assetId); + var title = uploadedAssetTitle(asset); + var iconKind = uploadedAssetType(asset) || 'file'; + li.innerHTML = + ''; + container.appendChild(li); + revealFileTreeRow(li.querySelector('.tree-row')); + document.documentElement.setAttribute('data-mnote-last-upload-asset-id', assetId); + } + + async function insertUploadedAssetIntoEditor(asset) { + var editorRoot = document.querySelector('.editor-surface .ProseMirror'); + var editor = editorRoot && editorRoot.editor; + if (!editor || !editor.chain) return false; + var title = uploadedAssetTitle(asset); + var url = uploadedAssetUrl(asset); + var type = uploadedAssetType(asset); + var assetId = String(asset && asset.id || '').trim(); + var sizeLabel = uploadedFileSize(asset); + try { + if (type === 'image' && url) { + return editor.chain().focus().setImage({ src: url, alt: title, title: title }).run() === true; + } + var userId = ''; + var onlyOfficeUrl = buildOnlyOfficeAssetOpenUrl(asset, userId); + if (onlyOfficeUrl && assetId) { + userId = await fetchCurrentOnlyOfficeUserId(); + onlyOfficeUrl = buildOnlyOfficeAssetOpenUrl(asset, userId); + } + var href = onlyOfficeUrl || url; + if (href) { + var storedHref = onlyOfficeUrl + ? buildOnlyOfficeOpenPath({ + fileUrl: '', + fileName: title, + fileType: inferOnlyOfficeFileType(title, asset && asset.mime_type) || 'docx', + assetId: assetId, + documentId: String(asset && (asset.document_id || asset.documentId) || currentDocumentId() || '').trim(), + userId: userId || '', + mode: 'edit' + }) + : href; + var inserted = editor.chain().focus().insertContent({ + type: 'paragraph', + content: [{ + type: 'text', + text: title, + marks: [{ + type: 'link', + attrs: { + href: storedHref, + target: '_blank', + rel: 'noopener noreferrer nofollow', + class: uploadedAttachmentClass(asset) + } + }] + }] + }).run() === true; + window.setTimeout(function() { + enhanceEditorAttachmentLinks(); + var selector = assetId + ? '.editor-surface .ProseMirror a[href*="' + cssEscape(assetId) + '"]' + : '.editor-surface .ProseMirror a'; + var link = document.querySelector(selector); + if (link instanceof HTMLElement) { + link.setAttribute('data-mnote-attachment-link', 'true'); + if (assetId) link.setAttribute('data-asset-id', assetId); + if (sizeLabel) link.setAttribute('data-file-size', sizeLabel); + } + }, 0); + return inserted; + } + } catch (error) { + console.warn('[mnote upload] insert uploaded asset failed', error); + } + return false; + } + + async function uploadFileToMediaAsset(file, plan, options) { + var form = new FormData(); + form.append('file', file); + form.append('workspaceId', plan.workspaceId); + form.append('documentId', plan.targetDocumentId); + if (plan.targetMindmapId) form.append('mindmapId', plan.targetMindmapId); + var response = await fetch('/api/media/upload', { + method: 'POST', + credentials: 'include', + body: form + }); + var payload = await response.json().catch(function() { return null; }); + if (!response.ok || !payload || !payload.asset) { + throw new Error(payload && payload.error ? payload.error : '上传失败'); + } + appendUploadedAssetRow(payload.asset, plan.targetDocumentId); + if (options && options.insertIntoEditor) { + await insertUploadedAssetIntoEditor(payload.asset); + } + window.dispatchEvent(new CustomEvent('wolai:assets-changed', { + detail: { docId: plan.targetDocumentId, asset: payload.asset, assetIds: [payload.asset.id] } + })); + return payload.asset; + } + + async function uploadFilesWithResolvedTarget(files, detail, options) { + var list = Array.from(files || []).filter(Boolean); + if (!list.length) return []; + var plan = await resolveFileTreeUploadTarget(detail || {}); + var uploaded = []; + var errors = []; + for (var i = 0; i < list.length; i += 1) { + try { + uploaded.push(await uploadFileToMediaAsset(list[i], plan, options || {})); + } catch (error) { + errors.push(list[i].name + ': ' + (error && error.message ? error.message : '上传失败')); + } + } + if (errors.length) { + window.alert('部分文件上传失败:\n' + errors.slice(0, 6).join('\n') + (errors.length > 6 ? '\n...' : '')); + } + return uploaded; + } + + function openEditorUploadFilePicker(detail) { + var input = document.createElement('input'); + input.type = 'file'; + input.multiple = detail && detail.multiple !== false; + if (detail && detail.accept) input.accept = String(detail.accept); + input.style.position = 'fixed'; + input.style.left = '-9999px'; + input.style.top = '-9999px'; + document.body.appendChild(input); + input.addEventListener('change', function() { + var files = Array.from(input.files || []); + input.remove(); + void uploadFilesWithResolvedTarget(files, { + workspaceId: resolveWorkspaceId(document.body), + documentId: currentDocumentId(), + targetRowId: null + }, { + insertIntoEditor: detail && detail.insertIntoEditor !== false + }); + }, { once: true }); + input.click(); + } + + window.addEventListener('mnote:editor-upload-request', function(event) { + openEditorUploadFilePicker(event.detail || {}); + }); + + window.addEventListener('tree.filetree.external-drop', function(event) { + var detail = event.detail || {}; + void uploadFilesWithResolvedTarget(detail.files || [], detail, { + insertIntoEditor: String(detail.documentId || '') === currentDocumentId() + }); + }); + + document.addEventListener('dragover', function(event) { + var editorTarget = closestAction(event.target, '[data-testid="mnote-leptos-tiptap-editor-stage"], .editor-surface .ProseMirror'); + var hasFiles = event.dataTransfer && Array.prototype.indexOf.call(event.dataTransfer.types || [], 'Files') >= 0; + if (!editorTarget || !hasFiles) return; + event.preventDefault(); + event.stopPropagation(); + if (event.dataTransfer) event.dataTransfer.dropEffect = 'copy'; + }, true); + + document.addEventListener('drop', function(event) { + var editorTarget = closestAction(event.target, '[data-testid="mnote-leptos-tiptap-editor-stage"], .editor-surface .ProseMirror'); + var files = event.dataTransfer ? Array.from(event.dataTransfer.files || []) : []; + if (!editorTarget || !files.length) return; + event.preventDefault(); + event.stopPropagation(); + void uploadFilesWithResolvedTarget(files, { + workspaceId: resolveWorkspaceId(document.body), + documentId: currentDocumentId(), + targetRowId: null + }, { + insertIntoEditor: true + }); + }, true); + function rowTitle(row) { var title = row ? row.querySelector(':scope > .tree-link > .tree-link-title') : null; return title && title.textContent ? title.textContent.trim() : '无标题'; @@ -1109,6 +1713,31 @@ const SIDEBAR_TREE_JS: &str = r##" function handleTreeContextMenuAction(action, detail, trigger) { closeTreeContextMenu(); + detail = detail || {}; + if (detail.contextKind === 'attachment') { + if (action === 'copy-link') { + void copyTreeContextValue(detail.href || '', 'attachment-copy-link'); + return; + } + if (action === 'download') { + openEditorAttachmentDownload(detail); + return; + } + if (action === 'popup-preview') { + openEditorAttachmentDetail(detail); + return; + } + if (action === 'right-preview') { + dispatchSidebarEvent('tree.attachment.open-right', detail); + return; + } + if (action === 'copy-id') { + void copyTreeContextValue(detail.assetId || '', 'attachment-copy-id'); + return; + } + dispatchSidebarEvent('tree.attachment.action', { action: action, attachment: detail }); + return; + } var documentId = detail.documentId || ''; var workspaceId = detail.workspaceId || resolveWorkspaceId(trigger || document.body); var title = detail.title || '无标题'; @@ -1221,13 +1850,32 @@ const SIDEBAR_TREE_JS: &str = r##" function openTreeContextMenu(kind, detail, x, y, trigger) { closeTreeContextMenu(); + detail = Object.assign({}, detail || {}, { contextKind: kind }); var menu = document.createElement('div'); menu.className = 'mnote-tree-context-menu'; menu.setAttribute('role', 'menu'); menu.setAttribute('data-testid', 'mnote-tree-context-menu'); menu.setAttribute('data-kind', kind); + var isAttachment = kind === 'attachment'; var isAsset = kind === 'filetree' && detail.assetId && detail.rowKind !== 'document' && detail.rowKind !== 'index'; - var items = isAsset ? [ + var items = isAttachment ? [ + { action: 'duplicate', icon: 'file_copy', label: '拷贝副本', shortcut: 'Ctrl + D' }, + { action: 'delete-trash', icon: 'delete', label: '删除', shortcut: 'Del', danger: true }, + { separator: true }, + { action: 'copy-link', icon: 'link', label: '复制链接' }, + { action: 'move-embed', icon: 'subdirectory_arrow_right', label: '移动/嵌入到...', shortcut: 'Alt+Shift+M/G' }, + { action: 'history', icon: 'history', label: '块历史...' }, + { separator: true }, + { action: 'popup-preview', icon: 'preview', label: '弹窗预览' }, + { action: 'right-preview', icon: 'right_panel_open', label: '右侧预览' }, + { action: 'download', icon: 'download', label: '下载' }, + { action: 'replace-file', icon: 'sync', label: '更换文件' }, + { action: 'rename-attachment', icon: 'drive_file_rename_outline', label: '重命名' }, + { action: 'comment', icon: 'mode_comment', label: '评论', shortcut: 'Ctrl+Alt+M' }, + { action: 'caption', icon: 'notes', label: '添加说明文字' }, + { separator: true }, + { action: 'color', icon: 'format_paint', label: '颜色' } + ] : isAsset ? [ { action: 'open-right', icon: 'open_in_new', label: '在右侧边栏打开', shortcut: 'Alt + O' }, { action: 'move', icon: 'drive_file_move', label: '移动到...' }, { action: 'copy-id', icon: 'tag', label: '复制资源 ID' } @@ -2244,10 +2892,242 @@ const SIDEBAR_TREE_JS: &str = r##" else openPageSettingsPopover(); } + function attachmentQueryParams(href) { + try { + return new URL(String(href || ''), window.location.origin).searchParams; + } catch (_) { + return new URLSearchParams(); + } + } + + function isOnlyOfficeAttachmentHref(href) { + try { + var url = new URL(String(href || ''), window.location.origin); + return url.pathname === '/onlyoffice' && (url.searchParams.has('assetId') || url.searchParams.has('fileName')); + } catch (_) { + return false; + } + } + + function normalizeOnlyOfficeAttachmentHref(href) { + try { + var url = new URL(String(href || ''), window.location.origin); + if (url.pathname !== '/onlyoffice') return String(href || ''); + return buildOnlyOfficeOpenUrl({ + fileUrl: url.searchParams.get('fileUrl') || '', + fileName: url.searchParams.get('fileName') || '未命名附件', + fileType: url.searchParams.get('fileType') || inferOnlyOfficeFileType(url.searchParams.get('fileName') || '', ''), + assetId: url.searchParams.get('assetId') || '', + documentId: url.searchParams.get('documentId') || currentDocumentId() || '', + userId: url.searchParams.get('userId') || '', + mode: url.searchParams.get('mode') || 'edit' + }); + } catch (_) { + return String(href || ''); + } + } + + function isOfficeFileName(fileName) { + return Boolean(inferOnlyOfficeFileType(fileName, '')); + } + + function detailFromEditorAttachmentLink(link) { + var rawHref = link instanceof HTMLAnchorElement ? link.href : ''; + var params = attachmentQueryParams(rawHref); + var fileName = params.get('fileName') || (link ? link.textContent : '') || '未命名附件'; + var fileType = params.get('fileType') || inferOnlyOfficeFileType(fileName, ''); + var assetId = params.get('assetId') || (link ? link.getAttribute('data-asset-id') : '') || ''; + var fileUrl = params.get('fileUrl') || ''; + var href = rawHref; + if (!isOnlyOfficeAttachmentHref(rawHref) && fileType) { + fileUrl = rawHref; + href = buildOnlyOfficeOpenUrl({ + fileUrl: fileUrl, + fileName: fileName, + fileType: fileType, + assetId: assetId, + documentId: currentDocumentId() || '', + userId: '', + mode: 'edit' + }); + } else if (isOnlyOfficeAttachmentHref(rawHref)) { + href = normalizeOnlyOfficeAttachmentHref(rawHref); + } + return { + href: href, + fileUrl: fileUrl, + fileName: fileName, + title: fileName, + fileType: fileType, + assetId: assetId, + documentId: params.get('documentId') || currentDocumentId() || '', + workspaceId: resolveWorkspaceId(document.body), + fileSize: (link ? link.getAttribute('data-file-size') : '') || '' + }; + } + + function enhanceEditorAttachmentLink(link) { + if (!(link instanceof HTMLAnchorElement)) return; + var href = link.getAttribute('href') || ''; + var params = attachmentQueryParams(href); + var fileName = params.get('fileName') || link.textContent || ''; + var className = link.getAttribute('class') || ''; + var shouldEnhance = isOnlyOfficeAttachmentHref(href) + || className.indexOf('mnote-uploaded-attachment-row') >= 0 + || isOfficeFileName(fileName); + if (!shouldEnhance) return; + link.setAttribute('data-mnote-attachment-link', 'true'); + var assetId = params.get('assetId') || link.getAttribute('data-asset-id') || ''; + if (assetId) link.setAttribute('data-asset-id', assetId); + if (isOnlyOfficeAttachmentHref(href)) { + link.setAttribute('href', buildOnlyOfficeOpenPath({ + fileUrl: params.get('fileUrl') || '', + fileName: fileName || '未命名附件', + fileType: params.get('fileType') || inferOnlyOfficeFileType(fileName, ''), + assetId: assetId, + documentId: params.get('documentId') || currentDocumentId() || '', + userId: params.get('userId') || '', + mode: params.get('mode') || 'edit' + })); + } + attachmentClassForFileName(fileName).split(/\s+/).forEach(function(name) { + if (name) link.classList.add(name); + }); + link.setAttribute('target', '_blank'); + link.setAttribute('rel', 'noopener noreferrer nofollow'); + void hydrateEditorAttachmentMeta(link); + } + + function enhanceEditorAttachmentLinks() { + document.querySelectorAll('.editor-surface .ProseMirror a[href]').forEach(enhanceEditorAttachmentLink); + void healLegacyOfficeAttachmentParagraphs(); + } + + function ensureAttachmentActions() { + var existing = document.querySelector('[data-testid="mnote-attachment-actions"]'); + if (existing instanceof HTMLElement) return existing; + var actions = document.createElement('div'); + actions.className = 'mnote-attachment-actions'; + actions.setAttribute('data-testid', 'mnote-attachment-actions'); + actions.hidden = true; + actions.innerHTML = '' + + '' + + ''; + actions.addEventListener('mouseenter', function() { + if (attachmentActionsHideTimer) window.clearTimeout(attachmentActionsHideTimer); + }); + actions.addEventListener('mouseleave', scheduleHideAttachmentActions); + document.body.appendChild(actions); + return actions; + } + + function positionAttachmentActions(link) { + if (!(link instanceof HTMLElement)) return; + var actions = ensureAttachmentActions(); + var rect = link.getBoundingClientRect(); + actions.hidden = false; + actions.style.left = Math.min(window.innerWidth - 76, Math.max(8, rect.right + 6)) + 'px'; + actions.style.top = Math.max(8, rect.top + (rect.height - 28) / 2) + 'px'; + activeEditorAttachmentLink = link; + } + + function scheduleHideAttachmentActions() { + if (attachmentActionsHideTimer) window.clearTimeout(attachmentActionsHideTimer); + attachmentActionsHideTimer = window.setTimeout(function() { + var actions = document.querySelector('[data-testid="mnote-attachment-actions"]'); + if (actions instanceof HTMLElement) actions.hidden = true; + activeEditorAttachmentLink = null; + }, 220); + } + + function openEditorAttachmentDetail(detail) { + if (!detail || !detail.href) return; + window.open(detail.href, '_blank', 'noopener,noreferrer'); + } + + async function openEditorAttachmentDownload(detail) { + if (!detail) return; + if (detail.assetId) { + try { + var response = await fetch('/api/media/sign?assetId=' + encodeURIComponent(detail.assetId), { + method: 'GET', + credentials: 'include' + }); + var payload = await response.json().catch(function() { return null; }); + var signedUrl = String(payload && payload.signedUrl || '').trim(); + if (response.ok && signedUrl) { + window.open(signedUrl, '_blank', 'noopener,noreferrer'); + return; + } + } catch (_) {} + } + var target = detail.fileUrl || detail.href; + if (!target) return; + window.open(target, '_blank', 'noopener,noreferrer'); + } + + function openEditorAttachmentMenu(link, trigger) { + var detail = detailFromEditorAttachmentLink(link); + var rect = trigger && trigger.getBoundingClientRect ? trigger.getBoundingClientRect() : link.getBoundingClientRect(); + openTreeContextMenu('attachment', detail, rect.right, rect.bottom + 4, trigger || link); + } + + function openEditorAttachmentLink(link) { + enhanceEditorAttachmentLink(link); + openEditorAttachmentDetail(detailFromEditorAttachmentLink(link)); + } + + enhanceEditorAttachmentLinks(); + var attachmentObserver = new MutationObserver(function() { enhanceEditorAttachmentLinks(); }); + attachmentObserver.observe(document.documentElement, { childList: true, subtree: true }); + + document.addEventListener('mouseover', function(event) { + var link = closestAction(event.target, '.editor-surface .ProseMirror a[data-mnote-attachment-link="true"], .editor-surface .ProseMirror a.mnote-uploaded-attachment-row'); + if (!(link instanceof HTMLAnchorElement)) return; + if (attachmentActionsHideTimer) window.clearTimeout(attachmentActionsHideTimer); + enhanceEditorAttachmentLink(link); + positionAttachmentActions(link); + }); + + document.addEventListener('mouseout', function(event) { + var link = closestAction(event.target, '.editor-surface .ProseMirror a[data-mnote-attachment-link="true"], .editor-surface .ProseMirror a.mnote-uploaded-attachment-row'); + if (!(link instanceof HTMLAnchorElement)) return; + var next = event.relatedTarget; + var actions = document.querySelector('[data-testid="mnote-attachment-actions"]'); + if (next && (link.contains(next) || (actions && actions.contains(next)))) return; + scheduleHideAttachmentActions(); + }); + document.addEventListener('click', function(e) { if (activeTreeContextMenu && activeTreeContextMenu.contains(e.target)) return; if (activeTreeContextMenu) closeTreeContextMenu(); + var attachmentAction = closestAction(e.target, '[data-attachment-action]'); + if (attachmentAction) { + e.preventDefault(); + e.stopPropagation(); + var link = activeEditorAttachmentLink; + if (!(link instanceof HTMLAnchorElement)) return; + var attachmentDetail = detailFromEditorAttachmentLink(link); + var attachmentActionName = attachmentAction.getAttribute('data-attachment-action') || ''; + if (attachmentActionName === 'download') { + openEditorAttachmentDownload(attachmentDetail); + return; + } + if (attachmentActionName === 'menu') { + openEditorAttachmentMenu(link, attachmentAction); + return; + } + return; + } + + var editorAttachmentLink = closestAction(e.target, '.editor-surface .ProseMirror a[data-mnote-attachment-link="true"], .editor-surface .ProseMirror a.mnote-uploaded-attachment-row'); + if (editorAttachmentLink instanceof HTMLAnchorElement) { + e.preventDefault(); + openEditorAttachmentLink(editorAttachmentLink); + return; + } + var historyClose = closestAction(e.target, '[data-page-history-action="close"]'); if (historyClose) { e.preventDefault(); @@ -3084,6 +3964,13 @@ mod tests { assert!(SIDEBAR_TREE_JS.contains("sidebar-file-tree-root")); assert!(SIDEBAR_TREE_JS.contains("tree.filetree.open")); assert!(SIDEBAR_TREE_JS.contains("tree.asset.open")); + assert!(SIDEBAR_TREE_JS.contains("openConvexAssetFromFileTree")); + assert!(SIDEBAR_TREE_JS.contains("/api/media/sign?assetId=")); + assert!(SIDEBAR_TREE_JS.contains("fetchCurrentOnlyOfficeUserId")); + assert!(SIDEBAR_TREE_JS.contains("/api/auth/whoami")); + assert!(SIDEBAR_TREE_JS.contains("buildOnlyOfficeOpenUrl")); + assert!(SIDEBAR_TREE_JS.contains("target.searchParams.set('userId'")); + assert!(SIDEBAR_TREE_JS.contains("window.open(buildOnlyOfficeOpenUrl")); assert!(SIDEBAR_TREE_JS.contains("tree.filetree.internal-drop")); assert!(SIDEBAR_TREE_JS.contains("tree.filetree.external-drop")); assert!(SIDEBAR_TREE_JS.contains("MNOTE_RECENT_LOCAL_ROOTS_KEY")); diff --git a/rust/crates/mnote-web/src/ssr/styles.rs b/rust/crates/mnote-web/src/ssr/styles.rs index cc70bc93..0047c1b5 100644 --- a/rust/crates/mnote-web/src/ssr/styles.rs +++ b/rust/crates/mnote-web/src/ssr/styles.rs @@ -168,13 +168,20 @@ a:hover { .material-symbols-outlined[data-icon="drive_file_move"] { --mnote-icon-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h6l2 2h8v10H4z' fill='none' stroke='black' stroke-width='2' stroke-linejoin='round'/%3E%3Cpath d='m13 12 3 3-3 3M8 15h8' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); } .material-symbols-outlined[data-icon="delete"] { --mnote-icon-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5 6h14M9 6V4h6v2M8 6l1 14h6l1-14M10.5 10v6M13.5 10v6' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); } .material-symbols-outlined[data-icon="right_panel_open"] { --mnote-icon-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 5h16v14H4zM14 5v14M8 12h6M11 9l3 3-3 3' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); } +.material-symbols-outlined[data-icon="preview"] { --mnote-icon-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M2.5 12s3.5-6 9.5-6 9.5 6 9.5 6-3.5 6-9.5 6-9.5-6-9.5-6Z' fill='none' stroke='black' stroke-width='2' stroke-linejoin='round'/%3E%3Ccircle cx='12' cy='12' r='2.8' fill='none' stroke='black' stroke-width='2'/%3E%3C/svg%3E"); } +.material-symbols-outlined[data-icon="download"] { --mnote-icon-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 4v10M8.5 11.5 12 15l3.5-3.5M5 19h14' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); } +.material-symbols-outlined[data-icon="notes"] { --mnote-icon-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6 5h12v14H6zM9 9h6M9 12h6M9 15h4' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); } .material-symbols-outlined[data-icon="open_in_new"] { --mnote-icon-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8 6H5v13h13v-3M12 5h7v7M10 14 19 5' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); } .material-symbols-outlined[data-icon="share"] { --mnote-icon-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='18' cy='5' r='3' fill='none' stroke='black' stroke-width='2'/%3E%3Ccircle cx='6' cy='12' r='3' fill='none' stroke='black' stroke-width='2'/%3E%3Ccircle cx='18' cy='19' r='3' fill='none' stroke='black' stroke-width='2'/%3E%3Cpath d='m8.7 10.7 6.6-4.4M8.7 13.3l6.6 4.4' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E"); } .material-symbols-outlined[data-icon="comment"] { --mnote-icon-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5 5h14v10H9l-4 4V5Z' fill='none' stroke='black' stroke-width='2' stroke-linejoin='round'/%3E%3C/svg%3E"); } +.material-symbols-outlined[data-icon="mode_comment"] { --mnote-icon-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5 5h14v10H9l-4 4V5Z' fill='none' stroke='black' stroke-width='2' stroke-linejoin='round'/%3E%3C/svg%3E"); } .material-symbols-outlined[data-icon="person_add"] { --mnote-icon-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='9' cy='8' r='3.2' fill='none' stroke='black' stroke-width='2'/%3E%3Cpath d='M3.5 20a5.5 5.5 0 0 1 11 0M18 8v6M15 11h6' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E"); } .material-symbols-outlined[data-icon="slideshow"] { --mnote-icon-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 5h16v12H4z' fill='none' stroke='black' stroke-width='2' stroke-linejoin='round'/%3E%3Cpath d='m10 9 5 2-5 2zM9 21h6' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); } .material-symbols-outlined[data-icon="article"] { --mnote-icon-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6 4h12v16H6zM9 8h6M9 12h6M9 16h4' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); } +.material-symbols-outlined[data-icon="sync"] { --mnote-icon-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M20 6v5h-5M4 18v-5h5M7.5 9A6 6 0 0 1 18 6M16.5 15A6 6 0 0 1 6 18' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); } +.material-symbols-outlined[data-icon="drive_file_rename_outline"] { --mnote-icon-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m4 17-.5 3.5L7 20l11-11-3-3zM13 8l3 3M5 6h7' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); } +.material-symbols-outlined[data-icon="format_paint"] { --mnote-icon-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5 7h10l2 3-2 3H5l-2-3zM9 13v6' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); } .material-symbols-outlined[data-icon="link"] { --mnote-icon-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M9.5 14.5 14.5 9.5M10.8 6.2l1.1-1.1a4 4 0 0 1 5.7 5.7l-1.6 1.6M13.2 17.8l-1.1 1.1a4 4 0 0 1-5.7-5.7L8 11.6' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E"); } .material-symbols-outlined[data-icon="content_copy"], .material-symbols-outlined[data-icon="file_copy"] { --mnote-icon-mask: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M8 8h10v12H8zM6 16H4V4h10v2' fill='none' stroke='black' stroke-width='2' stroke-linejoin='round'/%3E%3C/svg%3E"); } @@ -1750,6 +1757,75 @@ body { background: rgba(27, 28, 28, 0.08); } +.mnote-attachment-actions { + position: fixed; + z-index: 1100; + display: inline-flex; + align-items: center; + gap: 2px; + height: 28px; + padding: 2px; + border: 1px solid rgba(27, 28, 28, 0.08); + border-radius: 6px; + background: #FFFFFF; + box-shadow: 0 6px 18px rgba(27, 28, 28, 0.12); +} + +.mnote-attachment-actions[hidden] { + display: none !important; +} + +.mnote-attachment-action { + width: 24px; + height: 24px; + display: inline-flex; + align-items: center; + justify-content: center; + border: 0; + border-radius: 4px; + background: transparent; + color: #6D6A65; + cursor: pointer; +} + +.mnote-attachment-action:hover { + background: #F4F3F3; + color: #37352F; +} + +.mnote-attachment-action .material-symbols-outlined { + font-size: 18px; +} + +.document-shell .editor-surface .ProseMirror a.mnote-uploaded-attachment-row { + display: inline-flex !important; + align-items: center !important; + gap: 7px !important; + max-width: 100% !important; + min-height: 28px !important; + padding: 2px 4px !important; + border-radius: 4px !important; + color: #37352f !important; + font-weight: 500 !important; + line-height: 1.4 !important; + text-decoration: none !important; +} + +.document-shell .editor-surface .ProseMirror a.mnote-uploaded-attachment-row::after { + content: "" !important; + display: none !important; +} + +.document-shell .editor-surface .ProseMirror a.mnote-uploaded-attachment-row[data-file-size]::after { + content: "◔ " attr(data-file-size) !important; + display: inline-block !important; + margin-left: 4px !important; + color: #9ca3af !important; + font-size: 12px !important; + line-height: 1 !important; + white-space: nowrap !important; +} + .sidebar-tree .tree-node .tree-children .tree-row { padding-left: 20px; } diff --git a/rust/crates/mnote-web/src/transport/convex.rs b/rust/crates/mnote-web/src/transport/convex.rs index 77511c25..f79e7c71 100644 --- a/rust/crates/mnote-web/src/transport/convex.rs +++ b/rust/crates/mnote-web/src/transport/convex.rs @@ -332,6 +332,29 @@ pub async fn execute_sidebar_dataset_query( execute_convex_query_plan(config, context, plan).await } +pub async fn execute_convex_query_by_name( + config: &AppConfig, + context: &RequestContext, + function_name: &str, + args: Value, + workspace_id: Option<&str>, + error_phase: &'static str, +) -> Result { + let plan = RuntimeQueryExecutionPlan { + query_name: function_name.to_string(), + function_name: function_name.to_string(), + workspace_id: workspace_id.map(ToOwned::to_owned), + request_id: context.trace.request_id.clone(), + trace_id: context.trace.trace_id.clone(), + actor_id: context.auth.actor_id.clone(), + payload_json: args.to_string(), + args_json: args, + }; + execute_convex_query_plan(config, context, &plan) + .await + .map_err(|error| error.with_header("x-error-phase", error_phase)) +} + fn convex_command_args_for_plan(plan: &RuntimeCommandExecutionPlan) -> Value { let mut args = plan.args_json.clone(); if matches!( diff --git a/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island.d.ts b/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island.d.ts index aa95fcb3..24b181f7 100644 --- a/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island.d.ts +++ b/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island.d.ts @@ -46,28 +46,29 @@ export interface InitOutput { readonly memory: WebAssembly.Memory; readonly mount: (a: any, b: any) => [number, number, number]; readonly unmount: (a: number) => [number, number]; - readonly __wbg_intounderlyingsink_free: (a: number, b: number) => void; - readonly intounderlyingsink_write: (a: number, b: any) => any; - readonly intounderlyingsink_close: (a: number) => any; - readonly intounderlyingsink_abort: (a: number, b: any) => any; readonly __wbg_intounderlyingbytesource_free: (a: number, b: number) => void; readonly intounderlyingbytesource_type: (a: number) => number; readonly intounderlyingbytesource_autoAllocateChunkSize: (a: number) => number; readonly intounderlyingbytesource_start: (a: number, b: any) => void; readonly intounderlyingbytesource_pull: (a: number, b: any) => any; readonly intounderlyingbytesource_cancel: (a: number) => void; + readonly __wbg_intounderlyingsink_free: (a: number, b: number) => void; + readonly intounderlyingsink_write: (a: number, b: any) => any; + readonly intounderlyingsink_close: (a: number) => any; + readonly intounderlyingsink_abort: (a: number, b: any) => any; readonly __wbg_intounderlyingsource_free: (a: number, b: number) => void; readonly intounderlyingsource_pull: (a: number, b: any) => any; readonly intounderlyingsource_cancel: (a: number) => void; - readonly wasm_bindgen__convert__closures_____invoke__h3a3182d847094e12: (a: number, b: number, c: any) => [number, number]; - readonly wasm_bindgen__convert__closures_____invoke__h0accad0f5d87788a: (a: number, b: number, c: any, d: any) => void; - readonly wasm_bindgen__convert__closures_____invoke__hde8e7b4803478c08: (a: number, b: number, c: any) => void; - readonly wasm_bindgen__convert__closures_____invoke__h396914cf76a9e7a5: (a: number, b: number, c: any) => void; - readonly wasm_bindgen__convert__closures_____invoke__h0abd2b2fe4652e2a: (a: number, b: number, c: any) => void; - readonly wasm_bindgen__convert__closures_____invoke__h396914cf76a9e7a5_4: (a: number, b: number, c: any) => void; - readonly wasm_bindgen__convert__closures_____invoke__h794babeffd4f821f: (a: number, b: number) => void; - readonly wasm_bindgen__convert__closures_____invoke__h2b648e7ac8ec1fb5: (a: number, b: number) => void; - readonly wasm_bindgen__convert__closures_____invoke__h0b7fb40a8610550c: (a: number, b: number) => void; + readonly wasm_bindgen__convert__closures_____invoke__h36e788bd1cd1f0f7: (a: number, b: number, c: any) => [number, number]; + readonly wasm_bindgen__convert__closures_____invoke__hb0ba6117a7ec12e8: (a: number, b: number, c: any, d: any) => void; + readonly wasm_bindgen__convert__closures_____invoke__had2dfed707e9250e: (a: number, b: number, c: any) => void; + readonly wasm_bindgen__convert__closures_____invoke__h2593b18d2d6f8a75: (a: number, b: number, c: any) => void; + readonly wasm_bindgen__convert__closures_____invoke__h03deb55668e1377f: (a: number, b: number, c: any) => void; + readonly wasm_bindgen__convert__closures_____invoke__h837fba73fce77300: (a: number, b: number, c: any) => void; + readonly wasm_bindgen__convert__closures_____invoke__h60e57afd955e8441: (a: number, b: number) => number; + readonly wasm_bindgen__convert__closures_____invoke__h96c1a94f3b510398: (a: number, b: number) => void; + readonly wasm_bindgen__convert__closures_____invoke__hd17f30facfdd737f: (a: number, b: number) => void; + readonly wasm_bindgen__convert__closures_____invoke__hf726e22cfd1ee0a9: (a: number, b: number) => void; readonly __wbindgen_malloc: (a: number, b: number) => number; readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; readonly __externref_table_alloc: () => number; diff --git a/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island.js b/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island.js index e7422952..eefb1775 100644 --- a/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island.js +++ b/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island.js @@ -785,7 +785,7 @@ function __wbg_get_imports() { const a = state0.a; state0.a = 0; try { - return wasm_bindgen__convert__closures_____invoke__h0accad0f5d87788a(a, state0.b, arg0, arg1); + return wasm_bindgen__convert__closures_____invoke__hb0ba6117a7ec12e8(a, state0.b, arg0, arg1); } finally { state0.a = a; } @@ -1014,6 +1014,24 @@ function __wbg_get_imports() { const ret = arg0.right; return ret; }, + __wbg_run_0b0a622deae25fda: function(arg0, arg1, arg2) { + try { + var state0 = {a: arg1, b: arg2}; + var cb0 = () => { + const a = state0.a; + state0.a = 0; + try { + return wasm_bindgen__convert__closures_____invoke__h60e57afd955e8441(a, state0.b, ); + } finally { + state0.a = a; + } + }; + const ret = arg0.run(cb0); + return ret; + } finally { + state0.a = 0; + } + }, __wbg_scrollHeight_5fe8cbb97ae906d8: function(arg0) { const ret = arg0.scrollHeight; return ret; @@ -1111,6 +1129,10 @@ function __wbg_get_imports() { getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); }, + __wbg_static_accessor_CREATE_TASK_f3ab6a6954bda493: function() { + const ret = typeof console === 'undefined' ? null : console?.createTask; + return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); + }, __wbg_static_accessor_GLOBAL_8cfadc87a297ca02: function() { const ret = typeof global === 'undefined' ? null : global; return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); @@ -1188,6 +1210,12 @@ function __wbg_get_imports() { const ret = arg0.view; return isLikeNone(ret) ? 0 : addToExternrefTable0(ret); }, + __wbg_warn_3cc416af27dbdc02: function(arg0) { + console.warn(arg0); + }, + __wbg_warn_bd0f407277b102f4: function(arg0, arg1, arg2) { + console.warn(arg0, arg1, arg2); + }, __wbg_width_9673a519d7bd5a6a: function(arg0) { const ret = arg0.width; return ret; @@ -1205,43 +1233,43 @@ function __wbg_get_imports() { } }, arguments); }, __wbindgen_cast_0000000000000001: function(arg0, arg1) { - // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 1025, ret: Result(Unit), inner_ret: Some(Result(Unit)) }, mutable: true }) -> Externref`. - const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h3a3182d847094e12); + // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 1440, ret: Unit, inner_ret: Some(Unit) }, mutable: false }) -> Externref`. + const ret = makeClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__had2dfed707e9250e); return ret; }, __wbindgen_cast_0000000000000002: function(arg0, arg1) { - // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 794, ret: Unit, inner_ret: Some(Unit) }, mutable: false }) -> Externref`. - const ret = makeClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__hde8e7b4803478c08); + // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 1721, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. + const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h2593b18d2d6f8a75); return ret; }, __wbindgen_cast_0000000000000003: function(arg0, arg1) { - // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 973, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. - const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h396914cf76a9e7a5); + // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [Externref], shim_idx: 1812, ret: Result(Unit), inner_ret: Some(Result(Unit)) }, mutable: true }) -> Externref`. + const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h36e788bd1cd1f0f7); return ret; }, __wbindgen_cast_0000000000000004: function(arg0, arg1) { - // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("Event")], shim_idx: 916, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. - const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h0abd2b2fe4652e2a); + // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("Event")], shim_idx: 1638, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. + const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h03deb55668e1377f); return ret; }, __wbindgen_cast_0000000000000005: function(arg0, arg1) { - // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("Event")], shim_idx: 973, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. - const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h396914cf76a9e7a5_4); + // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [NamedExternref("Event")], shim_idx: 1723, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. + const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h837fba73fce77300); return ret; }, __wbindgen_cast_0000000000000006: function(arg0, arg1) { - // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [], shim_idx: 918, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. - const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h794babeffd4f821f); + // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [], shim_idx: 1637, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. + const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h96c1a94f3b510398); return ret; }, __wbindgen_cast_0000000000000007: function(arg0, arg1) { - // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [], shim_idx: 940, ret: Unit, inner_ret: Some(Unit) }, mutable: false }) -> Externref`. - const ret = makeClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h2b648e7ac8ec1fb5); + // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [], shim_idx: 1659, ret: Unit, inner_ret: Some(Unit) }, mutable: false }) -> Externref`. + const ret = makeClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__hd17f30facfdd737f); return ret; }, __wbindgen_cast_0000000000000008: function(arg0, arg1) { - // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [], shim_idx: 976, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. - const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__h0b7fb40a8610550c); + // Cast intrinsic for `Closure(Closure { owned: true, function: Function { arguments: [], shim_idx: 1722, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`. + const ret = makeMutClosure(arg0, arg1, wasm_bindgen__convert__closures_____invoke__hf726e22cfd1ee0a9); return ret; }, __wbindgen_cast_0000000000000009: function(arg0) { @@ -1285,43 +1313,48 @@ function __wbg_get_imports() { }; } -function wasm_bindgen__convert__closures_____invoke__h794babeffd4f821f(arg0, arg1) { - wasm.wasm_bindgen__convert__closures_____invoke__h794babeffd4f821f(arg0, arg1); +function wasm_bindgen__convert__closures_____invoke__h96c1a94f3b510398(arg0, arg1) { + wasm.wasm_bindgen__convert__closures_____invoke__h96c1a94f3b510398(arg0, arg1); } -function wasm_bindgen__convert__closures_____invoke__h2b648e7ac8ec1fb5(arg0, arg1) { - wasm.wasm_bindgen__convert__closures_____invoke__h2b648e7ac8ec1fb5(arg0, arg1); +function wasm_bindgen__convert__closures_____invoke__hd17f30facfdd737f(arg0, arg1) { + wasm.wasm_bindgen__convert__closures_____invoke__hd17f30facfdd737f(arg0, arg1); } -function wasm_bindgen__convert__closures_____invoke__h0b7fb40a8610550c(arg0, arg1) { - wasm.wasm_bindgen__convert__closures_____invoke__h0b7fb40a8610550c(arg0, arg1); +function wasm_bindgen__convert__closures_____invoke__hf726e22cfd1ee0a9(arg0, arg1) { + wasm.wasm_bindgen__convert__closures_____invoke__hf726e22cfd1ee0a9(arg0, arg1); } -function wasm_bindgen__convert__closures_____invoke__hde8e7b4803478c08(arg0, arg1, arg2) { - wasm.wasm_bindgen__convert__closures_____invoke__hde8e7b4803478c08(arg0, arg1, arg2); +function wasm_bindgen__convert__closures_____invoke__h60e57afd955e8441(arg0, arg1) { + const ret = wasm.wasm_bindgen__convert__closures_____invoke__h60e57afd955e8441(arg0, arg1); + return ret !== 0; } -function wasm_bindgen__convert__closures_____invoke__h396914cf76a9e7a5(arg0, arg1, arg2) { - wasm.wasm_bindgen__convert__closures_____invoke__h396914cf76a9e7a5(arg0, arg1, arg2); +function wasm_bindgen__convert__closures_____invoke__had2dfed707e9250e(arg0, arg1, arg2) { + wasm.wasm_bindgen__convert__closures_____invoke__had2dfed707e9250e(arg0, arg1, arg2); } -function wasm_bindgen__convert__closures_____invoke__h0abd2b2fe4652e2a(arg0, arg1, arg2) { - wasm.wasm_bindgen__convert__closures_____invoke__h0abd2b2fe4652e2a(arg0, arg1, arg2); +function wasm_bindgen__convert__closures_____invoke__h2593b18d2d6f8a75(arg0, arg1, arg2) { + wasm.wasm_bindgen__convert__closures_____invoke__h2593b18d2d6f8a75(arg0, arg1, arg2); } -function wasm_bindgen__convert__closures_____invoke__h396914cf76a9e7a5_4(arg0, arg1, arg2) { - wasm.wasm_bindgen__convert__closures_____invoke__h396914cf76a9e7a5_4(arg0, arg1, arg2); +function wasm_bindgen__convert__closures_____invoke__h03deb55668e1377f(arg0, arg1, arg2) { + wasm.wasm_bindgen__convert__closures_____invoke__h03deb55668e1377f(arg0, arg1, arg2); } -function wasm_bindgen__convert__closures_____invoke__h3a3182d847094e12(arg0, arg1, arg2) { - const ret = wasm.wasm_bindgen__convert__closures_____invoke__h3a3182d847094e12(arg0, arg1, arg2); +function wasm_bindgen__convert__closures_____invoke__h837fba73fce77300(arg0, arg1, arg2) { + wasm.wasm_bindgen__convert__closures_____invoke__h837fba73fce77300(arg0, arg1, arg2); +} + +function wasm_bindgen__convert__closures_____invoke__h36e788bd1cd1f0f7(arg0, arg1, arg2) { + const ret = wasm.wasm_bindgen__convert__closures_____invoke__h36e788bd1cd1f0f7(arg0, arg1, arg2); if (ret[1]) { throw takeFromExternrefTable0(ret[0]); } } -function wasm_bindgen__convert__closures_____invoke__h0accad0f5d87788a(arg0, arg1, arg2, arg3) { - wasm.wasm_bindgen__convert__closures_____invoke__h0accad0f5d87788a(arg0, arg1, arg2, arg3); +function wasm_bindgen__convert__closures_____invoke__hb0ba6117a7ec12e8(arg0, arg1, arg2, arg3) { + wasm.wasm_bindgen__convert__closures_____invoke__hb0ba6117a7ec12e8(arg0, arg1, arg2, arg3); } diff --git a/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island_bg.wasm b/rust/spikes/leptos-tiptap-spike/generated/island/mnote-leptos-tiptap-spike-island_bg.wasm index de88be416b7ea11e775e37edb2edde37e0fdda44..b138599351c368a4910bee0b06db01d49cb4cacc 100644 GIT binary patch literal 9656737 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

C{j>+kmv%|7?LT1es%wqI=27cRO(iYRRp3HNU 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

Kku@S<`6&3{uEen! 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

l#no8!@AO zBOJIV;Wmi70d89&Xi2(WaeLw3jM>dt{_H;p2DNf;#rU63C_-<8-iayruH3u0_hNP@ zW^8Xk`4!%J@cBg8eXza)^@02c_zz>&7c;iR^43_gkAyt}>yKG~OmB^w>3yu;$Miml z8AcgTV_y21fM)>DV}=2|h}jEY-^-XijoHhvJ|(hI1#Z;j^cMwfbi5M%74+9J!=S$@ z=)M*37GNM|n0Dp6n7#AD?_>5RX75AcZge(Dc#~!h;X8DE5dQ=G!I&@Lqx_HfpJFx` zGq#khx5m#1{w(k_U_~LTak{2Fu830tr-&kBOR(M=*CyQrVH3bA`6N=Lj3*XGoFrfp zz+?{p9;o8;2NzfQ0ufhoIR_N|($LjihHO^C%_Ll#l45VvnMGX4__{KIqnLkgwr?g zdW!OAelDmJV5XCn^%oSTdCjX_XHXrr)3u(bv1I{EAH z*K^e41@B`ojP$Zi!kWM~@QN(Tcl|i1Kw+bLH`2R_)#m43`|$S{*ddYuDE%H5EA1Gl%x zu5;Yyv;pN;f>)1<+)ZIO!EP0(x8>i)zr&%4PaQs%1Gr@G3cCw-ugLBd=>Xo1!hQAL zr?-#K8NQ4MMPB-$fQJB&IP80%pHCCMzQ>#-IO>P>DUsbOa5n{_8T8TdMD!=npB5R$ z^gJu*J{RyD-~|_^3cKVy0b_=83Eo=*urSO@U-l=~>`BiN@R!^rq^VZ;i3 z?y2Agl!|hi z$;04$4`_%?8g8Gs`$(xV73}0!2*jNQx0+}7Ja@Ln6L$`eVer=p!hyR|Zojzu;qFWY zYtwG7xO3sw@My-c{Od2d`oqedH!PU`oa;J5=YuX7rr=t+wYUrUkpdn8=l5}j<@qZk zJzPm&By17b;sUi!ejWZ2zLmUqt3x)g8IUwN!2qPN2qGO}@8{u!_8Y+IX{AT>ke4S{R zv1NK{S&S7-=qypwAvkah{! z1+bgv^gOVKpBC^5xAH(A≻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