From f98869429b67061ec6310323bb4f58b596682f1c Mon Sep 17 00:00:00 2001 From: khorshuheng Date: Wed, 8 Jan 2025 23:09:55 +0800 Subject: [PATCH] feat: add web guide as part of getting started guide --- .../assets/getting_started.json | 18 + libs/workspace-template/assets/web_guide.json | 479 ++++++++++++++++++ .../src/document/getting_started.rs | 32 +- 3 files changed, 528 insertions(+), 1 deletion(-) create mode 100644 libs/workspace-template/assets/web_guide.json diff --git a/libs/workspace-template/assets/getting_started.json b/libs/workspace-template/assets/getting_started.json index eea0a87c0..2caf66abe 100644 --- a/libs/workspace-template/assets/getting_started.json +++ b/libs/workspace-template/assets/getting_started.json @@ -62,6 +62,24 @@ ] } }, + { + "type": "heading", + "data": { + "level": 4, + "delta": [ + { + "insert": "$", + "attributes": { + "mention": { + "type": "page", + "page_id": "" + }, + "bold": true + } + } + ] + } + }, { "type": "heading", "data": { diff --git a/libs/workspace-template/assets/web_guide.json b/libs/workspace-template/assets/web_guide.json new file mode 100644 index 000000000..aec3785af --- /dev/null +++ b/libs/workspace-template/assets/web_guide.json @@ -0,0 +1,479 @@ +{ + "type": "page", + "children": [ + { + "type": "heading", + "data": { + "level": 1, + "delta": [ + { + "insert": "AppFlowy is right in " + }, + { + "insert": "your browser", + "attributes": { + "href": "https://appflowy.com/" + } + } + ] + } + }, + { + "type": "paragraph", + "data": { + "delta": [] + } + }, + { + "type": "heading", + "data": { + "level": 3, + "delta": [ + { + "insert": "Basics" + } + ] + } + }, + { + "type": "todo_list", + "data": { + "checked": true, + "delta": [ + { + "insert": "Click " + }, + { + "insert": "+", + "attributes": { + "code": true + } + }, + { + "insert": " button next to a Space name to quickly add a new page." + } + ] + } + }, + { + "type": "todo_list", + "data": { + "checked": false, + "delta": [ + { + "insert": "Click anywhere and just start typing." + } + ] + } + }, + { + "type": "todo_list", + "data": { + "checked": false, + "delta": [ + { + "insert": "Highlight ", + "attributes": { + "bg_color": "0x4dffeb3b" + } + }, + { + "insert": "any text, and use the editing menu to " + }, + { + "insert": "style", + "attributes": { + "italic": true + } + }, + { + "insert": " " + }, + { + "insert": "your", + "attributes": { + "bold": true + } + }, + { + "insert": " " + }, + { + "insert": "writing", + "attributes": { + "underline": true + } + }, + { + "insert": " " + }, + { + "insert": "however", + "attributes": { + "code": true + } + }, + { + "insert": " you " + }, + { + "insert": "like.", + "attributes": { + "strikethrough": true + } + } + ] + } + }, + { + "type": "todo_list", + "children": [ + { + "type": "todo_list", + "data": { + "checked": false, + "delta": [ + { + "insert": "Type " + }, + { + "insert": "/", + "attributes": { + "code": true + } + }, + { + "insert": " followed by " + }, + { + "insert": "/bullet", + "attributes": { + "code": true + } + }, + { + "insert": " or " + }, + { + "insert": "/num", + "attributes": { + "code": true + } + }, + { + "insert": " to create a list. ", + "attributes": { + "code": false + } + } + ] + } + } + ], + "data": { + "checked": false, + "delta": [ + { + "insert": "As soon as you type " + }, + { + "insert": "/", + "attributes": { + "font_color": "0xff00b5ff", + "code": true + } + }, + { + "insert": " a menu will pop up. Select " + }, + { + "insert": "different types", + "attributes": { + "bg_color": "0x4d9c27b0" + } + }, + { + "insert": " of content blocks you can add." + } + ] + } + }, + { + "type": "todo_list", + "data": { + "checked": false, + "delta": [ + { + "insert": "Click " + }, + { + "insert": "+", + "attributes": { + "code": true + } + }, + { + "insert": " next to any page title or space name in the sidebar to add a new page/subpage." + } + ] + } + }, + { + "type": "paragraph", + "data": { + "delta": [] + } + }, + { + "type": "heading", + "data": { + "level": 3, + "delta": [ + { + "insert": "Quick Note" + } + ] + } + }, + { + "type": "callout", + "data": { + "bgColor": "0x0", + "icon": "📌", + "delta": [ + { + "insert": "Use Quick Note to save anything you want to remember—such as meeting notes, ideas, or to-dos." + } + ] + } + }, + { + "type": "paragraph", + "data": { + "delta": [] + } + }, + { + "type": "paragraph", + "data": { + "delta": [ + { + "insert": "CMD", + "attributes": { + "code": true + } + }, + { + "insert": " / " + }, + { + "insert": "CTRL", + "attributes": { + "code": true + } + }, + { + "insert": " + " + }, + { + "insert": "/", + "attributes": { + "code": true + } + }, + { + "insert": " to quickly add a quick note ✍️" + } + ] + } + }, + { + "type": "image", + "data": { + "image_type": 1, + "width": 553.7578125, + "align": "left", + "url": "https://beta.appflowy.cloud/api/file_storage/c29fafc4-b7c0-4549-8702-71339b0fd9ea/v1/blob/735c7c28%2D33a0%2D4e9f%2D92e6%2D089630656063/P5aRDW-HGm6vk4gjZg8w6jgD_z2yE402OuI1uutNN3A=.png" + } + }, + { + "type": "paragraph", + "data": { + "delta": [] + } + }, + { + "type": "paragraph", + "data": { + "delta": [ + { + "insert": "Drag the notepad to the desired location." + } + ] + } + }, + { + "type": "image", + "data": { + "url": "https://beta.appflowy.cloud/api/file_storage/c29fafc4-b7c0-4549-8702-71339b0fd9ea/v1/blob/735c7c28%2D33a0%2D4e9f%2D92e6%2D089630656063/TRYYtsRlWsmEYPSsIkpYs0uawhrtj3W52kg0VgwZ2J0=.png", + "align": "center", + "image_type": 1 + } + }, + { + "type": "paragraph", + "data": { + "delta": [] + } + }, + { + "type": "paragraph", + "data": { + "delta": [ + { + "insert": "Expand the notepad into a larger window to get more editing space." + } + ] + } + }, + { + "type": "image", + "data": { + "image_type": 1, + "url": "https://beta.appflowy.cloud/api/file_storage/c29fafc4-b7c0-4549-8702-71339b0fd9ea/v1/blob/735c7c28%2D33a0%2D4e9f%2D92e6%2D089630656063/JimDFWOY8_ATw20LkDuBg68TwkwtmSysbRbMd2eNjZ0=.png", + "align": "center" + } + }, + { + "type": "paragraph", + "data": { + "delta": [] + } + }, + { + "type": "heading", + "data": { + "level": 3, + "delta": [ + { + "insert": "Keyboard shortcuts, markdown, and code block" + } + ] + } + }, + { + "type": "numbered_list", + "data": { + "delta": [ + { + "insert": "Keyboard shortcuts " + }, + { + "insert": "guide", + "attributes": { + "href": "https://appflowy.gitbook.io/docs/essential-documentation/shortcuts" + } + } + ] + } + }, + { + "type": "numbered_list", + "data": { + "delta": [ + { + "insert": "Markdown " + }, + { + "insert": "reference", + "attributes": { + "href": "https://appflowy.gitbook.io/docs/essential-documentation/markdown" + } + } + ] + } + }, + { + "type": "numbered_list", + "data": { + "delta": [ + { + "insert": "Type " + }, + { + "insert": "/code", + "attributes": { + "code": true + } + }, + { + "insert": " or " + }, + { + "insert": "```", + "attributes": { + "code": true + } + }, + { + "insert": " to insert a code block (Mermaid" + }, + { + "insert": " is supported in our web app 🧜‍♀️)" + } + ] + } + }, + { + "type": "code", + "data": { + "language": "mermaid", + "delta": [ + { + "insert": "graph LR\n A[Square Rect] -- Link text --> B((Circle))\n A --> C(Round Rect)\n B --> D{Rhombus}\n C --> D" + } + ] + } + }, + { + "type": "paragraph", + "data": { + "delta": [] + } + }, + { + "type": "heading", + "data": { + "level": 2, + "delta": [ + { + "insert": "Have a question❓" + } + ] + } + }, + { + "type": "quote", + "data": { + "delta": [ + { + "insert": "Click " + }, + { + "insert": "?", + "attributes": { + "code": true + } + }, + { + "insert": " at the bottom right for help and support" + } + ] + } + } + ], + "data": { + "selected_icon": "{\"groupName\":\"Recent\",\"iconContent\":\"\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\",\"iconName\":\"ai-network-spark\",\"color\":\"0xFF808080\"}", + "image_type": "1" + } +} diff --git a/libs/workspace-template/src/document/getting_started.rs b/libs/workspace-template/src/document/getting_started.rs index c286d0956..e53dfe816 100644 --- a/libs/workspace-template/src/document/getting_started.rs +++ b/libs/workspace-template/src/document/getting_started.rs @@ -23,6 +23,7 @@ use crate::{gen_view_id, TemplateData, TemplateObjectId, WorkspaceTemplate}; // |-- Getting started (document) // |-- Desktop guide (document) // |-- Mobile guide (document) +// |-- Web guide (document) // |-- To-dos (board) // |-- Shared (space) // |-- ... (empty) @@ -99,6 +100,7 @@ impl GettingStartedTemplate { Ok(template_data) } + #[allow(clippy::too_many_arguments)] async fn create_document_and_database_data( &self, general_view_uuid: String, @@ -106,6 +108,7 @@ impl GettingStartedTemplate { getting_started_view_uuid: String, desktop_guide_view_uuid: String, mobile_guide_view_uuid: String, + web_guide_view_uuid: String, todos_view_uuid: String, ) -> anyhow::Result<( TemplateData, @@ -113,6 +116,7 @@ impl GettingStartedTemplate { TemplateData, TemplateData, TemplateData, + TemplateData, Vec, )> { let default_space_json = include_str!("../../assets/default_space.json"); @@ -135,6 +139,7 @@ impl GettingStartedTemplate { "mobile_guide_id".to_string(), mobile_guide_view_uuid.clone(), ); + replacements.insert("web_guide_id".to_string(), web_guide_view_uuid.clone()); replacements.insert("todos_id".to_string(), todos_view_uuid.clone()); replace_json_placeholders(&mut getting_started_json, &replacements); let getting_started_data = self @@ -154,6 +159,11 @@ impl GettingStartedTemplate { .create_document_from_json(mobile_guide_view_uuid.clone(), mobile_guide_json) .await?; + let web_guide_json = include_str!("../../assets/web_guide.json"); + let web_guide_data = self + .create_document_from_json(web_guide_view_uuid.clone(), web_guide_json) + .await?; + let todos_json = include_str!("../../assets/to-dos.json"); let database_data = serde_json::from_str::(todos_json)?; let database_view_id = database_data.views[0].id.clone(); @@ -169,6 +179,7 @@ impl GettingStartedTemplate { getting_started_data, desktop_guide_data, mobile_guide_data, + web_guide_data, todos_data, )) } @@ -179,6 +190,7 @@ impl GettingStartedTemplate { getting_started_view_uuid: String, desktop_guide_view_uuid: String, mobile_guide_view_uuid: String, + web_guide_view_uuid: String, ) -> ViewBuilder { // getting started view let mut view_builder = view_builder @@ -214,6 +226,19 @@ impl GettingStartedTemplate { }) .await; + view_builder = view_builder + .with_child_view_builder({ + |child_view_builder| async { + // web guide view + let web_guide_view_uuid = web_guide_view_uuid.clone(); + child_view_builder + .with_name("Web guide") + .with_view_id(web_guide_view_uuid) + .build() + } + }) + .await; + view_builder } } @@ -238,6 +263,7 @@ impl WorkspaceTemplate for GettingStartedTemplate { let getting_started_view_uuid = gen_view_id().to_string(); let desktop_guide_view_uuid = gen_view_id().to_string(); let mobile_guide_view_uuid = gen_view_id().to_string(); + let web_guide_view_uuid = gen_view_id().to_string(); let todos_view_uuid = gen_view_id().to_string(); let ( @@ -246,6 +272,7 @@ impl WorkspaceTemplate for GettingStartedTemplate { getting_started_data, desktop_guide_data, mobile_guide_data, + web_guide_data, todos_data, ) = self .create_document_and_database_data( @@ -254,6 +281,7 @@ impl WorkspaceTemplate for GettingStartedTemplate { getting_started_view_uuid.clone(), desktop_guide_view_uuid.clone(), mobile_guide_view_uuid.clone(), + web_guide_view_uuid.clone(), todos_view_uuid.clone(), ) .await?; @@ -277,7 +305,8 @@ impl WorkspaceTemplate for GettingStartedTemplate { let getting_started_view_uuid = getting_started_view_uuid.clone(); let desktop_guide_view_uuid = desktop_guide_view_uuid.clone(); let mobile_guide_view_uuid = mobile_guide_view_uuid.clone(); - let child_view_builder = self.build_getting_started_view(child_view_builder, getting_started_view_uuid, desktop_guide_view_uuid, mobile_guide_view_uuid).await; + let web_guide_view_uuid = web_guide_view_uuid.clone(); + let child_view_builder = self.build_getting_started_view(child_view_builder, getting_started_view_uuid, desktop_guide_view_uuid, mobile_guide_view_uuid, web_guide_view_uuid).await; child_view_builder.build() } ).await; @@ -319,6 +348,7 @@ impl WorkspaceTemplate for GettingStartedTemplate { getting_started_data, desktop_guide_data, mobile_guide_data, + web_guide_data, ]; template_data.extend(todos_data); Ok(template_data)