From 1ab32e44c0484c16e0f42f073cd6d33760f10e94 Mon Sep 17 00:00:00 2001 From: Elvis Mao Date: Wed, 7 Aug 2024 11:55:23 +0800 Subject: [PATCH 1/5] Chinese Config --- docusaurus.config.ts | 10 +- i18n/zh-Hant/code.json | 289 ++++++++++++++++++ .../current.json | 6 + .../docusaurus-theme-classic/footer.json | 6 + .../docusaurus-theme-classic/navbar.json | 14 + 5 files changed, 322 insertions(+), 3 deletions(-) create mode 100644 i18n/zh-Hant/code.json create mode 100644 i18n/zh-Hant/docusaurus-plugin-content-docs/current.json create mode 100644 i18n/zh-Hant/docusaurus-theme-classic/footer.json create mode 100644 i18n/zh-Hant/docusaurus-theme-classic/navbar.json diff --git a/docusaurus.config.ts b/docusaurus.config.ts index f537ac8..4017ccd 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -1,5 +1,5 @@ -import {themes as prismThemes} from 'prism-react-renderer'; -import type {Config} from '@docusaurus/types'; +import { themes as prismThemes } from 'prism-react-renderer'; +import type { Config } from '@docusaurus/types'; const config: Config = { title: 'Copper App SDK', @@ -18,7 +18,7 @@ const config: Config = { i18n: { defaultLocale: 'en', - locales: ['en'], + locales: ['en', 'zh-Hant'], }, themes: ['classic'], @@ -38,6 +38,10 @@ const config: Config = { navbar: { title: 'Copper App SDK', items: [ + { + type: 'localeDropdown', + position: 'right', + }, { label: 'Copper', href: 'https://copper.com', diff --git a/i18n/zh-Hant/code.json b/i18n/zh-Hant/code.json new file mode 100644 index 0000000..ed0b272 --- /dev/null +++ b/i18n/zh-Hant/code.json @@ -0,0 +1,289 @@ +{ + "theme.ErrorPageContent.title": { + "message": "此頁已當機。", + "description": "The title of the fallback page when the page crashed" + }, + "theme.blog.archive.title": { + "message": "歷史文章", + "description": "The page & hero title of the blog archive page" + }, + "theme.blog.archive.description": { + "message": "歷史文章", + "description": "The page & hero description of the blog archive page" + }, + "theme.BackToTopButton.buttonAriaLabel": { + "message": "回到頂部", + "description": "The ARIA label for the back to top button" + }, + "theme.blog.paginator.navAriaLabel": { + "message": "部落格文章列表分頁導覽", + "description": "The ARIA label for the blog pagination" + }, + "theme.blog.paginator.newerEntries": { + "message": "較新的文章", + "description": "The label used to navigate to the newer blog posts page (previous page)" + }, + "theme.blog.paginator.olderEntries": { + "message": "較舊的文章", + "description": "The label used to navigate to the older blog posts page (next page)" + }, + "theme.blog.post.paginator.navAriaLabel": { + "message": "部落格文章分頁導覽", + "description": "The ARIA label for the blog posts pagination" + }, + "theme.blog.post.paginator.newerPost": { + "message": "較新一篇", + "description": "The blog post button label to navigate to the newer/previous post" + }, + "theme.blog.post.paginator.olderPost": { + "message": "較舊一篇", + "description": "The blog post button label to navigate to the older/next post" + }, + "theme.blog.post.plurals": { + "message": "{count} 篇文章", + "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.tagTitle": { + "message": "{nPosts} 含有標籤「{tagName}」", + "description": "The title of the page for a blog tag" + }, + "theme.tags.tagsPageLink": { + "message": "檢視所有標籤", + "description": "The label of the link targeting the tag list page" + }, + "theme.colorToggle.ariaLabel": { + "message": "切換淺色/暗黑模式(當前為{mode})", + "description": "The ARIA label for the navbar color mode toggle" + }, + "theme.colorToggle.ariaLabel.mode.dark": { + "message": "暗黑模式", + "description": "The name for the dark color mode" + }, + "theme.colorToggle.ariaLabel.mode.light": { + "message": "淺色模式", + "description": "The name for the light color mode" + }, + "theme.docs.breadcrumbs.navAriaLabel": { + "message": "頁面路徑", + "description": "The ARIA label for the breadcrumbs" + }, + "theme.docs.DocCard.categoryDescription.plurals": { + "message": "{count} 個項目", + "description": "The default description for a category card in the generated index about how many items this category includes" + }, + "theme.docs.paginator.navAriaLabel": { + "message": "文件選項卡", + "description": "The ARIA label for the docs pagination" + }, + "theme.docs.paginator.previous": { + "message": "上一頁", + "description": "The label used to navigate to the previous doc" + }, + "theme.docs.paginator.next": { + "message": "下一頁", + "description": "The label used to navigate to the next doc" + }, + "theme.docs.tagDocListPageTitle.nDocsTagged": { + "message": "{count} 篇文件帶有標籤", + "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.tagDocListPageTitle": { + "message": "{nDocsTagged}「{tagName}」", + "description": "The title of the page for a docs tag" + }, + "theme.docs.versionBadge.label": { + "message": "版本:{versionLabel}" + }, + "theme.docs.versions.unreleasedVersionLabel": { + "message": "此為 {siteTitle} {versionLabel} 版尚未發行的文件。", + "description": "The label used to tell the user that he's browsing an unreleased doc version" + }, + "theme.docs.versions.unmaintainedVersionLabel": { + "message": "此為 {siteTitle} {versionLabel} 版的文件,現已不再積極維護。", + "description": "The label used to tell the user that he's browsing an unmaintained doc version" + }, + "theme.docs.versions.latestVersionSuggestionLabel": { + "message": "最新的文件請參閱 {latestVersionLink} ({versionLabel})。", + "description": "The label used to tell the user to check the latest version" + }, + "theme.docs.versions.latestVersionLinkLabel": { + "message": "最新版本", + "description": "The label used for the latest version suggestion link label" + }, + "theme.common.editThisPage": { + "message": "編輯此頁", + "description": "The link label to edit the current page" + }, + "theme.common.headingLinkTitle": { + "message": "{heading}的直接連結", + "description": "Title for link to heading" + }, + "theme.lastUpdated.atDate": { + "message": "於 {date} ", + "description": "The words used to describe on which date a page has been last updated" + }, + "theme.lastUpdated.byUser": { + "message": "由 {user} ", + "description": "The words used to describe by who the page has been last updated" + }, + "theme.lastUpdated.lastUpdatedAtBy": { + "message": "最後{byUser}{atDate}更新", + "description": "The sentence used to display when a page has been last updated, and by who" + }, + "theme.NotFound.title": { + "message": "找不到頁面", + "description": "The title of the 404 page" + }, + "theme.navbar.mobileVersionsDropdown.label": { + "message": "選擇版本", + "description": "The label for the navbar versions dropdown on mobile view" + }, + "theme.tags.tagsListLabel": { + "message": "標籤:", + "description": "The label alongside a tag list" + }, + "theme.admonition.caution": { + "message": "警告", + "description": "The default label used for the Caution admonition (:::caution)" + }, + "theme.admonition.danger": { + "message": "危險", + "description": "The default label used for the Danger admonition (:::danger)" + }, + "theme.admonition.info": { + "message": "信息", + "description": "The default label used for the Info admonition (:::info)" + }, + "theme.admonition.note": { + "message": "備註", + "description": "The default label used for the Note admonition (:::note)" + }, + "theme.admonition.tip": { + "message": "提示", + "description": "The default label used for the Tip admonition (:::tip)" + }, + "theme.admonition.warning": { + "message": "warning", + "description": "The default label used for the Warning admonition (:::warning)" + }, + "theme.AnnouncementBar.closeButtonAriaLabel": { + "message": "關閉", + "description": "The ARIA label for close button of announcement bar" + }, + "theme.blog.sidebar.navAriaLabel": { + "message": "最近部落格文章導覽", + "description": "The ARIA label for recent posts in the blog sidebar" + }, + "theme.CodeBlock.copied": { + "message": "複製成功", + "description": "The copied button label on code blocks" + }, + "theme.CodeBlock.copyButtonAriaLabel": { + "message": "複製代碼至剪貼簿", + "description": "The ARIA label for copy code blocks button" + }, + "theme.CodeBlock.copy": { + "message": "複製", + "description": "The copy button label on code blocks" + }, + "theme.CodeBlock.wordWrapToggle": { + "message": "切換自動換行", + "description": "The title attribute for toggle word wrapping button of code block lines" + }, + "theme.DocSidebarItem.expandCategoryAriaLabel": { + "message": "Expand sidebar category '{label}'", + "description": "The ARIA label to expand the sidebar category" + }, + "theme.DocSidebarItem.collapseCategoryAriaLabel": { + "message": "Collapse sidebar category '{label}'", + "description": "The ARIA label to collapse the sidebar category" + }, + "theme.NavBar.navAriaLabel": { + "message": "主導航", + "description": "The ARIA label for the main navigation" + }, + "theme.NotFound.p1": { + "message": "我們沒有您要找的頁面。", + "description": "The first paragraph of the 404 page" + }, + "theme.NotFound.p2": { + "message": "請聯絡原始連結來源網站的所有者,並通知他們連結已毀損。", + "description": "The 2nd paragraph of the 404 page" + }, + "theme.navbar.mobileLanguageDropdown.label": { + "message": "選擇語言", + "description": "The label for the mobile language switcher dropdown" + }, + "theme.TOCCollapsible.toggleButtonLabel": { + "message": "本頁導覽", + "description": "The label used by the button on the collapsible TOC component" + }, + "theme.blog.post.readMore": { + "message": "閱讀更多", + "description": "The label used in blog post item excerpts to link to full blog posts" + }, + "theme.blog.post.readMoreLabel": { + "message": "閱讀 {title} 全文", + "description": "The ARIA label for the link to full blog posts from excerpts" + }, + "theme.blog.post.readingTime.plurals": { + "message": "閱讀時間約 {readingTime} 分鐘", + "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.breadcrumbs.home": { + "message": "主頁面", + "description": "The ARIA label for the home page in the breadcrumbs" + }, + "theme.docs.sidebar.collapseButtonTitle": { + "message": "收起側邊欄", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.collapseButtonAriaLabel": { + "message": "收起側邊欄", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.navAriaLabel": { + "message": "文件側邊欄", + "description": "The ARIA label for the sidebar navigation" + }, + "theme.docs.sidebar.closeSidebarButtonAriaLabel": { + "message": "Close navigation bar", + "description": "The ARIA label for close button of mobile sidebar" + }, + "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { + "message": "← 回到主選單", + "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" + }, + "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { + "message": "Toggle navigation bar", + "description": "The ARIA label for hamburger menu button of mobile navigation" + }, + "theme.docs.sidebar.expandButtonTitle": { + "message": "展開側邊欄", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.docs.sidebar.expandButtonAriaLabel": { + "message": "展開側邊欄", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.ErrorPageContent.tryAgain": { + "message": "重試", + "description": "The label of the button to try again rendering when the React error boundary captures an error" + }, + "theme.common.skipToMainContent": { + "message": "跳至主要内容", + "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" + }, + "theme.tags.tagsPageTitle": { + "message": "標籤", + "description": "The title of the tag list page" + }, + "theme.unlistedContent.title": { + "message": "未列出頁", + "description": "The unlisted content banner title" + }, + "theme.unlistedContent.message": { + "message": "此頁面未列出。搜索引擎不會對其索引,只有擁有直接連結的用戶才能訪問。", + "description": "The unlisted content banner message" + } +} diff --git a/i18n/zh-Hant/docusaurus-plugin-content-docs/current.json b/i18n/zh-Hant/docusaurus-plugin-content-docs/current.json new file mode 100644 index 0000000..59e3047 --- /dev/null +++ b/i18n/zh-Hant/docusaurus-plugin-content-docs/current.json @@ -0,0 +1,6 @@ +{ + "version.label": { + "message": "當前", + "description": "The label for version current" + } +} diff --git a/i18n/zh-Hant/docusaurus-theme-classic/footer.json b/i18n/zh-Hant/docusaurus-theme-classic/footer.json new file mode 100644 index 0000000..6275d4a --- /dev/null +++ b/i18n/zh-Hant/docusaurus-theme-classic/footer.json @@ -0,0 +1,6 @@ +{ + "copyright": { + "message": "Copyright © 2024 Copper CRM", + "description": "The footer copyright" + } +} diff --git a/i18n/zh-Hant/docusaurus-theme-classic/navbar.json b/i18n/zh-Hant/docusaurus-theme-classic/navbar.json new file mode 100644 index 0000000..a0126ed --- /dev/null +++ b/i18n/zh-Hant/docusaurus-theme-classic/navbar.json @@ -0,0 +1,14 @@ +{ + "title": { + "message": "Copper App SDK", + "description": "The title in the navbar" + }, + "item.label.Copper": { + "message": "Copper", + "description": "Navbar item with label Copper" + }, + "item.label.GitHub": { + "message": "GitHub", + "description": "Navbar item with label GitHub" + } +} From 563bfa0fd61edb4ce4f4e0431dde3c83ce8808ba Mon Sep 17 00:00:00 2001 From: Elvis Mao Date: Wed, 7 Aug 2024 12:02:15 +0800 Subject: [PATCH 2/5] Chinese translation --- .../current/configuration.md | 63 ++++++++++++++++++ .../current/images/embedded-app-setting.png | Bin 0 -> 15999 bytes .../current/quickstart.md | 43 ++++++++++++ .../current/sidebars.ts | 24 +++++++ 4 files changed, 130 insertions(+) create mode 100644 i18n/zh-Hant/docusaurus-plugin-content-docs/current/configuration.md create mode 100644 i18n/zh-Hant/docusaurus-plugin-content-docs/current/images/embedded-app-setting.png create mode 100644 i18n/zh-Hant/docusaurus-plugin-content-docs/current/quickstart.md create mode 100644 i18n/zh-Hant/docusaurus-plugin-content-docs/current/sidebars.ts diff --git a/i18n/zh-Hant/docusaurus-plugin-content-docs/current/configuration.md b/i18n/zh-Hant/docusaurus-plugin-content-docs/current/configuration.md new file mode 100644 index 0000000..4e0c32d --- /dev/null +++ b/i18n/zh-Hant/docusaurus-plugin-content-docs/current/configuration.md @@ -0,0 +1,63 @@ +# 配置 + +如何配置嵌入式應用: +1. 添加至 +2. 位置 +3. 可選的進階配置 + +![嵌入式應用設定](./images/embedded-app-setting.png) + +## 支援的實體 +Copper 支援 5 種實體,使用者可以在這些實體中添加嵌入式應用: +1. 潛在客戶 +2. 人員 +3. 公司 +4. 銷售管道記錄 +5. 專案 + +## 支援的位置 +Copper 支援 5 種位置,使用者可以在這些位置查看嵌入式應用: +1. 側邊欄 +2. 活動面板 +3. 操作列 +4. 個人資料 +5. 左側導航 + +## 可選的進階配置 +### html5Mode +典型嵌入式應用的 URL 會是: +``` +https://your-url.com/?location=sidebar&origin=...&instanceId=... +``` + +如果使用者指定 `html5Mode: true`,URL 將變為: +``` +https://your-url.com/sidebar?origin=...&instanceId=... +``` + +### refreshOnContextUpdate +默認情況下,在 Copper 應用中切換到新路由時,會向嵌入式應用發送事件。使用者現在可以使用以下代碼: +```javascript +sdk.on('contextUpdated', function () { + // 這裡是處理事件的代碼 +}) +``` +除了處理事件外,使用者還可以通過將可選的進階配置設置為 `refreshOnContextUpdate: true` 來刷新嵌入式應用。每次應用變更路由/上下文時,嵌入式應用將會刷新。 + +### voip +通過設置可選的進階配置:`voip: true`,Copper 中的所有電話號碼現在變為可點擊。當使用者點擊電話號碼時,他們將能夠訂閱一個名為 `phoneNumberClicked` 的事件。 +```javascript +sdk.on('phoneNumberClicked', function ({ number }) { + // 對電話號碼進行處理 +}) +``` + +### allowHttp +默認情況下,Copper 不允許在嵌入式應用中使用 http URL。然而,設置可選的進階配置 `allowHttp: true` 將允許使用者將 http URL 嵌入到嵌入式應用中。 + +如果瀏覽器仍然阻止使用者查看 http URL,可以按照以下步驟解除阻擋: +1. 點擊瀏覽器地址欄右側的小圖標 +2. 點擊「允許運行不安全的腳本」 + +### verifyServer +這允許使用者驗證他們的父幀實際上是 Copper。請參見更多細節:[安全範例](examples#安全範例)。 \ No newline at end of file diff --git a/i18n/zh-Hant/docusaurus-plugin-content-docs/current/images/embedded-app-setting.png b/i18n/zh-Hant/docusaurus-plugin-content-docs/current/images/embedded-app-setting.png new file mode 100644 index 0000000000000000000000000000000000000000..c3e509a57c2646058b5a182489f1652bb83b3110 GIT binary patch literal 15999 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 { + // do something with the context + }); +``` + +## 使用 CDN +`copper-sdk` 部屬於 https://www.jsdelivr.com/package/npm/copper-sdk + +```html + + +``` diff --git a/i18n/zh-Hant/docusaurus-plugin-content-docs/current/sidebars.ts b/i18n/zh-Hant/docusaurus-plugin-content-docs/current/sidebars.ts new file mode 100644 index 0000000..0a0b578 --- /dev/null +++ b/i18n/zh-Hant/docusaurus-plugin-content-docs/current/sidebars.ts @@ -0,0 +1,24 @@ +import type { SidebarsConfig } from '@docusaurus/plugin-content-docs'; + +const sidebars: SidebarsConfig = { + mainSidebar: [ + { + type: 'doc', + id: '快速入門', + }, + { + type: 'doc', + id: '函式', + }, + { + type: 'doc', + id: '設定', + }, + { + type: 'doc', + id: '範例', + }, + ], +}; + +export default sidebars; From e06bcc87b0bdb25a593158932606c0c0a4c14836 Mon Sep 17 00:00:00 2001 From: Elvis Mao Date: Wed, 7 Aug 2024 12:03:36 +0800 Subject: [PATCH 3/5] Chiense translation --- .../current/examples.md | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 i18n/zh-Hant/docusaurus-plugin-content-docs/current/examples.md diff --git a/i18n/zh-Hant/docusaurus-plugin-content-docs/current/examples.md b/i18n/zh-Hant/docusaurus-plugin-content-docs/current/examples.md new file mode 100644 index 0000000..ff7eba1 --- /dev/null +++ b/i18n/zh-Hant/docusaurus-plugin-content-docs/current/examples.md @@ -0,0 +1,92 @@ +# 範例 +## 基本範例 +這個範例的 JavaScript 網頁應用程式代碼可以在 `examples/basic_iframe` 找到。這個範例不需要後端伺服器,開發時使用的是 webpacker 伺服器。 + +### 快速開始 +#### 啟動 webpack 開發伺服器 +```bash +yarn start +# 或 +npm start +``` +伺服器啟動後,使用瀏覽器訪問 https://localhost:8080 並信任 SSL 憑證。 + +#### 添加嵌入式應用(Copper 網頁應用) +從 Copper 的網頁管理頁面,導航到 `設定 > 整合`,向下滾動到頁面底部,使用者將會看到一個「建立嵌入式應用」的卡片。選擇「建立嵌入式應用」卡片並填入以下信息,然後點擊「儲存」。 + +* 名稱:插入這個嵌入式應用的名稱 +* URL:`https://localhost:8080` +* 添加至:選擇潛在客戶 +* 位置:選擇側邊欄 + +要查看上面創建的嵌入式應用,導航到潛在客戶記錄的相關標籤。 + +### 開發 +這個基本範例的源代碼包含在 src 文件夾中的 index.html 和 app.js,使用者可以在項目中更改和添加更多文件。 + +#### 初始化 SDK +```javascript +import Copper from 'copper-sdk' +const sdk = Copper.init() +``` + +#### 使用 SDK +getContext() API 範例: +```javascript +const context = await sdk.getContext() +``` + +## 安全範例 +這個範例更注重安全性。代碼可以在 `examples/secure_iframe` 找到。這個嵌入式應用會首先向 iframe URL 發送一個包含 JSON Web Token (JWT) 的 POST 請求。嵌入式應用應首先從 Copper 獲取公鑰,並使用該公鑰來驗證 JSON Web Token。 + +### 快速開始 +安全範例使用基於 express 的伺服器端和 webpacker 客戶端。 +#### 啟動伺服器和客戶端 +```bash +yarn dev +``` +可選地,伺服器和客戶端可以分開啟動: +#### 啟動伺服器 +```bash +yarn server +``` +#### 啟動客戶端 webpack 開發伺服器 +```bash +yarn client +``` + +#### 添加嵌入式應用(Copper 網頁應用) +從 Copper 的網頁管理頁面,導航到 `設定 > 整合`,向下滾動到頁面底部,使用者將會看到一個「建立嵌入式應用」的卡片。選擇「建立嵌入式應用」卡片並填入以下信息,然後點擊「儲存」。 + +* 名稱:插入這個嵌入式應用的名稱 +* URL:`https://localhost:8080` +* 添加至:選擇潛在客戶 +* 位置:選擇側邊欄 +* 可選的進階配置:`{"verifyServer": true}` + +要查看上面創建的嵌入式應用,導航到潛在客戶記錄的相關標籤。 + +### 開發 +當嵌入式應用配置為安全模式時,它將首先接收帶有 JWT 的 POST 請求。JWT 使用 Copper 的私鑰進行加密。必須首先獲取 Copper 的公鑰以驗證 JWT。 +#### 獲取 Copper 的公鑰 +```javascript + const { data } = await axios({ + method: 'get', + url: 'https://api.copper.com/developer_api/v1/embedded_apps/public_key', + }); +``` +接下來,使用公鑰在 POST 處理程序中驗證 JWT。 +```javascript +app.post('/*', async function(req, res) { + const token = req.body.jwt; + jwt.verify(token, publicKey, { algorithm: ['RS256'] }, function(err, payload) { + if (err) { + // JWT 無效,不允許進一步訪問 + res.send('error'); + } else { + // JWT 有效,渲染頁面 + } + }); +}); +``` +你的伺服器端應該僅在 JWT 令牌有效時允許訪問。 \ No newline at end of file From df677cab62c7890dcaef47b8e40d0f46f15b8eda Mon Sep 17 00:00:00 2001 From: Elvis Mao Date: Wed, 7 Aug 2024 12:06:09 +0800 Subject: [PATCH 4/5] Chinese translation --- .../current/reference.md | 163 ++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 i18n/zh-Hant/docusaurus-plugin-content-docs/current/reference.md diff --git a/i18n/zh-Hant/docusaurus-plugin-content-docs/current/reference.md b/i18n/zh-Hant/docusaurus-plugin-content-docs/current/reference.md new file mode 100644 index 0000000..82b5739 --- /dev/null +++ b/i18n/zh-Hant/docusaurus-plugin-content-docs/current/reference.md @@ -0,0 +1,163 @@ +# 函式 + +## 初始化 +`Copper.init()` 方法用於初始化和設置 SDK。所有其他 SDK 方法必須在此之後調用。 +```javascript +Copper.init() +``` + +## getContext() +`getContext()` 方法返回當前 Copper 頁面的上下文。 +```javascript +getContext() +``` + +#### 返回 +| 類型 | 描述 | +| ------ | ------------------------ | +| 物件 | 當前上下文物件 | + +## saveContext() +`save()` 方法會將值儲存到伺服器並更新 Copper UI。 + +#### 範例 +```javascript +const context = await sdk.getContext(); +context.name = "Joe" +context.save() +``` + +## showModal() +`showModal()` 方法將在 Copper 的網頁中打開模態窗口。模態窗口的 URL 設為嵌入式應用的 URL 加上 `?location=modal`。例如,如果嵌入式應用的 URL 為 `https://www.example.com`,則模態窗口的 URL 為 `https://www.example.com?location=modal`。 + +#### 參數 +| 名稱 | 類型 | 必填 | 描述 | +| ---- | ------ | ------ | ---------------------------------------- | +| Data | 物件 | 否 | 將作為參數傳遞給模態窗口的數據 | + +#### 特殊參數 +`showModal({ width: 300, height: 400, displayHeader: true })` + +| 名稱 | 類型 | 必填 | 描述 | +| ------------- | ------- | ------ | ----------------------------------- | +| width | 整數 | 否 | 模態窗口的寬度 | +| height | 整數 | 否 | 模態窗口的高度 | +| displayHeader | 布林值 | 否 | 是否顯示標題 | + +#### 範例 +```javascript +sdk.showModal({ foo: 'bar'}) +``` + +## closeModal() +`closeModal()` 方法將關閉當前活躍的模態窗口。 + +#### 範例 +```javascript +sdk.closeModal() +``` + +## setAppUI() +`setAppUI()` 方法將更改父 Copper 網頁的 UI。 + +#### 參數 +| 名稱 | 類型 | 必填 | 描述 | +| ----------------- | ------ | ------ | ------------------------------------------------------------------------------------------------------ | +| Data | 物件 | 是 | 數據使用 JSON 格式。目前支持 JSON 中的六個鍵:
"count", "height", "width", "disableAddButton", "showActionBar", "isActionBarActive". | + +#### 範例 +```javascript +sdk.setAppUI({ + count: 5, // 更改應用標頭中的計數器值 + width: 500, // 更改 iframe 寬度(目前支持於模態窗口/操作欄) + height: 500, // 更改 iframe 高度 + disableAddButton: true, // 禁用 iframe 上方父框架中的添加按鈕 + showActionBar: true, // 顯示嵌入式應用 iframe 的操作欄 + isActionBarActive: true, // 高亮顯示操作欄圖標 + allowModals: false, // 為 true 時,允許 iframe 中的模態窗口 +}) +``` + +## publishMessage() +`publishMessage(type, target, data)` 方法將消息發布到同一嵌入式應用的其他位置。 + +#### 參數 +| 名稱 | 類型 | 必填 | 描述 | +| ------ | ------ | ------ | ---------------------------------------------------------------------------------------------------- | +| Type | 字串 | 是 | 消息的類型,可以是任何字串 | +| Target | 字串 | 是 | 消息接收者的位置。目前支持的地點包括:
"sidebar", "activity_panel", "action_bar", "profile", "modal".
"*" 代表所有位置,除了發送者。 | +| Data | JSON | 是 | 要發送的消息內容 | + +#### 範例 +```javascript +sdk.publishMessage('myMessageType', 'sidebar', {foo: 'bar'}) +``` + +## on() +`on(type, cb)` 方法訂閱消息類型並使用回調函數 `cb` 處理。 + +#### 參數 +| 名稱 | 類型 | 必填 | 描述 | +| ---- | -------- | ------ | -------------------------------- | +| Type | 字串 | 是 | 要訂閱的消息類型 | +| cb | 函數 | 是 | 用於處理消息的回調函數 | + +#### 事件 +| 事件名稱 | 觸發時機 | +| ------------------ | ------------------------------------- | +| addButtonClicked | 當應用在側邊欄中並且 + 按鈕被點擊時 | +| phoneNumberClicked | 當 VOIP 配置開啟且點擊電話號碼時 | +| contextUpdated | 當 Copper 應用的路由發生變更時 | +| recordSelected | 當列表視圖中選擇任何項目時 | + +#### 範例 +```javascript +sdk.on('myMessageType', (msg) => { + console.log(msg) +}) +``` + +## api() +`api(url, options)` 方法將代理來自 Copper API 伺服器 `api.copper.com` 的 API 呼叫。 + +#### 參數 +| 名稱 | 類型 | 必填 | 描述 | +| ------- | ------ | ------ | -------------------------------------------------------------------------------------------------------------------------------------------- | +| url | 字串 | 是 | API 的 URL。例如:'/v1/people/1' | +| Options | 物件 | 是 | API 呼叫的選項。支持兩個鍵 'method' 和 'body',其中 'method' 的值可以是
'GET', 'POST', 'PUT', 'PATCH' 和 'DELETE'。'body' 的值是發送到 API 端點的數據。 | + +#### 範例 +```javascript +sdk.api('/v1/leads/', { + method: 'POST', + body: JSON.stringify({ + name: 'lead name' + }) +}) +``` +所有開發者 API URL 都受支持。每個 API 端點的請求方法和數據格式可以在 Copper 的 API 文檔中找到。 + +## refreshUI() +`refreshUI(target)` 方法將刷新目標的 UI 部分。主要在上述 `api(url, options)` 呼叫後使用,以更新 UI 以反映伺服器中數據的變更。 + +#### 參數 +| 名稱 | 類型 | 必填 | 描述 | +| ------ | ------ | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Target | 物件 | 是 | 參數的格式為 `{ name: targetName, data: data }`,其中 targetName 可以是 'ActivityLog' 或 'Related'。'ActivityLog' 的數據不是必需的。對於 'Related',數據格式為 `{ type: entityType }`。 | + +#### 範例 +```javascript +sdk.refreshUI({ name: 'ActivityLog'}) +sdk.refreshUI({ name: 'Related', data: { type: 'lead'}}) +``` + +## logActivity() +`logActivity(type, details)` 方法在 Copper 網頁應用中創建活動日誌。 + +#### 參數 +| 名稱 | 類型 | 必填 | 描述 | +| ------- | ------ | ------ | ---------------------------- | +| Type | 字串 | 是 | 活動日誌的類型 | +| Details | 物件 | 是 | 活動日誌的詳細數據 | + +請參閱 Copper 的開發者 API 文檔,以獲取活動類型和詳細信息。 \ No newline at end of file From 0929eb66e86643a34d151ecb096a422585e57922 Mon Sep 17 00:00:00 2001 From: Elvis Mao Date: Wed, 7 Aug 2024 12:20:58 +0800 Subject: [PATCH 5/5] Chinese translation --- .../current/reference.md | 149 +++++++++++++++++- 1 file changed, 148 insertions(+), 1 deletion(-) diff --git a/i18n/zh-Hant/docusaurus-plugin-content-docs/current/reference.md b/i18n/zh-Hant/docusaurus-plugin-content-docs/current/reference.md index 82b5739..1a9f49e 100644 --- a/i18n/zh-Hant/docusaurus-plugin-content-docs/current/reference.md +++ b/i18n/zh-Hant/docusaurus-plugin-content-docs/current/reference.md @@ -160,4 +160,151 @@ sdk.refreshUI({ name: 'Related', data: { type: 'lead'}}) | Type | 字串 | 是 | 活動日誌的類型 | | Details | 物件 | 是 | 活動日誌的詳細數據 | -請參閱 Copper 的開發者 API 文檔,以獲取活動類型和詳細信息。 \ No newline at end of file +請參閱 Copper 的開發者 API 文檔,以獲取活動類型和詳細信息。 + +#### 範例 +```javascript +const activityType = 0; // 活動類型 'note' +const details = '這是一條備註'; +sdk.logActivity(activityType, details); +``` + +## createEntity() +`createEntity(entityType, entityData)` 方法在 Copper 網頁應用中創建一個實體。 + +#### 參數 + +| 名稱 | 類型 | 必填 | 描述 | +| ---------- | ------ | ------ | ------------------------------------------------------------------------------------ | +| EntityType | 字串 | 是 | 實體類型。支持的值有:'lead', 'person', 'company', 'opportunity', 'project', 'task' | +| entityData | 物件 | 是 | 實體數據。 | + +請參閱 Copper 的開發者 API 文檔以獲取實體詳細信息。 + +#### 範例 +```javascript +const entityType = 'lead'; +const entityData = { + name: '我的潛在客戶', + email: { + email: 'mylead@noemail.com', + category: 'work' + }, + phone_numbers: [ + { + number: '1234567', + category: 'mobile' + } + ] +}; +sdk.createEntity(entityType, entityData); +``` + +## relateEntity() +`relateEntity(entityType, entityId, target)` 方法將兩個實體在 Copper 網頁應用中關聯起來。 + +#### 參數 +| 名稱 | 類型 | 必填 | 描述 | +| ---------- | ------- | ------ | ------------------------------------------------------------------------------------ | +| entityType | 字串 | 是 | 實體類型。支持的值有:'lead', 'person', 'company', 'opportunity', 'project', 'task' | +| entityId | 整數 | 是 | 實體記錄的 ID | +| Target | 物件 | 是 | 目標實體。格式為 `{ id: id, type: entityType }` | + +請參閱 Copper 的開發者 API 文檔以獲取實體詳細信息。 + +#### 範例 +```javascript +const entityType = 'task'; +const entityId = 1; +const target = { + id: 10, + type: 'opportunity' +}; +sdk.relateEntity(entityType, entityId, target); // 將機會 10 關聯到任務 1 +``` + +## navigateToEntityDetail() +此方法允許嵌入式應用導航到特定實體記錄的頁面。 + +#### 參數 +| 名稱 | 類型 | 必填 | 描述 | +| ---------- | ------- | ------ | ------------------------------------------------------------------------------------ | +| entityType | 字串 | 是 | 實體類型。支持的值有:'lead', 'person', 'company', 'opportunity', 'project', 'task' | +| entityId | 整數 | 是 | 實體記錄的 ID | + +請參閱 Copper 的開發者 API 文檔以獲取實體詳細信息。 + +#### 範例 +```javascript +const entityType = 'task'; +const entityId = 1; +sdk.navigateToEntityDetail(entityType, entityId); // 導航到 ID 為 1 的任務 +``` + +## getSelectedRecords() +通過 `pageNumber` 和 `pageSize` 獲取選中的記錄。 + +#### 參數 +| 名稱 | 類型 | 必填 | 描述 | +| ---------- | ------- | ------ | ------------------------------------------------------------------------------------ | +| pageNumber | 整數 | 否 | 頁碼 | +| pageSize | 整數 | 否 | 頁面大小 | + +#### 範例 +```javascript +await sdk.getSelectedRecords({ pageNumber: 0, pageSize: 100 }); +// 返回 +[ + { + "id": 165837, + "first_name": "Jason", + "last_name": "Mraz", + "middle_name": null, + ... + } +] +``` + +## getUserInfo() +獲取當前用戶信息。 + +返回的響應將包含用戶所擁有的角色列表。Copper 目前支持三種角色: + +* `user`: 用戶可以正常使用系統。 +* `admin`: 用戶可以執行管理操作。 +* `account_owner`: 用戶是帳戶擁有者。 + +#### 範例 +```javascript +await sdk.getUserInfo(); +// 返回 +{ + "account": { + "id": 1, + "name": "Google" + }, + "user": { + "email": "larry@google.com", + "id": 1, + "name": "Larry Page", + "roles": ["user", "admin"] + } +} +``` + +## getConfig() +獲取當前應用和安裝配置。 + +#### 範例 +```javascript +await sdk.getConfig(); +// 返回 +{ + "appConfig": { + "height": 600 + }, + "config": { // 這是安裝配置 + "token": "my_token" + } +} +``` \ No newline at end of file